gpt4 book ai didi

linux - 当谈到从汇编语言源代码制作共享对象时,我应该做什么与​​ C 源代码不同的事情?

转载 作者:太空宇宙 更新时间:2023-11-04 12:32:34 24 4
gpt4 key购买 nike

它基于 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: undefined reference to `r2'

为什么会把寄存器助记词作为标签呢?

最佳答案

都是因为我误用了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

然后就出现了这个错误。在我的想象中,这在 ARM 模式下调用 'neg64 32' 和在 Thumb 模式下调用 'neg64 ' 时会起作用,但事实并非如此。显然,汇编宏扩展以不同的方式与 C 预处理器一起工作,后者只是进行文字替换。我的解决方案是放弃这个奇怪的定义并写一个'neg64_arm'和'neg64_thumb'。确切的答案需要更多地引用 GNU 汇编程序手册。

关于linux - 当谈到从汇编语言源代码制作共享对象时,我应该做什么与​​ C 源代码不同的事情?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42903400/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com