ELF(Executable and Linkable Format,即可执行可链接文件格式),是目前常见的Linux、 Android可执行文件、共享库(.so)、目标文件( .o)以及Core 文件均为此格式。
nm命令是linux下自带的特定文件分析工具,一般用来检查分析二进制文件、库文件、可执行文件中的符号表,返回二进制文件中各段的信息。
[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 ……
第二列中字符所对应的含义:
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可让您集合许多文件,成为单一的备存文件。在备存文件中,所有成员文件皆保有原来的属性与权限。
例如,显示所有对象文件(.o文件)的列表:
[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
实例:
[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