GCC中可执行文件的非GOT样式重定位

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GCC中可执行文件的非GOT样式重定位相关的知识,希望对你有一定的参考价值。

在GCC中,如果我使用g++ -shared func.cpp -o libfunc.so -fPIC将某些内容编译到带有GCC的共享库中,则对此全局符号的内部函数调用将在此生成的共享库文件中通过GOT。但是如果我使用g++ func.cpp -o libfunc.so -mcmodel=large进行编译,它将不会生成GOT,而是通过直接使用R_X86_64_64样式重定位来重新定位。

我也希望这种行为可执行文件。如果我使用g++ main.cpp libfunc.so -o a.out编译可执行文件,GCC将为从main.cpplibfunc.so中定义的函数调用生成GOT。我不想要这种行为。我想要R_X86_64_64风格的搬迁。我怎样才能做到这一点?

答案

出于安全原因,默认情况下在现代发行版中使用-fPIE编译可执行文件。要获得旧的行为,请将-no-pie添加到CFLAGS / CXXFLAGS

以上是关于GCC中可执行文件的非GOT样式重定位的主要内容,如果未能解决你的问题,请参考以下文章

图片+代码:GCC 链接过程中的重定位过程分析.md

图片+代码:GCC 链接过程中的重定位过程分析.md

聊聊Linux动态链接中的PLT和GOT(2)——延迟重定位

运行时 gcc 重定位错误

elf文件中的.plt .rel.dyn .rel.plt .got .got.plt的关系

ELF 动态链接 - so 的 重定位表