在计算机科学中,是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储的标准文件格式。 是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI)而开发和发布的,也是Linux的主要可执行文件格式。
ELF文件由4部分组成,分别是ELF头(ELF header)、程序头表(Program header table)、节(Section)和节头表(Section header table)。实际上,一个文件中不一定包含全部内容,而且他们的位置也未必如同所示这样安排,只有ELF头的位置是固定的,其余各部分的位置、大小等信息有ELF头中的各项值来决定。
linux下直接readelf -a xxx.so 显示elf格式的信息,通过参数来控制显示特定信息
readelf -d filename.so 查看共享库的以来库 和搜索名字
readelf -h filename.so 显示elf头信息
readelf readelf -s *.so objdump objump -t *.so
- nm -D XXX.so
- objdump -tT XXX.so
————————————— 我是分割线————————————————–
linux中,nm用来列出目标文件的符号清单。 下面是nm命令的格式: nm [-a|–debug-syms] [-g|–extern-only] [-B][-C|–demangle] [-D|–dynamic] [-s|–print-armap][-o|–print-file-name] [-n|–numeric-sort][-p|–no-sort] [-r|–reverse-sort] [–size-sort][-u|–undefined-only] [-l|–line-numbers] [–help][–version] [-t radix|–radix=radix][-P|–portability] [-f format|–format=format][–target=bfdname] [objfile…] 如果没有为nm命令指出目标文件,则nm假定目标文件是a.out。下面列出该命令的任选项,大部分支持“-”开头的短格式和“—“开头的长格式。 -A、-o或–print-file-name:在找到的各个符号的名字前加上文件名,而不是在此文件的所有符号前只出现文件名一次。
-a或–debug-syms:显示调试符号。 -B:等同于–format=bsd,用来兼容MIPS的nm。 -C或–demangle:将低级符号名解码(demangle)成用户级名字。这样可以使得C++函数名具有可读性。 -D或–dynamic:显示动态符号。该任选项仅对于动态目标(例如特定类型的共享库)有意义。
-f format:使用format格式输出。format可以选取bsd、sysv或posix,该选项在GNU的nm中有用。默认为bsd。 -g或–extern-only:仅显示外部符号。 -n、-v或–numeric-sort:按符号对应地址的顺序排序,而非按符号名的字符顺序。 -p或–no-sort:按目标文件中遇到的符号顺序显示,不排序。 -P或–portability:使用POSIX.2标准输出格式代替默认的输出格式。等同于使用任选项-f posix。 -s或–print-armap:当列出库中成员的符号时,包含索引。索引的内容包含:哪些模块包含哪些名字的映射。 -r或–reverse-sort:反转排序的顺序(例如,升序变为降序)。 –size-sort:按大小排列符号顺序。该大小是按照一个符号的值与它下一个符号的值进行计算的。 -t radix或–radix=radix:使用radix进制显示符号值。radix只能为“d”表示十进制、“o”表示八进制或“x”表示十六进制。 –target=bfdname:指定一个目标代码的格式,而非使用系统的默认格式。 -u或–undefined-only:仅显示没有定义的符号(那些外部符号)。
-l或–line-numbers:对每个符号,使用调试信息来试图找到文件名和行号。对于已定义的符号,查找符号地址的行号。对于未定义符号,查找指向符号重定位入口的行号。如果可以找到行号信息,显示在符号信息之后。 -V或–version:显示nm的版本号。 –help:显示nm的任选项。 ————————————— 我是分割线————————————————–
objdump命令是Linux下的反汇编目标文件或者可执行文件的命令,它还有其他作用,下面以ELF格式可执行文件test为例详细介绍:
objdump -f test
显示test的文件头信息
objdump -d test
反汇编test中的需要执行指令的那些section
objdump -D test
与-d类似,但反汇编test中的所有section
objdump -h test
显示test的Section Header信息
objdump -x test
显示test的全部Header信息
objdump -s test
除了显示test的全部Header信息,还显示他们对应的十六进制文件代码
————————————— 我是分割线————————————————–
readelf命令是Linux下的分析ELF文件的命令,这个命令在分析ELF文件格式时非常有用,下面以ELF格式可执行文件test为例详细介绍:
readelf -v
显示版本
readelf -h
显示帮助
readelf -a test
显示test的全部信息
readelf -h test
显示test的ELF Header的文件头信息(就是ELF文件开始的前52个字节)
readelf -l test
显示test的Program Header Table中的每个Prgram Header Entry的信息(如果有)
readelf -S test
显示test的Section Header Table中的每个Section Header Entry的信息(如果有)
readelf -g test
显示test的Section Group的信息(如果有)
readelf -s test
显示test的Symbol Table中的每个Symbol Table Entry的信息(如果有)
readelf -e test
显示test的全部头信息(包括ELF Header,Section Header和Program Header,等同与 readelf -h -l -S test)
readelf -n test
显示test的note段的信息(如果有)
readelf -r test
显示test中的可重定位段的信息(如果有)
readelf -d test
显示test中的Dynamic Section的信息(如果有)
readelf -V test
显示test中的GNU Version段信息(如果有)