我尝试在 x86-64 上创建共享库但失败。问题归结为以下代码(请不要介意,它没有多大意义):
.section .data
newline:
.ascii "\n"
.section .text
.globl write_newline
.type write_newline, @function
write_newline:
mov $newline, %rax
ret
建设如下:
as minimal.s -o minimal.o
ld -shared minimal.o -o libmin.so
导致以下错误:
ld: minimal.o: relocation R_X86_64_32 against `.data' can not be used when making a shared object; recompile with -fPIC
minimal.o: error adding symbols: Bad value
但gas不知道选项-fPIC,所以我无法用它重新编译:
as -fPIC minimal.s -o minimal.o
as: unrecognized option '-PIC'
可以做什么呢?
正如 Marc B 在评论中所说,错误消息假设您正在使用 GCC 或其他一些编译器。由于您已经用汇编语言编写了代码,因此您有责任确保代码与位置无关。
在 x86-64 目标上,您可以使用 RIP 相对寻址解决此错误:
.section .data
newline:
.ascii "\n"
.section .text
.globl write_newline
.type write_newline, @function
write_newline:
lea newline(%rip), %rax
ret
请注意,您不需要在这里使用 GOT,因为newline
是当地的象征。如果它是全球性的,并且您想要参考newline
在您的代码中能够引用其他一些定义newline
在其他一些运行时组件中,那么您需要使用@GOTPCREL
搬迁。这将允许动态链接器更改 GOT 中的条目以指向不同的定义newline
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)