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

标签 c debugging gdb cross-compiling

我正在做交叉编译调试。 我的构建服务器 CPU 是 amd64。我的设备 CPU 是 MIPS。 当我尝试调试自己编译的elf文件时。 gdb 只能显示 ld.so.1

(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 文件。它表明共享库已加载。

root@TRA:/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 Package 服务器安装的文件,那么 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 命令“info sharedlibrary”不能显示所有库?我该如何解决?


(编辑)

(是否每个可执行文件都需要库 ld.so?它丢失了。)

命令“mips-linux-gnu-readelf -d src/charon/.libs/charon”的输出

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

编辑

调试 GDB: gdb 查询“qXfer:libraries-svr4:read”返回空库列表。

 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:libraries-svr4:read”返回完整的共享库列表。

gdbserver 如何构造这个查询“qXfer:libraries-svr4:read”的回复?


编辑

还有一条线索:

从 debian Jessie distribute 安装的 pkgs 不是 PIE 代码。 我编译的代码是PIE代码。

root@TRA:/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

root@TRA:/proc/14956# readelf -r /usr/bin/id

There are no relocations in this file.
root@TRA:/proc/14956#

编辑

调试gdbserver后,发现一个奇怪的信息。 running proc的DT_DEBUG entry为0,loader重定位代码后,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。

最佳答案

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

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

  2. 您正在构建 PIE 二进制文件,而您系统上的 gdbserver 不支持此类二进制文件。

(也有可能是1和2的组合导致了问题。)

既然您知道分发二进制文件可以工作,您最好的办法可能是了解它们与您的二进制文件之间的差异,并在 gdbserver 开始工作之前尽量减少这些差异。

关于c - GDB 命令 'info sharedlibrary' 无法显示所有库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46297479/

相关文章:

c - 实现生产者/消费者沟通

stringByReplacingOccurrencesOfString 后调试器中的 Objective-C 奇怪外观

c++ - 如何在运行时查看我的 C 程序的内存布局?

linux - linux下用svgalib程序调试

c++ - 在 gdb 中显示参数包的值

c - 如何使用 openmp 在 c 中进行具有一些 for 循环的任务并行化?

c - 为什么我的代码不打印排序数组?

javascript - 如何获得浏览器诊断

python - 如何追溯日志错误?

c - C 中的字符串错误