如何在Linux上将-fPIC传递给GCC

时间:2016-04-16 17:20:13

标签: linux gcc ncurses fpic

我正在尝试使用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是什么的帖子,但没有关于如何设置标志的帖子。

感谢艺术

3 个答案:

答案 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?