使用 -fPIC进行编译时,GCC报告了重定位相关的问题

前端开发 2026-07-11

我在为一个C 库开发Lua绑定。

在我的makefile的链接阶段,我看到了这个:

$ gcc -shared -fPIC ext/volksdata/build/libvolksdata.a build/lua_graph.o \
build/lua_namespace.o build/lua_store.o build/lua_term.o \
build/lua_triple.o build/lua_volksdata.o -L/usr/local/lib \
-Lext/volksdata/build -llua -llmdb -lxxhash -luuid -o lib/volksdata.so


/usr/bin/ld: /usr/local/lib/liblua.a(lauxlib.o): warning: relocation against `stdin@@GLIBC_2.2.5' in read-only section `.text'

/usr/bin/ld: /usr/local/lib/liblua.a(lstate.o): relocation R_X86_64_PC32 against symbol `lua_newstate' can not be used when making a shared object; recompile with -fPIC

(为可读性在命令行中添加了换行)

这个问题是在好几个月没有改动Makefile或更新Lua库之后才出现的,所以我在想根本原因可能出在哪里。为什么突然要我在 -fPIC 下重新编译Lua?

非常感谢你的帮助。

解决方案

错误发生的原因是你试图把一个共享库(你的Lua绑定)与一个未开启 -fPIC(Position Independent Code,位置无关代码)标志的静态Lua库进行链接。共享库要求所有被链接的目标代码都是位置无关的,但你的Lua库很可能是作为一个标准静态库构建的。

要解决这个问题,你需要在其构建配置中启用 -fPIC 标志来重新编译Lua库,或者切换到使用一个已经支持位置无关代码的预编译Lua共享库(.so.dylib)。

下面是一些资源,帮助你理解Position Independent Code(PIC)、动态链接和环境变量:

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章