4

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

谢谢艺术

4

3 回答 3

4

也许您与 Fedora 的Changes/Harden All Packages中概述的更改发生冲突,这些更改使用链接器规范,只有在您使用-fPIC-fPIE. 链接器消息几乎没用;只有关于的部分-fPIC有任何用处。

要解决此问题,您可以通过多种方式添加/修改编译器标志。最简单的方法之一是将其设置在CFLAGS环境变量中,例如,

export CFLAGS='-O -fPIC'

如果您碰巧正在构建 ncurses,这意味着您还必须配置为仅构建共享库,例如,

configure --with-shared --without-normal --without-debug

当然,如果您没有以前的一组 makefile 等,这一切都最好。

于 2016-04-16T21:04:08.460 回答
1

您正在查看错误消息的错误部分。“重定位 R_X86_64_32”意味着您正在尝试针对 64 位库构建 32 位代码,反之亦然。确保您为两者选择了相同的架构。

于 2016-04-16T17:30:06.850 回答
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 更有效,请查看此以获取更多信息`-fpic` 和 `-fPIC` gcc 参数之间的区别是什么? .

于 2016-04-16T17:46:37.013 回答