我想从 64 位主机组装和链接一些 32 位目标的代码,我正在尝试尽可能多地使用 make
的隐式规则。
如果我-m32
放入ASFLAGS
它就可以一步到位地进行链接和组装,因为make
会为此使用gcc
。但是,如果我的一个可执行文件需要单独的链接,一切都会中断,因为make
将使用as
进行组装,而as
不理解-m32
。为了解决这个问题,我可以改用--32
,但这当然不适用于gcc
。
$ cat Makefile
ASFLAGS = -m32
all: prog1 prog2
prog2: prog2.o
$ make
cc -m32 prog1.s -o prog1
as -m32 -o prog2.o prog2.s
as: unrecognized option '-m32'
<builtin>: recipe for target 'prog2.o' failed
make: *** [prog2.o] Error 1
为什么make
在标志不兼容时同时对gcc
和as
都使用 ASFLAGS
?我不应该以这种方式指定架构吗?我真的必须解决这个问题(即在我的 Makefile 中实际编写一些东西)还是我错过了什么?
正如你提到的,由于 ASFLAGS 被 LINK.s (gcc) 和 COMPILE.s (as) 使用,一种可能的解决方案是在 Makefile 中添加以下内容,以便使用 $(AS) 编译 %.s,
EXTRA_ASFLAGS = --32
%.o : %.s
$(AS) $(ASFLAGS) $(EXTRA_ASFLAGS) $(TARGET_MACH) -o $@ $<
或
COMPILE.s += --32
好吧,你对make
撒谎,as
.如果你输入ASFLAGS
一些不是汇编选项的东西,你就是在做一些不合规格的事情。
make
无法知道编译器和汇编程序理解哪些选项。为了解决这个问题,make
提供了一种单独为每个工具指定选项的方法:对编译器使用 CFLAGS
,对汇编程序使用 ASFLAGS
,对链接步骤使用 LDFLAGS
。
我建议使用make CFLAGS=-m32 ASFLAGS=--32
.