我想从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
在ASFLAGS
和gcc
标记不兼容时使用as
?我不应该以这种方式指定架构吗?我是否真的必须破解我的方式(即实际上在我的Makefile中写一些东西),或者是否有我错过的东西?
答案 0 :(得分:1)
由于您提到的LINK.s(gcc)和COMPILE.s(as)都使用了ASFLAGS,因此一种可能的解决方案是在Makefile中添加以下内容,以便用$(AS)编译%.s,
EXTRA_ASFLAGS = --32
%.o : %.s
$(AS) $(ASFLAGS) $(EXTRA_ASFLAGS) $(TARGET_MACH) -o $@ $<
,或
COMPILE.s += --32
答案 1 :(得分:0)
好吧,你骗了make
和as
。如果您输入的ASFLAGS
某些东西不是汇编程序选项,那么您就可以执行超出规范的操作。
make
无法知道编译器和汇编器理解的选项。为了解决这个问题,make
提供了一种分别为每个工具指定选项的方法:对编译器使用CFLAGS
,为汇编程序使用ASFLAGS
,为链接步骤使用LDFLAGS
我建议使用make CFLAGS=-m32 ASFLAGS=--32
。