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.cpp
到libfunc.so
中定义的函数调用生成GOT。我不想要这种行为。我想要R_X86_64_64
风格的搬迁。我怎样才能做到这一点?
答案
出于安全原因,默认情况下在现代发行版中使用-fPIE
编译可执行文件。要获得旧的行为,请将-no-pie
添加到CFLAGS
/ CXXFLAGS
。
以上是关于GCC中可执行文件的非GOT样式重定位的主要内容,如果未能解决你的问题,请参考以下文章
聊聊Linux动态链接中的PLT和GOT(2)——延迟重定位