assembly - 使: Circular dependency dropped

标签 assembly makefile yasm

我已经在 stackoverflow 和其他 make 手册、网站上搜索了很长时间,但找不到任何尾随空格或错过 make 函数的用法。你能帮我解决这个警告消息吗?

make: Circular main.asm.o <- main.asm dependency dropped.

生成文件:

AS:=yasm
CC:=gcc
OUTPUTDIR:=$(shell pwd)/bin
ASFLAGS:=-g dwarf2 -f elf64 -a x86
CFLAGS:=-g

SOURCES=$(wildcard *.asm)
OBJECTS=$(patsubst %.asm,%.o,$(SOURCES))

%.o: $(SOURCES)
    $(AS) $(ASFLAGS) -o $(OUTPUTDIR)/$(OBJECTS) $<

all: $(OBJECTS)
    $(CC) $(CFLAGS) -o httpd $(OUTPUTDIR)/$(OBJECTS)

clean:
    rm $(OUTPUTDIR)/*
    rm httpd

main.asm:

section .text
  global main
  extern exit

main:
  mov rdi, 1
    call exit   

谢谢你:)

最佳答案

您的错误是这一行:

%.o: $(SOURCES)

大概会扩展为类似的内容

%.o: main.asm foo.asm bar.asm

这意味着非常类似于

main.asm.o: main.asm
foo.asm.o: foo.asm
bar.asm.o: bar.asm
    ....

这是“大约”,因为您在这里混淆了语法。

您将普通规则 (target: source) 与通配符规则 (%.target: %.source) 混淆了。您可能想要的是

%.o: %.asm
    $(AS) $(ASFLAGS) -o $@ $<

它教Make如何从.asm文件创建.o文件,并结合

httpd: $(SOURCES:.asm=.o)
    $(CC) $(CFLAGS) -o httpd $*

它告诉 Make 如何将各种 .o 文件组合到 httpd 可执行文件中。 $(SOURCES:.asm=.o) 变量引用扩展为 .o 文件列表作为依赖项,Make 现在知道如何创建这些 。 o 文件来自相应的 .asm 文件。

额外观察:

  1. 如果不明显,$(SOURCES:.asm=.o) 所做的就是扩展为 $(SOURCES) 的值,但尾随.asm 替换为 .o
  2. 我个人会对此 Makefile 执行的操作是用显式文件列表替换 SOURCES 定义中的通配符。这样,如果您将 my-temp-test.asm 文件添加到目录中,就不会得到意外结果。 (这属于“我怎样才能对 future 的我好?”的标题)

关于assembly - 使: Circular dependency dropped,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24904906/

相关文章:

assembly - 如何使用 GDB 调试 jonesforth?

有人可以帮助理解这段汇编代码以尝试逆向工程吗?

arrays - 内存中表示的未定义 vector 元素是什么?

assembly - 写入没有段寄存器的地址

makefile - make 运行所有目标

c - 使用 makefile 避免不必要的重新编译

c - 如何在 makefile 中使用 POSIX 消息队列名称

linux - 汇编:为什么跳转到通过 ret 返回的标签会导致段错误?

assembly - 如何在Linux上从c源代码生成nasm可编译的汇编代码?

assembly - 标记的平均字节数