Contes 安装JLink Linux.(V420V) (2010-11-07 17:27)
分类:
ARM编程
Andrew Haung
bluedrum@163.com
一.安装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.
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 直接冲到老版本即可