如何提取符号并查看它们在文件中的偏移量

How to extract symbols and see their offset in the file

我可以使用 "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" 命令,因为文件中可能有多个相同符号字符串的实例,我想获得确切的符号的偏移量(不仅仅是一些与符号相同的字符串))

But is there a way to extract the symbol names with an offset from the start of the file?

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

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

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

所以添加 ".dynstr".sh_offset + "symbol".st_name 会给你文件中符号名称的偏移量。

示例代码。 (代码使用 .symtab.strtab;您需要调整它以使用 .dynsym.dynstr 来打印动态符号 table。)