如何解决 error adding symbols: Bad value 问题

本文探讨了在64位环境中编译静态库时使用-fPIC选项的必要性,特别是在面对重定位错误时。通过具体实例解释了如何解决因缺少-fPIC导致的编译错误,并强调了其对于跨平台兼容性和可重定位性的关键作用。

//by sven

最近遇到一个关于动态库和静态库使用的一个问题。


我们都知道在生成一个动态库时需要指定-fPIC,这是创建动态库所要求的,共享库被加载是在内存中的位置是不固定的,是一个相对的位置。


那么在生成静态库时通常不指定-fPIC, 可是在64bit编译使用静态库就会提示需要-fPIC从新编译该库:


/opt/mipsel-openwrt-linux-4.8.3/mipsel-4.8.4/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin/../lib/gcc/mipsel-openwrt-linux-uclibc/4.8.3/../../../../mipsel-openwrt-linux-uclibc/bin/ld: ../lib/libmad.a(stream.o):relocation R_MIPS_26 against `mad_bit_init' can not be used when making a shared object; recompile with -fPIC
../lib/libmad.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
make: *** [libavio.so] Error 1

原因就是由于libmad编译静态库时,没有使用-fPIC选项,使得编译出来的静态库没有重定位能力。这样在64bit机器上编译出来的静态库如果不指定-fPIC选项几乎全部不能使用。

因此需要重新加上-fPIC从新编译libmad











这样就可以使用该静态库了,使用其他库类似问题同样适用。



评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值