【嵌入式Linux学习七步曲之第二篇 ARM+Linux开发环境】详解gdb+gdbserver运行问题./gdbserver: error in loading shared libraries

来源:互联网 发布:稻谷脂肪酸值标准数据 编辑:程序博客网 时间:2024/06/06 05:12

 

详解gdb+gdbserver运行问题./gdbserver: error in loading shared libraries

Sailor_forever  Sailing_9806@163.com 转载请注明

http://blog.csdn.net/sailor_8318/archive/2008/04/16/2295598.aspx

【摘要】:本文分析了gdb+gdbserver运行过程中的库依赖问题,转贴我在linuxforum.net上的精华帖。

【关键词】:gdbgdbserver远程调试交叉调试 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.19rmk7

编译器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.32.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

 

三、运行gdbserverloading错误消失

[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