ELF(Executable and Linkable Format,即可执行可链接文件格式),是目前常见的Linux、 Android可执行文件、共享库(.so)、目标文件( .o)以及Core 文件均为此格式。

nm

nm命令是linux下自带的特定文件分析工具,一般用来检查分析二进制文件、库文件、可执行文件中的符号表,返回二进制文件中各段的信息。

snippet.bash
[yz@bogon ~]$ nm ~/postgresql/pg_bin/bin/postgres
0000000000926880 r a1
0000000000926800 r a2
0000000000926780 r a3
0000000000926700 r a4
0000000000926680 r a5
0000000000926600 r a6
0000000000ba87a0 b abbrevcache
000000000078e0d0 T AbortBufferIO
000000000057d580 T AbortCurrentTransaction
0000000000ba2700 b abortedRecPtr
                 U abort@@GLIBC_2.2.5
000000000057d650 T AbortOutOfAnyTransaction
……
0000000000a03cc0 r alert.8094
……

nm输出内容解析

第二列中字符所对应的含义:

A     :符号的值是绝对值,不会被更改
B或b  :未被初始化的全局数据,放在.bss段
D或d  :已经初始化的全局数据
G或g  :指被初始化的数据,特指small objects
I     :另一个符号的间接参考
N     :debugging 符号
p     :位于堆栈展开部分
R或r  :属于只读存储区
S或s  :指为初始化的全局数据,特指small objects
T或t  :代码段的数据,.test段
U     :符号未定义
W或w  :符号为弱符号,当系统有定义符号时,使用定义符号,当系统未定义符号且定义了弱符号时,使用弱符号。
?    :unknown符号

列出 .so 的函数:

nm -D libtest.so

ar

ar命令用于建立或修改备存文件,或是从备存文件中抽取文件。

ar可让您集合许多文件,成为单一的备存文件。在备存文件中,所有成员文件皆保有原来的属性与权限。

例如,显示所有对象文件(.o文件)的列表:

snippet.bash
[yz@bogon ~]$ ar -t ~/postgresql/pg_bin/lib/libpq.a
fe-auth-scram.o
fe-connect.o
fe-exec.o
fe-lobj.o
fe-misc.o
fe-print.o
fe-protocol3.o
fe-secure.o
fe-trace.o
legacy-pqsignal.o
libpq-events.o
pqexpbuffer.o
fe-auth.o

ar选项

objdump

实例:

snippet.bash
[yz@bogon ~]$ objdump -h ~/postgresql/pg_bin/bin/postgres
 
/home/yz/postgresql/pg_bin/bin/postgres:     文件格式 elf64-x86-64
 
节:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .interp       0000001c  00000000004002a8  00000000004002a8  000002a8  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  1 .note.gnu.build-id 00000024  00000000004002c4  00000000004002c4  000002c4  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  2 .note.ABI-tag 00000020  00000000004002e8  00000000004002e8  000002e8  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .gnu.hash     000139c4  0000000000400308  0000000000400308  00000308  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .dynsym       0003b058  0000000000413cd0  0000000000413cd0  00013cd0  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  5 .dynstr       0002cfe3  000000000044ed28  000000000044ed28  0004ed28  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  6 .gnu.version  00004eb2  000000000047bd0c  000000000047bd0c  0007bd0c  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  7 .gnu.version_r 00000110  0000000000480bc0  0000000000480bc0  00080bc0  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
……

objdump命令是Linux下的反汇编目标文件或者可执行文件的命令,它还有其它作用,用于分析ELF文件:

列出 .so 的函数

objdump -tT libtest.so

参考