GDB命令'info sharedlibrary'无法显示所有的库

问题描述:

我在做交叉编译调试。 我的构建服务器CPU是amd64。我的设备CPU是MIPS。 当我试图调试自己编译的elf文件时。 gdb只能显示ld.so.1GDB命令'info sharedlibrary'无法显示所有的库

(gdb) info sharedlibrary 
From  To   Syms Read Shared Object Library 
0x7704f9c0 0x7706c490 Yes (*)  /lib/ld.so.1 
(*): Shared library is missing debugging information. 
(gdb) q 

我检查了/ proc/xxxx/maps文件。它显示共享库已加载。

[email protected]:/proc/13679# cat maps 
...... 
76549000-76d48000 rwxp 00000000 00:00 0 [stack:13682]       
76d48000-76d4a000 r-xp 00000000 00:0c 5268 /usr/lib/strongswan/plugins/libstrongswan-addrblock.so      
76d4a000-76d59000 ---p 00002000 00:0c 5268 /usr/lib/strongswan/plugins/libstrongswan-addrblock.so    
...... 

如果我调试是从Debian软件包服务器上安装的文件,然后GDB可以显示所有的共享库。

(gdb) info sharedlibrary 
From  To   Syms Read Shared Object Library 
0x77341bc0 0x77342c80 Yes (*)  /lib/mips-linux-gnu/libdl.so.2 
0x771d77e0 0x772ff6f0 Yes (*)  /lib/mips-linux-gnu/libc.so.6 
0x773549c0 0x77371490 Yes (*)  /lib/ld.so.1 
(*): Shared library is missing debugging information. 
(gdb) 

GDB的版本是: GNU GDB(Debian的7.7.1 + DFSG-5)7.7.1


我的问题是:为什么 的GDB命令 '信息sharedlibrary'无法显示所有的库?我该如何解决它?


(EDIT)

(是否每个可执行文件所需要的库ld.so它缺少?)

命令MIPS-Linux的GNU-readelf的”输出 - d的src /戎/的.libs /戎”

Dynamic section at offset 0x1fc contains 33 entries: 
    Tag  Type       Name/Value 
    0x00000001 (NEEDED)      Shared library: [libstrongswan.so.0] 
    0x00000001 (NEEDED)      Shared library: [libhydra.so.0] 
    0x00000001 (NEEDED)      Shared library: [libcharon.so.0] 
    0x00000001 (NEEDED)      Shared library: [libm.so.6] 
    0x00000001 (NEEDED)      Shared library: [libpthread.so.0] 
    0x00000001 (NEEDED)      Shared library: [libdl.so.2] 
    0x00000001 (NEEDED)      Shared library: [libc.so.6] 
    0x0000001d (RUNPATH)     Library runpath: [/usr/lib/strongswan] 
    0x0000000c (INIT)      0xd00 
    0x0000000d (FINI)      0x2eb0 
    0x00000004 (HASH)      0x32c 
    0x00000005 (STRTAB)      0x904 
    0x00000006 (SYMTAB)      0x4d4 
    0x0000000a (STRSZ)      787 (bytes) 
    0x0000000b (SYMENT)      16 (bytes) 
    0x70000035 (MIPS_RLD_MAP_REL)   0x134dc 
    0x00000015 (DEBUG)      0x0 
    0x00000003 (PLTGOT)      0x13760 
    0x00000011 (REL)      0xcf0 
    0x00000012 (RELSZ)      16 (bytes) 
    0x00000013 (RELENT)      8 (bytes) 
    0x70000001 (MIPS_RLD_VERSION)   1 
    0x70000005 (MIPS_FLAGS)     NOTPOT 
    0x70000006 (MIPS_BASE_ADDRESS)   0x0 
    0x7000000a (MIPS_LOCAL_GOTNO)   18 
    0x70000011 (MIPS_SYMTABNO)    67 
    0x70000012 (MIPS_UNREFEXTNO)   37 
    0x70000013 (MIPS_GOTSYM)    0x11 
    0x6ffffffb (FLAGS_1)     Flags: PIE 
    0x6ffffffe (VERNEED)     0xca0 
    0x6fffffff (VERNEEDNUM)     2 
    0x6ffffff0 (VERSYM)      0xc18 
    0x00000000 (NULL)      0x0 

ED IT

调试运行GDB: GDB的查询“qXfer:库-SVR4:读”返回的空库列表。

