首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于ldd (或objdump)的API?

用于ldd (或objdump)的API?
EN

Stack Overflow用户
提问于 2020-03-18 06:30:14
回答 1查看 269关注 0票数 0

我需要以编程方式检查给定可执行文件的库依赖关系。有比运行ldd (或objdump)命令和解析它们的输出更好的方法吗?是否有一个提供与ldd相同结果的API?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-23 02:40:42

我需要以编程方式检查给定可执行文件的库依赖关系。

我将假设您使用的是ELF系统(可能是Linux)。

可执行文件或共享库的动态库依赖项被编码为库的Elf{32_,64}_Dyn段中的PT_DYNAMIC条目或可执行文件中的表。ldd (间接地,但这是实现细节)解释这些条目,然后使用系统配置和/或LD_LIBRARY_PATH环境变量的各种细节来定位所需的库。

您可以使用PT_DYNAMIC打印readelf -d a.out的内容。例如:

代码语言:javascript
复制
$ readelf -d /bin/date

Dynamic section at offset 0x19df8 contains 26 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000c (INIT)               0x3000
 0x000000000000000d (FINI)               0x12780
 0x0000000000000019 (INIT_ARRAY)         0x1a250
 0x000000000000001b (INIT_ARRAYSZ)       8 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x1a258
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x000000006ffffef5 (GNU_HASH)           0x308
 0x0000000000000005 (STRTAB)             0xb38
 0x0000000000000006 (SYMTAB)             0x358
 0x000000000000000a (STRSZ)              946 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x1b000
 0x0000000000000002 (PLTRELSZ)           1656 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x2118
 0x0000000000000007 (RELA)               0x1008
 0x0000000000000008 (RELASZ)             4368 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffb (FLAGS_1)            Flags: PIE
 0x000000006ffffffe (VERNEED)            0xf98
 0x000000006fffffff (VERNEEDNUM)         1
 0x000000006ffffff0 (VERSYM)             0xeea
 0x000000006ffffff9 (RELACOUNT)          170
 0x0000000000000000 (NULL)               0x0

这告诉您,这个二进制文件所需的惟一库是libc.so.6 ( NEEDED条目)。

如果您真正的问题是“这个ELF二进制文件需要什么其他库”,那么这很容易获得:只需在动态符号表中查找DT_NEEDED条目即可。以编程的方式这样做相当容易:

starts).

  • Iterate

  • 找到程序头的表( ELF文件头.e_phoff告诉您在哪里查找具有PT_DYNAMIC .p_type.

  • That段的文件头,其中包含一组固定大小的Elf{32,64}_Dyn records.

  • Iterate,查找带有.d_tag == DT_NEEDED.

的文件头)。

瞧。

有点复杂:字符串(如libc.so.6 )不是PT_DYNAMIC的一部分。但是有一个指针指向它们在.d_tag == DT_STRTAB条目中的位置。例如,请参阅this answer代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60734480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档