当谈到从汇编语言源创建共享对象时,我会做什么与C源有什么不同呢?

时间:2017-03-20 12:17:10

标签: linux assembly raspberry-pi arm

这是ARM架构,Raspberry Pi 3B。当我尝试使用与C相同的方法从汇编语言源生成lib * .so时,发生了一个奇怪的错误。我的 Makefile 如下所示:

a.s: a.S
    cpp -o $@ $<

a.o: a.s
    as -o $@ $<

liba.so: a.o
    gcc -shared $^ -o $@

main: main.c liba.so
    gcc -L. $< -la -o $@

a_debug.o: a.s
    as -gstabs+ -o $@ $<

main_debug: main.c a_debug
    gcc $^ -o $@

main_debug 可以毫无问题地制作;但在制作 main 时,链接器报告错误:

  

libfxp.so:对“r2”的未定义引用

为什么将寄存器助记符作为标签?

1 个答案:

答案 0 :(得分:0)

这一切都是因为我误用了GNU汇编程序的宏机制。 我定义了一个宏:

.macro neg64 reg0, reg1, insset
mvn \reg0, \reg0
mvn \reg1, \reg1
.if \insset == 32
    adds \reg0, \reg0, #1
    adc \reg1, #0
.else
    mov \insset, #1
    cmn \reg0, \insset
    adc \reg1, \reg1, \insset
    sub \reg1, \reg1, #1
    add \reg0, \reg0, #1
.endif
.endm

并称之为:

neg64 r0, r1, r2

然后发生了这个错误。在我的想象中,这将在致电&#39; neg64 32&#39;在ARM模式和&#39; neg64&#39;在Thumb模式下,但事实并非如此。很明显,汇编宏扩展以与C预处理器不同的方式工作,它只是文字替换。我的解决方案是抛弃这个奇怪的定义并编写一个“neg64_arm”#39;和&#39; neg64_thumb&#39;。确切的答案需要更多地参考GNU汇编程序手册。