编译报错
relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object; recompile with -fPIE
collect2: error: ld returned 1 exit status
make[3]: *** [Makefile:44: clidebug] Error 1 <<< 提示倒数第一级makefile出错处
make[2]: *** [Makefile:12: climain] Error 2 <<< 提示倒数第二级makefile出错处
分析
Makefile都是相互调用的,先看Makefile直接出错处
43 $(targets): $(PARSE_OBJ) $(MAIN_OBJ)
44 GCC $(CFLAGS) -c $(LIB_PATH) -c $< -o $@
调试时,可以加个 echo "$(CFLAGS)"看下$(CFLAGS)是否有 -fPIE
不过即使Makefile加了-fPIE
也依然报错。
CFLAGS += -fPIE
解决
最后干脆就在Makefile加
CFLAGS += -no-pie
发现这样编译就通过了。
参考
https://blog.csdn.net/huangkangying/article/details/90521151
查了下GNU的手册
-
-fPIC与-fpic都是在编译时加入的选项,用于生成位置无关的代码(Position-Independent-Code)。这两个选项都是可以使代码在加载到内存时使用相对地址,所有对固定地址的访问都通过全局偏移表(GOT)来实现。-fPIC和-fpic最大的区别在于是否对GOT的大小有限制。-fPIC对GOT表大小无限制,所以如果在不确定的情况下,使用-fPIC是更好的选择。
-
-fPIE与-fpie是等价的。这个选项与-fPIC/-fpic大致相同,不同点在于:-fPIC用于生成动态库,-fPIE用与生成可执行文件。再说得直白一点:-fPIE用来生成位置无关的可执行代码。