问题
我正在阅读这本书,其中有一章关于动态链接和以下代码:
link_example.s
.globl main
.section .data
output:
.ascii "Yeet\n\0"
.section .text
main:
enter $0, $0
movq stdout, %rdi
movq $output, %rsi
call fprintf
movq $0, %rax
leave
ret
现在根据书中的指示,我需要按照以下方式编译以动态链接C库:
gcc -rdynamic link_example.s -o link_example
但我收到了以下错误信息:
/usr/bin/ld: /tmp/cchUlvqS.o: relocation R_X86_64_32S against symbol `stdout@@GLIBC_2.2.5' can not be used when making a PIE object; recompile with -fPIE
/usr/bin/ld: failed to set dynamic section sizes: bad value
collect2: error: ld returned 1 exit status
我做错了什么?
你尝试过什么?
添加-fPIE
标志
我尝试了编译器建议的方法,添加了-fPIE
标志:
gcc -rdynamic -fPIE link_example.s -o link_example
但我仍然再次遇到了相同的错误。
查找类似的帖子
我发现了一个类似的帖子,它说我只需要使用-shared
标志:
gcc -shared link_example.s -o link_example
但是这给我带来了:
/usr/bin/ld: /tmp/ccxktZan.o: relocation R_X86_64_32S against symbol `stdout@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: failed to set dynamic section sizes: bad value
collect2: error: ld returned 1 exit status
如果我加上-fPIC
标志:
gcc -shared -fPIC link_example.s -o link_example
然后我得到了这个:
/usr/bin/ld: /tmp/ccKIQ9sl.o: relocation R_X86_64_32S against symbol `stdout@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: failed to set dynamic section sizes: bad value
collect2: error: ld returned 1 exit status
-no-pie
(或重写代码为PIC)。 - Jester不生成动态链接的位置无关可执行文件。
这个标志在这里具体起到了什么作用?这听起来像是禁用了动态链接。 - TornaxO7-fpie
指示编译器生成此类代码,但如果您使用汇编语言编写,则必须自己完成。-no-pie
关闭 PIE,允许您在主二进制文件中编写传统的位置相关代码。 - fuz