使用 gas (-fPIC) 生成位置无关代码
Generating position independent code with gas (-fPIC)
我尝试在 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
的其他定义,那么您需要使用 [=14= 】 搬迁。这将允许动态链接器更改 GOT 中的条目以指向 newline
.
的不同定义
我尝试在 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
的其他定义,那么您需要使用 [=14= 】 搬迁。这将允许动态链接器更改 GOT 中的条目以指向 newline
.