今天差点得到血的教训,特将此进行记录,由于变态的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. 翻阅资料发现libreadline是系统自带的库,作为一个底层库,非常多的库都依赖于这个库。(具体参考连接:http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html )
2. 因此在开机的时候系统bash启动某些服务的时候调用了这个库,而这个库里面有“PC”字样的符号:
3. 这个些符号是在保留libncurses或libtermcap 之中的:
4. 但是libreadline库默认是不包含这个libncurses库的(只依赖libc库):
所以在启动的过程中,bash调用这个库(libreadline)之后就报错了。
分类: 嵌入式
[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 |
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) |
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 |
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) |
[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] |
readline-5.1-1.1
因为它是开源库,可以到下到源码。从网上下到 readline-5.2.tar.gz.
再次编译,检查库已经链接进去了
readelf -a /usr/lib/libreadline.so.5 | grep NEEDED 0x00000001 (NEEDED) Shared library: [libncurses.so.5] 0x00000001 (NEEDED) Shared library: [libc.so.6] |
./start SEGGER J-Link Commander V4.20h ('?' for help) Compiled Oct 19 2010 14:02:03 Can not connect to J-Link via USB. |