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

how to pass -fPIC to GCC on linux

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

感谢艺术

您正在查看错误消息的错误部分。 "relocation R_X86_64_32" 表示您正在尝试针对 64 位库构建 32 位代码,反之亦然。确保您为两者选择了相同的体系结构。

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

也许您 运行 与 Fedora 的 Changes/Harden All Packages 中概述的更改相冲突,它使用的链接器规范仅在您使用 -fPIC-fPIE 进行编译时才有效。链接器消息几乎没用;只有关于 -fPIC 的部分有用。

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

export CFLAGS='-O -fPIC'

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

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

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