使用gcc从.o文件生成.so动态库失败,遇重定位错误求助
解决生成动态共享库时的R_X86_64_32重定位错误
这个问题我碰到过好几次了,其实核心原因很明确——你用来生成共享库的目标文件(*.o)没有用**位置无关代码(PIC)**编译,而创建动态共享库要求代码必须是位置无关的。
为什么会报错?
当系统加载动态库时,它可能被映射到进程地址空间的任意位置。如果代码不是位置无关的,就会包含绝对内存地址的引用(比如报错里提到的.rodata.str1.8段的32位重定位),这种引用在共享库场景下是无效的,因为库的加载地址不固定。
解决步骤
是的,你需要使用-fPIC选项重新编译所有源代码,生成符合要求的目标文件,具体操作如下:
重新编译所有源文件生成带PIC的目标文件
对于单个源文件,执行:gcc -c -fPIC your_source_file.c -o your_source_file.o如果要批量编译当前目录下所有
.c文件,可以用:gcc -c -fPIC *.c这个命令会把每个
.c文件编译成对应的.o文件,并且都带上-fPIC参数。重新链接生成动态共享库
拿到新的目标文件后,再执行你原来的链接命令:gcc -shared *.o -o libexample.so长期解决方案(如果用Makefile)
如果你是通过Makefile管理编译,记得在CFLAGS变量里加上-fPIC,这样所有编译步骤都会自动带上这个参数,避免下次再踩坑:CFLAGS += -fPIC
内容的提问来源于stack exchange,提问作者Harish Tadikamalla
相关产品推荐
相关产品推荐

