注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

编译Adding Symbola:bad value错误的解决方法  

2015-05-19 21:09:20|  分类: LINUX编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

编译Adding Symbola:bad value错误的解决方法

在编译不同的平台的库时,经常会出现题目中的错误,解决方法基本如下,转载一下这个就不用再总结了,偷一懒。

移植: Could not read symbols解决方法 2013-08-01 00:22:36

Could not read symbolsLinux/UNIX系统下编译时,常见的一类报错信息。

http://blog.chinaunix.net/uid-23381466-id-3828614.html

  通常情况下,该编译报错信息之前会给出出现错误的静态库(.a结尾文件)、或动态库(.so结尾文件),该报错的基本原因是当前编译器无法对库文件进行正确的解析。

Could not read symbols报错类型

  具体的报错信息会在Could not read symbols:字段后给出,常见的一些报警信息形如:

  /usr/lib/libdemo.so: could not read symbols: File in wrong format

  /usr/lib/libz.a: Could not read symbols: Bad value

  /usr/lib/libcode.a: Could not read symbols:Invalid operation

  /usr/lib/htmlparse.a: could not read symbols: Archive has no index; run ranlib to add one

  /usr/lib/htmlparse.a: could not read symbols: Malformed archive

  Linux出现Could not read symbols报警主要原因为当前编译环境和库文件生成时对应的环境不同,由于Linux本身编译选项非常复杂,可以从以下几个方面逐步排查:

Could not read symbols原因和解决方案

  1 gcc/g++版本不正确

  众所周知Linux gcc编译器(GNU Compiler Collection)是功能强大的交叉编译器,但其众多的版本会导致兼容问题。如果联编所使用的 .a/.so文件是由另一个不同版本的gcc编译生成后,当移植到另一个不同版本gcc环境下编译时,(例如:将gcc2.9x老版本下的.so,拷贝入新版gcc环境使用),且编译版本不兼容,会出现Could not read symbols的报错。(可以使用gcc -v 查看一下当前版本)

  如果是这种原因导致的问题,需要在新gcc版本下,删除(或更名)旧的库文件,重新由src编译生成.a/.so文件,保证gcc版本一致

  264bit/32bit编译环境不一致

  目前Linux OS系统会推出32位和64位两个不同的版本,此时即使使用命令:

  gcc --version

  查看的gcc三位版本一致,但由于32位程序和64位程序可能不兼容,因此如果在32bit OS环境下编译获得的库文件,移植入64bit环境时会产生Could not read symbols错误

  一个简单的方式查看当前系统位数:

  getconf LONG_BIT

  结果显示:32 or 64

  请确定在操作系统位数相同的环境下进行编译,否则删除原库文件重新生成

  3Makefile配置问题

  查看编译期参数是否缺少 -fPIC 不仅是共享库,静态库有时也需要有 -fPIC参数

  或者查看Makefile是否存在前后配置项不一致。

例如:/usr/bin/ld: /usr/local/lib/libz.a(crc32.o): relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC/usr/local/lib/libz.a: could not read symbols: Bad value

HOST> CFLAGS="-O3 -fPIC" ./configure //指定编译器参数重新编译

HOST> make

HOST> make install

  4、修改configure配置

  操作系统位数可能导致的另一个问题是,所使用的底层库不同

  linux系统在 /usr/lib/ /usr/lib64/ 两个目录下,会分别存放不同位数版本的lib

  可通过修改环境配置来指定所需的库位置:

  # ./configure --enable-lib64 --libdir=/usr/lib64

  解决库版本问题

  已知的一个常见问题是:在64位机器上编译httpd-2.0.x时常会出现该原因导致的Could not read symbols报错,通过该方法可解决

  另外,64位系统编译脚本在定位expat上存在问题(编译apache时常出现),修改configure使用自带的expat来编译可解决,具体修改configure配置的方法是增加:

  --with-expat=builtin

  5Lib路径错误

  目标路径的库文件不存在或不一致,也会导致Could not read symbols错误,

  可以查看路径和库文件所在位置是否一致,环境变量 LD_LIBRARY_PATH 中指明库的搜索路径是否有误。

Could not read symbols扩展

      具体的编译环境和选项错综复杂,如果通过上述方法仍存在错误,可以将错误信息,Makefileconfigure等贴至一些知名的Linux技术论坛,以寻求更具体的帮助。

 

站在别人的肩膀上会看得更远。进步更快。要善于学习,敏于思考。

  评论这张
 
阅读(356)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017