Breakpoint 7, svr4_current_sos_via_xfer_libraries (list=0x7fff8be59ad0, annex=<optimized out>) 
at /gdb/gdb-7.11.1/gdb/solib-svr4.c:1301 
1301 result = svr4_ parse_libraries (svr4_library_document, list); 
1: svr4_library_document = 0x15cd9c0 "<library-list-svr4 version=\"1.0\"/>" 
(gdb) 

对于那些不是我编译Debian软件包,gdb的查询“qXfer:库-SVR4:读”退换充分共享库列表。

gdbserver如何构造此查询的答复'qXfer:libraries-svr4:read'?


编辑

还有一个线索:

从Debian的杰西安装的pkgs分配不PIE编码。 我编译的代码是PIE代码。

[email protected]:/proc/14956# readelf -r /usr/lib/strongswan/charon 

Relocation section '.rel.dyn' at offset 0xcf0 contains 2 entries: 
Offset  Info Type   Sym.Value Sym. Name 
00000000 00000000 R_MIPS_NONE 
00013870 00000003 R_MIPS_REL32 

[email protected]:/proc/14956# readelf -r /usr/bin/id 

There are no relocations in this file. 
[email protected]:/proc/14956# 

编辑

gdbserver的调试之后,我发现了一个奇怪的信息。 正在运行的proc的DT_DEBUG条目为0。加载器重新定位代码后,DT_DEBUG不应该为0.(?)系统是否不支持PIE代码?我正在使用Debian Jessie MIPS系统。

gdbserver的源代码:

if (dyn->d_tag == DT_DEBUG && map == -1) 
    map = dyn->d_un.d_val; 

gdbserver的DBG打印

(gdb) p *dyn 
$19 = {d_tag = 21, d_un = {d_val = 0, d_ptr = 0}} 
(gdb) 

编辑

获取从这个链接的一些信息: https://sourceware.org/ml/binutils/2015-06/msg00166.html

我从Debian Jessie mips-pkg服务器安装了gdbserver。但它似乎不支持PIE。我可以在哪里安装可支持PIE的mips-gdbserver?

或者我该如何禁用gcc编译器生成PIE代码? 我在交叉编译中尝试了这些标志(-fno-pie -fPIC),但它仍然生成PIE代码。

libtool: link: mips-linux-gnu-gcc -mfp32 -fno-pie -fPIC 
     -ggdb -O0 -Wall -Wno-format -Wno-format-security 
     -Wno-pointer-sign -I/cross-mips/usr/include -I/cross-mips/usr/include/libnl3 
     -I/cross-mips/usr/include/mips-linux-gnu 
     -I/work/strongswan/src/util 
     -include /work/strongswan/config.h 
     -o .libs/charon charon.o -L/cross-mips/lib/mips-linux-gnu 
     - L/cross-mips -L/cross-mips/usr/lib/mips-linux-gnu 
     ../../src/libstrongswan/.libs/libstrongswan.so 
     -lm -lpthread -ldl -Wl,-rpath -Wl,/usr/lib/strongswan 

检查生成的代码:

mips-linux-gnu-readelf -r src/charon/.libs/charon 

Relocation section '.rel.dyn' at offset 0xcf0 contains 2 entries: 
Offset  Info Type   Sym.Value Sym. Name 
00000000 00000000 R_MIPS_NONE 
00013870 00000003 R_MIPS_REL32 

解决方案 不幸的是,原因是我的编译器GCC-6是峨眉。我用'gcc版本6.3.0 20170516(Debian 6.3.0-18)'。它配置了'--enable-default-pie'。并且无法禁用PIE。这个PIE打破了静态库链接。我必须将我的编译器更改为gcc5。

+0

当你发出'info shared'命令时,你究竟在哪里停止了你的二进制文件? –

+0

命令'运行'几秒后,我发出'Ctrl-C'中断程序,并发出'info shared'。 – PokerFace

从您提供的信息,似乎有两个可能的原因:

  1. 要么你完全剥离的二进制文件,并gdbserver需要一些符号或

  2. 你正在建设一个PIE二进制文件和gdbserver不支持此类二进制文件。

(这也有可能是它的1和2的结合引起该问题。)

既然你知道分布的二进制文件,你最好的选择可能是理解它们之间的区别你的二进制文件,并最小化这种差异,直到gdbserver开始工作。