首页 > 解决方案 > 如何提取符号并在文件中查看它们的偏移量

问题描述

我可以使用“nm -a -D”命令提取符号。
但是有没有办法从文件开头提取带有偏移量的符号名称?

例如,

nm -D ./libc.so

给我看这个——

...
00000000000f8c60 T xdr_wrapstring
00000000000f7cc0 T xencrypt
00000000000bd230 T __xmknod
00000000000bd2a0 T __xmknodat
000000000003ec70 T __xpg_basename
00000000000314b0 W __xpg_sigpause
0000000000080db0 T __xpg_strerror_r
00000000000f6090 T xprt_register
00000000000f61f0 T xprt_unregister
00000000000bd110 T __xstat
00000000000bd110 T __xstat64

现在,我想从文件开头获取符号名称的偏移量,就像“strings -t x”命令显示字符串的偏移量一样 -

strings -t x ./libc.so | grep __xstat
  13af9 __xstat
  13fac __xstat64

我怎样才能做到这一点?

(我不能在“nm”命令的输出中使用“strings”命令,因为文件中可能有相同符号字符串的多个实例,我想获得符号的确切偏移量(不仅仅是一些字符串这与符号相同))

标签: linuxshared-librariessymbolselfnm

解决方案


但是有没有办法从文件开头提取带有偏移量的符号名称?

肯定是:nm正在做(为了打印名字)。

您应该知道可能有两个符号表:一个常规的和一个动态的(nm -D显示后者)。

符号本身存储在.dynsym节(或.symtab常规符号表的节)中,它们包含.dynstr节的偏移量(实际上包含名称)。

因此,添加".dynstr".sh_offset+"symbol".st_name将为您提供文件中符号名称的偏移量。

示例代码在这里。(代码使用.symtaband .strtab;您需要调整它以使用.dynsym.dynstr打印动态符号表。)


推荐阅读