如何列出非本机二进制文件的库依赖项?

lve*_*lla 56 linux gcc shared-libraries cross-compiling binutils

在为本机平台开发时,我可以使用ldd列出所有共享库(.so文件)我构建的二进制可执行文件将在启动时尝试加载.但是当交叉编译时,我不知道如何获得相同的信息.这ldd不是一个普通的binutils实用程序,比如strip或者ar,可以和gcc交叉编译一起构建,但相反,它是一个神秘的shell脚本,显然只能在本机平台上运行.

那么,使用跨目标binutils工具,有没有办法获得外部二进制文件的动态链接依赖项列表?

Emp*_*ian 77

有没有办法获得外部二进制文件的动态链接依赖项列表

您可以轻松地列出二进制文件的直接依赖关系:

readelf -d a.out | grep NEEDED

 0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
Run Code Online (Sandbox Code Playgroud)

我知道无法以递归方式继续获取完整列表(如同ldd).您必须NEEDED手动重复每个库的过程.


Bas*_*tch 13

你可以做到bash -x ldd /bin/ls了解ldd正在做什么.该ldd脚本并不是"神秘".它基本上运行

LD_TRACE_LOADED_OBJECTS=1 /lib64/ld-linux-x86-64.so.2 /bin/ls
Run Code Online (Sandbox Code Playgroud)

所以它使用系统的动态加载器(因为结果ldd取决于您的实际环境和系统!).但是你可以用objdump -x /bin/ls可执行文件的动态部分来检查,例如

% objdump -x /bin/ls
  /bin/ls:     file format elf64-x86-64
  /bin/ls
  architecture: i386:x86-64, flags 0x00000112:
  EXEC_P, HAS_SYMS, D_PAGED
  start address 0x00000000004046d4

  Program Header:
      PHDR off    0x0000000000000040 vaddr 0x0000000000400040 paddr 0x0000000000400040 align 2**3
           filesz 0x00000000000001c0 memsz 0x00000000000001c0 flags r-x
    INTERP off    0x0000000000000200 vaddr 0x0000000000400200 paddr 0x0000000000400200 align 2**0
           filesz 0x000000000000001c memsz 0x000000000000001c flags r--
      LOAD off    0x0000000000000000 vaddr 0x0000000000400000 paddr 0x0000000000400000 align 2**21
           filesz 0x0000000000019ef4 memsz 0x0000000000019ef4 flags r-x
      LOAD off    0x000000000001a000 vaddr 0x000000000061a000 paddr 0x000000000061a000 align 2**21
           filesz 0x000000000000077c memsz 0x0000000000001500 flags rw-
   DYNAMIC off    0x000000000001a028 vaddr 0x000000000061a028 paddr 0x000000000061a028 align 2**3
           filesz 0x00000000000001d0 memsz 0x00000000000001d0 flags rw-
      NOTE off    0x000000000000021c vaddr 0x000000000040021c paddr 0x000000000040021c align 2**2
           filesz 0x0000000000000044 memsz 0x0000000000000044 flags r--
  EH_FRAME off    0x0000000000017768 vaddr 0x0000000000417768 paddr 0x0000000000417768 align 2**2
           filesz 0x00000000000006fc memsz 0x00000000000006fc flags r--
     STACK off    0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**3
           filesz 0x0000000000000000 memsz 0x0000000000000000 flags rw-

  Dynamic Section:
    NEEDED               libselinux.so.1
    NEEDED               librt.so.1
    NEEDED               libacl.so.1
    NEEDED               libc.so.6
    INIT                 0x0000000000402148
    FINI                 0x00000000004125f8
    HASH                 0x0000000000400260
    GNU_HASH             0x00000000004005c0
    STRTAB               0x0000000000401100
    SYMTAB               0x0000000000400620
    STRSZ                0x00000000000004d7
    SYMENT               0x0000000000000018
    DEBUG                0x0000000000000000
    PLTGOT               0x000000000061a208
    PLTRELSZ             0x0000000000000990
    PLTREL               0x0000000000000007
    JMPREL               0x00000000004017b8
    RELA                 0x0000000000401740
    RELASZ               0x0000000000000078
    RELAENT              0x0000000000000018
    VERNEED              0x00000000004016c0
    VERNEEDNUM           0x0000000000000003
    VERSYM               0x00000000004015d8

  Version References:
    required from librt.so.1:
      0x09691a75 0x00 05 GLIBC_2.2.5
    required from libacl.so.1:
      0x05822452 0x00 06 ACL_1.2
      0x05822450 0x00 04 ACL_1.0
    required from libc.so.6:
      0x09691a75 0x00 03 GLIBC_2.2.5
      0x0d696913 0x00 02 GLIBC_2.3
Run Code Online (Sandbox Code Playgroud)

同样,实际依赖性取决于运行二进制文件的系统(例如,因为我可以在某个地方LD_LIBRARY_PATH拥有自己的libc.so.6,这将是一个坏主意).

所以你需要一个交叉变体 objdump


Aja*_*kar 5

而在gdb,信息共享类似于ldd.它提供了可执行文件的完整人类可读运行时信息.
readelf错过路径和其他图书馆信息.
readelf是主持人研究的一个非常好的工具.开发者可以选择有效.