Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1685251
  • 博文数量: 311
  • 博客积分: 7778
  • 博客等级: 少将
  • 技术积分: 4186
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-09 19:59
个人简介

蓝点工坊(http://www.bluedrum.cn) 创始人,App和嵌入式产品开发。同时也做相应培训和外包工作。 详细介绍 http://pan.baidu.com/s/1y2g88

文章存档

2012年(3)

2011年(115)

2010年(170)

2009年(23)

分类: 嵌入式

2010-11-07 17:27:38

Andrew Haung
 
一.安装RHEL5的JLink Linux
--------------------------------------------------------------------
从官方网站下载JLink Linux版本
 
 
 
 下到本地解压.
[root@huisen JLink_Linux_V420h]# ls
45-jlink.rules  JLinkGDBServer  libjlinkarm.so.4       README
JLinkExe        JLink.log       libjlinkarm.so.4.20.8  start
 
 
在目录运行显示:
    提示.
./start
./JLinkExe: symbol lookup error: /usr/lib/libreadline.so.5: undefined symbol: PC
 
二.解决libreadline.so.5的找不到undefined symbob:PC
-------------------------------------------------------------------
  从上网的资料来看,这是一个常见的错误。随便搜一下libreadline.so.5: undefined symbol: PC.发生大量人碰到这个问题。
   1.首先要可以确认一点
      包括网上很多碰到如下错误提示都归于一类.
undefined symbol: PC (/usr/lib/libreadline.so.5.2)
undefined symbol: UP (/usr/lib/libreadline.so.5.2)
undefined symbol: BC (/usr/lib/libreadline.so.5.2)
undefined symbol: tgetflag (/usr/lib/libreadline.so.5.2)
undefined symbol: tgetent (/usr/lib/libreadline.so.5.2)
undefined symbol: tputs (/usr/lib/libreadline.so.5.2)
undefined symbol: tgoto (/usr/lib/libreadline.so.5.2)
undefined symbol: tgetnum (/usr/lib/libreadline.so.5.2)
undefined symbol: tgetstr (/usr/lib/libreadline.so.5.2)
    这一些符号都是在保留libncurses或libtermcap 之中。检测系统中ncurses库,可以发现有这几个符号
 
readelf -a /usr/lib/libncurses.so | grep PC
02c1133c  0000f806 R_386_GLOB_DAT    02c12778   PC
248: 02c12778     1 OBJECT  GLOBAL DEFAULT   23 PC
 
 
     
readelf -a /usr/lib/libncurses.so | grep UP
02c1138c  00024b06 R_386_GLOB_DAT    02c12540   UP
   587: 02c12540     4 OBJECT  GLOBAL DEFAULT   23 UP
 
手动装载libreadline也会发现缺少几个符号
  
ldd -r /usr/lib/libreadline.so.5 | grep und
undefined symbol: PC    (/usr/lib/libreadline.so.5)
undefined symbol: UP    (/usr/lib/libreadline.so.5)
undefined symbol: BC    (/usr/lib/libreadline.so.5)
undefined symbol: tgetflag      (/usr/lib/libreadline.so.5)
undefined symbol: tgetent       (/usr/lib/libreadline.so.5)
undefined symbol: tputs (/usr/lib/libreadline.so.5)
undefined symbol: tgoto (/usr/lib/libreadline.so.5)
undefined symbol: tgetnum       (/usr/lib/libreadline.so.5)
undefined symbol: tgetstr       (/usr/lib/libreadline.so.5)
 
再检查libreadline.so.5和JLinkExe的依赖库,都没有发现libncurses.so或libtermcap.so
 
[root@huisen JLink_Linux_V420h]# readelf -a JLinkExe | grep NEEDED
 0x00000001 (NEEDED)                     Shared library: [libjlinkarm.so.4]
 0x00000001 (NEEDED)                     Shared library: [libpthread.so.0]
 0x00000001 (NEEDED)                     Shared library: [libusb-0.1.so.4]
 0x00000001 (NEEDED)                     Shared library: [librt.so.1]
 0x00000001 (NEEDED)                     Shared library: [libreadline.so.5]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 
# readelf -a /usr/lib/libreadline.so.5 | grep NEEDED
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 
 2.解决方法
   
    一种解决办法是在,在使用libreadline库的程序,再重新编译,加入-lncurses 的链接。这种方法前提有应用程序的源码。但在这种情况没法得到JLinkExe的源码。只能想其它办法。
   
 
   另外一种办法是,在libreadline库加入ncurses的链接。
rpm -q readline 查询默认的readline库
         readline-5.1-1.1
因为它是开源库,可以到下到源码。从网上下到 readline-5.2.tar.gz.
   解压后在源码目录执行 ./configure --prefix=/usr --with-ncurses 生成Makefile
 
  make
  make install
 后冲掉/usr/lib下原来的版本,但是错误仍在,库仍然没有链接进去。
  
   检查源码发现readline-5.2下还有shlib来编译动态库。在shlib这个目录下的Makefile中定义的变量SHLIB_LIBS = 是为空的。将其中改为
      SHLIB_LIBS = -lncurses
然后
  make
  make install
再次编译,检查库已经链接进去了
 
readelf -a /usr/lib/libreadline.so.5 | grep NEEDED
 0x00000001 (NEEDED)                     Shared library: [libncurses.so.5]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 
运行./start执行,JLinkLinux 运行正常.出现提示了。
 
./start
SEGGER J-Link Commander V4.20h ('?' for help)
Compiled Oct 19 2010 14:02:03
Can not connect to J-Link via USB.
 
注意,不要在添加/删除程序界面去掉老的readline 5.1.1的库!,大量的库都依赖于他。如果强行删除,将导致整个GNONE的各种应用程序都被删除。我付出来教学机崩溃的代价才明白。只需要用 configure --prefix=/usr 直接冲到老版本即可
阅读(3102) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~