📝 运行是崩溃

启动软件时崩溃(crash) #

正常编译时没出现报错,但是运行时立即报段错误,且只有部分编译器存在这个问题

解决方案 #

发现引入的sdk编译的时候没有添加-fPIC参数。

-fPIC的作用 #

-fPIC 是 Position Independent Code(位置无关代码) 的意思。
它告诉编译器:生成的机器代码不能包含硬编码的绝对地址,而是要通过相对地址或表格跳转来访问数据和函数。这样,编译好的目标文件(比如 .o 文件)就可以被放到内存的任何位置执行,不需要在运行时修改代码本身。

动态链接库(.so) #

动态库在运行时会被加载到任意的内存位置(取决于系统的调度、内存情况等)。
如果目标文件里有固定地址(绝对地址),那一旦加载到不同位置,地址就错了,程序就崩了。
所以,编译成动态库的 .o 文件必须加 -fPIC,保证它在任何位置都能正确执行。

总结: #

编动态库时,一定要加 -fPIC,否则链接时出错,或者运行时崩溃。

静态链接库(.a) #

静态库在链接阶段直接被打包到可执行文件中。
可执行文件的链接器(ld)会知道最终程序要加载到哪儿,因此理论上可以不用 -fPIC。
但是!如果你把静态库拿去生成动态库(比如 gcc -shared 链接 .a 文件),又出现了同样的问题

总结: #

普通程序链接静态库时可以不加 -fPIC,但如果要把 .a 打包进 .so,静态库也必须是 -fPIC 编译的。