详解gdb+gdbserver运行问题./gdbserver: error in loading shared libraries
Sailor_forever [email protected] 转载请注明
http://blog.csdn.net/sailor_8318/archive/2008/04/16/2295598.aspx
【摘要】:本文分析了gdb+gdbserver运行过程中的库依赖问题,转贴我在linuxforum.net上的精华帖。
【关键词】:gdb,gdbserver,远程调试,交叉调试, arm
原帖链接
http://www.linuxforum.net/forum/showflat.php?Cat=&Board=embedded&Number=646309&fpart=1&PHPSESSID=
现象:
./gdbserver: error in loading shared libraries: libthread_db.so.1: cannot open shared object file: No such file or directory
我目前的开发环境是主机REDHat 2.4.20
板子内核 2.4.19 -rmk7
编译器2.95.3
问题:
1. version mismatch between libthread_db and libpthread是不是导致下面我找不到那个动态库?
2. gdb版本和内核及编译器版本是怎么匹配的?
3. 那个libthread_db.so.1动态链接库的快捷方式到底指向哪?
过程:
1. gdb6.5/6.1/5.3 都存在 网上都说直接注销这个头文件就行了,不知到跟下面找不到库有没有关系
make: *** [linux-arm-low.o] Error 1
[root@dding gdbserver]#
[root@dding gdbserver]# gedit config.h
/* Define to 1 if you have the <sys/reg.h> header file. */
/*define HAVE_SYS_REG_H 1 */
/*have no <sys/reg.h> header file. so undefine 20070402 dding */
2.
thread-db.c: In function `thread_db_err_str': gdb6.5 此版我注销了这个,好像跟下面那个库的名字很关联啊
thread-db.c:95: `TD_VERSION' undeclared (first use in this function)
[root@dding gdbserver]# gedit config.h
94 #ifdef HAVE_TD_VERSION
95 case TD_VERSION:
96 return "version mismatch between libthread_db and libpthread";
97 #endif
/* Define if TD_VERSION is available. */
/*#define HAVE_TD_VERSION 1 */
/*have no TD_VERSION. so undefine 20070402 dding */
gdb6.1/5.3的源代码中没有94――96行,故没有此问题,但是库的问题仍然存在
3.
[root@AT91RM9200DK arm]$./gdbserver 192.168.0.12:2345 mainparacarm gdb6.5
./gdbserver: error in loading shared libraries: libthread_db.so.1: cannot open
[root@AT91RM9200DK arm]$./gdbserver 192.168.0.14:2345 mainparacarm gdb6.1/5.3
./gdbserver: error in loading shared libraries: libthread_db.so.1: cannot open shared object file: No such file or directory
我板子上的Lib库里确实没有上述库,可我在交叉编译器的库里找不到这个,库里面它是个快捷方式,不知道连接到哪了?动态库这边我不怎么明白
Gcc库里面的这个文件能用么?
两个交叉编译器件版本里都没有libthread_db.so.1,是不是我找的地方不对啊?
我怀疑libthread_db.so.1指向libthread_db-1.0.so,就直接将其拷贝了,放到库里,问题没了,可要提示/lib/libc.so.6: version `GLIBC_2.2' not found?如下
[root@AT91RM9200DK arm]$cp libthread_db-1.0.so libthread_db.so.1
[root@AT91RM9200DK arm]$cp libthread_db.so.1 /lib/
[root@AT91RM9200DK arm]$./gdbserver 192.168.0.12:2345 mainparacarm
./gdbserver: /lib/libc.so.6: version `GLIBC_2.2' not found (required by /lib/li)
编译的时候那个库有用么?还是说在运行的时候用?不知道是我的文件系统里面的问题还是怎么着的?
网上有说编译GDB的时候搞成静态的就好了.就在Makefile里加上CFLAGS += -static,但我试了下,编译通不过
另外我在网上看2.4内核用gdb5.3,2.6内核用gdb6.1以上,是这样么?
请各位大虾帮我分析下吧,我好几个版本都试了,就不行,网上别人说的好像都没什么问题,我怎么就这么不顺啊
×××××××××××××××××××××××××××××××××××××××××
问题解决了呵呵,把过程说下,总的来说就是文件系统的问题缺少多线程库libthread_db.so.1以及版本太低
1、确定libthread_db.so.1指向的文件
编译中的问题并不影响libthread_db.so.1,其指向libthread_db-1.0.so,
在交叉编译器的arm-linux/lib/下面执行
[root@dding lib]# ls -l | grep libthread_db.so.1
lrwxrwxrwx 1 ding dip 17 3月 18 23:42 libthread_db.so -> libthread_db.so.1
lrwxrwxrwx 1 ding dip 19 3月 18 23:42 libthread_db.so.1 -> libthread_db-1.0.so 当前目录下面
[root@dding lib]# pwd
/usr/local/arm/2.95.3/arm-linux/lib
不能在cygwin下面查找到其连接,windows不支持符号连接,cygwin采用的fat系统
lrwxrwxrwx 1 2619 man 29 4月 20 17:01 libthread_db-1.0.so ->
../../lib/libthread_db-1.0.so
指向了自己,不对
二、拷贝libthread_db-1.0.so到板子上,并建立libthread_db.so.1符号连接
[root@AT91RM9200DK /lib]ln -s libthread_db-1.0.so libthread_db.so.1
[root@AT91RM9200DK /lib]$ls -l libth* ##将文件拷贝到板子的lib中,并建立软链接
-rwxr-xr-x 1 root root 212987 Jan 1 02:01 libthread_db-1.0.so
lrwxrwxrwx 1 root root 19 Jan 1 02:02 libthread_db.so.1 ->libthread_db-1.0.so
三、运行gdbserver,loading错误消失
[root@AT91RM9200DK /nfs]./gdbserver 192.168.0.12:2345 gdbsamplearm
./gdbserver: /lib/libc.so.6: version `GLIBC_2.2' not found (required by /lib/libthread_db.so.1)
四、GLIBC_2.2'版本问题
##查看lib.so.6的版本问题 GLIBC_2.2
[root@AT91RM9200DK arm]$cd /lib/
[root@AT91RM9200DK /lib]$ls -l libc.so.6
lrwxrwxrwx 1 root root 13 Jul 28 2004 libc.so.6 -> libc- 2.1.3 .so
[root@AT91RM9200DK /lib]$ls -l libc- 2.1.3 .so
-rwxr-xr-x 1 root root 949768 May 9 2003 libc- 2.1.3 .so
板子上的libc库即libc- 2.1.3 .so不是2.2版本的不能用
五、重新拷贝主机上的交叉编译器里的libc- 2.2.3 .so到板子上
至此,一切OK!