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

4
我可以使用"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”命令。我想获取符号的确切偏移量(而不仅仅是与符号相同的某些字符串)。

2个回答

1
但是,有没有一种方法可以从文件开头提取符号名称和偏移量呢?
当然有:为了打印名称,nm正在这样做。
您应该知道可能会有两个符号表:一个常规符号表和一个动态符号表(nm -D显示后者)。
符号本身存储在.dynsym部分(或常规符号表的.symtab部分),它们包含指向.dynstr部分的偏移量(实际上包含名称)。
因此,添加".dynstr".sh_offset + "symbol".st_name将为您提供文件中符号名称的偏移量。
示例代码here。(该代码使用.symtab.strtab;您需要调整它以使用.dynsym.dynstr来打印动态符号表。)

0
你可以自己计算偏移量,或者通过objdump的-F/--file-offsets选项获取它。
   -F
   --file-offsets
       When disassembling sections, whenever a symbol is displayed,
       also display the file offset of the region of data that is
       about to be dumped.  If zeroes are being skipped, then when
       disassembly resumes, tell the user how many zeroes were
       skipped and the file offset of the location from where the
       disassembly resumes.  When dumping sections, display the file
       offset of the location from where the dump starts.

例如,要获取libc中strlen符号的文件偏移量:
$ objdump --file-offsets -d /lib/x86_64-linux-gnu/libc.so.6 | grep strlen
000000000009f630 <strlen@@GLIBC_2.2.5> (File Offset: 0x9f630):

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接