我正在尝试使用GCC 5.3在linux上编译libedit,并且收到一条神秘的错误消息。
/home/mybin/libgcc/x86_64-unknown-linux-gnu/5.3.0/../../../libcurses.a(lib_termcap.o): relocation R_X86_64_32 against `_nc_globals' can not be used when making a shared object; recompile with -fPIC
/home/mybin/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/../../../libcurses.a: could not read symbols: Bad value
recompile with -fPIC
引用什么,ncurses还是libedit?然后我如何传递-fPIC
标志。我已尝试将CFLAGS=-fPIC
添加到ncurses & libedit
的配置中,但仍然无效。
我在SO上找到了关于-fPIC是什么的帖子,但没有关于如何设置标志的帖子。
感谢艺术
答案 0 :(得分:3)
也许你违背了Fedora' Changes/Harden All Packages中概述的更改,这些更改使用的链接器规范只有在使用-fPIC
或-fPIE
进行编译时才有效。链接器消息几乎没用;只有关于-fPIC
的部分才有用处。
要解决此问题,您可以通过多种方式添加/修改编译器标志。最简单的方法之一是在CFLAGS
环境变量中设置它,例如,
export CFLAGS='-O -fPIC'
如果您正在构建ncurses,这意味着您还必须配置为仅构建共享库,例如,
configure --with-shared --without-normal --without-debug
当然,如果你没有以前的makefile等,那么一切都会有效。
答案 1 :(得分:1)
您正在查看错误消息的错误部分。 “重定位R_X86_64_32”意味着您正在尝试针对64位库构建32位代码,反之亦然。确保为两者选择了相同的架构。
答案 2 :(得分:0)
-fPIC用于生成与位置无关的代码,用于创建共享库。 make文件有问题,要解决它:
编辑Makefile,第98行:
.c.o:
${CC} ${CFLAGS} -c $<
CC之后CC添加-fpic之后这样:
.c.o:
${CC} -fpic ${CFLAGS} -c $<
也在第103行:
libedit.so: ${OOBJS}
${CC} --shared -o $@ ${OOBJS}
在--shared之后添加-fpic:
libedit.so: ${OOBJS}
${CC} --shared -fpic -o $@ ${OOBJS}
如果您想知道-fPIC和-fpic之间有什么区别,请注意它们都做同样的事情但-fpic效率更高,请查看此信息以获取更多信息What is the difference between `-fpic` and `-fPIC` gcc parameters?。