/usr/lib/libreadline.so.5: undefined symbol: PC 导致suse 无法启动

今天差点得到血的教训,特将此进行记录,由于变态的HKer的需要,要研究shell脚本通过sftp传输文件,由于对方没有确定是否使用密钥连接,所以我还要研究使用用户名密码登陆的问题,搜索得知有个lftp的好东东,但是需要readline的支持,而readline又需要ncurses,最后在安装了一堆包之后,我突然发现gunzip不管用了,有种不祥的预感,但是觉得可能是装了lib的问题,重启一下就好了,没想到重启之后系统都进不去了,如下文中那样,卡在INIT那里.。之前破解过suse的密码,知道有方法可以进命令行,但是试过了,依旧不管用,/bin/bash也是依赖readline的,后来我不甘心,每个shell都试了下,bash,sh都不行,试到csh,终于可以了.

进去之后,和正常的系统比较了一下,原来的readline的so库是在lib64下的,而下载的readline包,编译后,在/usr/local/lib下又生成了libreadline.so的库,估计是让系统应用认到/usr/local/lib那里了,删除后重启,终于可以进到系统中.

 

下面两篇文章对我帮助很大,转载至此:

文章1:http://blog.csdn.net/samed/article/details/9001601

最近服务器挂掉将近一周,让X讯和VMware的运维人员给我处理,硬是搞不定。

最后还是Linux的厂商帮俺们搞定,结束我的苦逼酱油日子。

操作系统:Suse linux 11 64bit

硬件环境:就不多说了,反正是搭建在VM上面的。

一、现象:
1. 作为远程ssh连接,最基本的现象就是无法连接该虚拟主机了。
2. 在物理主机上使用vmware打开该虚拟机,会发现机器开机时候卡在第二屏(参看文末附件“现象01.png”)。
3. 使用F2快捷键进入命令行模式,是可以看到具体卡在哪里的(“现象02.png”)。
4. 提示信息如下:
/bin/sh: symbol lookup error: /usr/lib/libreadline.so.5: undefined symbol: PC

二、分析:
1. 翻阅资料发现libreadline是系统自带的库,作为一个底层库,非常多的库都依赖于这个库。(具体参考连接:http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html

2. 因此在开机的时候系统bash启动某些服务的时候调用了这个库,而这个库里面有“PC”字样的符号:

3. 这个些符号是在保留libncurses或libtermcap 之中的:

4. 但是libreadline库默认是不包含这个libncurses库的(只依赖libc库):

所以在启动的过程中,bash调用这个库(libreadline)之后就报错了。

三、解决:
1. 方法一(目前采取的办法):将libreadline库删掉。
这个方法非常暴力,而且也是suse工程师采用的办法,仅仅将涉及的库文件删除掉就完事了。(目前1节点的时间已经被暴力干掉,2节点文件我保存了下来了,在/tmp目录,附件是两个文件,另外还有两个软链接,在windows下无法展现。)
但是该方法是有后遗症的:如果在编译某些程序的时候需要运行libreadline,则会提示无法通过。
并且后续运行,根据以往文献,gome等界面均是依赖该库文件的,因此gome等图形界面编辑器会无法使用(是否还有其它工具也是依赖于它则不得而知)
2. 方法二(风险系数较高,但如果要使用该库,只能用这方法):重新编译libreadline,链接libncurses库。
步骤:
(0)将文件拷贝回/usr/local/lib 目录: cp /tmp/libreadline* /usr/local/lib/ P.S.:严禁使用mv!(此步也可以不做)
(1) rpm -qa |grep readline 查看是否安装,以及安装版本。
(2)下载:readline-5.2.tar.gz 并解压。
(3)修改./shlib/Makefile.in 的 SHLIB_LIBS 为: SHLIB_LIBS = -lncurses
(4) ./configure --prefix=/usr --with-ncurses #生成Makefile
(5) make
(6)make install
(7)编译完成后查看是否已经链接进去: readelf -a /usr/local/lib/libreadline.so.5 | grep NEEDED
欢迎指正。
 
RHEL5 安装JLink Linux.(V420V) 2010-11-07 17:27:38

分类: 嵌入式

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.
解压后在源码目录执行 ./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 直接冲到老版本即可
 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值