linux中有三个常用的查询符号表的命令,分别是nm、objdump和readelf。
1、nm命令
这个是最常用的命令,可以用于查询二进制文件中的符号表,包括目标文件(.o)、静态库(.a、.lib)和动态库(.so)等;
nm xxx.o
该命令可以用来处理多种文件格式,如ELF、COFF、目标文件、静态库、动态库等;
该命令在列出符号时,会显示符号类型:
T
:全局文本符号(函数)D
:全局数据符号B
:未初始化的全局数据符号U
:未定义符号
nm还有一些常用的选项,使用的时候可以使用nm --help命令查询,大致如下:
Usage: nm [option(s)] [file(s)]List symbols in [file(s)] (a.out by default).The options are:-a, --debug-syms Display debugger-only symbols-A, --print-file-name Print name of the input file before every symbol-B Same as --format=bsd-C, --demangle[=STYLE] Decode low-level symbol names into user-level namesThe STYLE, if specified, can be `auto' (the default),`gnu', `lucid', `arm', `hp', `edg', `gnu-v3', `java'or `gnat'--no-demangle Do not demangle low-level symbol names--recurse-limit Enable a demangling recursion limit. This is the default.--no-recurse-limit Disable a demangling recursion limit.-D, --dynamic Display dynamic symbols instead of normal symbols--defined-only Display only defined symbols-e (ignored)-f, --format=FORMAT Use the output format FORMAT. FORMAT can be `bsd',`sysv' or `posix'. The default is `bsd'-g, --extern-only Display only external symbols-l, --line-numbers Use debugging information to find a filename andline number for each symbol-n, --numeric-sort Sort symbols numerically by address-o Same as -A-p, --no-sort Do not sort the symbols-P, --portability Same as --format=posix-r, --reverse-sort Reverse the sense of the sort--plugin NAME Load the specified plugin-S, --print-size Print size of defined symbols-s, --print-armap Include index for symbols from archive members--size-sort Sort symbols by size--special-syms Include special symbols in the output--synthetic Display synthetic symbols as well-t, --radix=RADIX Use RADIX for printing symbol values--target=BFDNAME Specify the target object format as BFDNAME-u, --undefined-only Display only undefined symbols--with-symbol-versions Display version strings after symbol names-X 32_64 (ignored)@FILE Read options from FILE-h, --help Display this information-V, --version Display this program's version number
2、objdump命令
该命令的主要功能:
(1)显示文件头信息:可以查看可执行文件或目标文件的头部信息,包括格式、架构等;
(2)反汇编:将机器代码转为汇编语言
objdump -d <filename>
(3)显示符号表
objdump -t xxx.o
(4)显示节信息
可以查看文件中各个节(section)及大小、地址等;
objdump -h <filename>
(5)显示重定位信息,便于理解如何链接和加载程序。
objdump -R <filename>
(6)显示调试信息,如果文件包含调试信息,可以使用如下命令查看。
objdump -g <filename>
该命令除了可以查看符号表外,还有一些其他操作,使用时可以借助objdump --help查看。
Usage: objdump <option(s)> <file(s)>Display information from object <file(s)>.At least one of the following switches must be given:-a, --archive-headers Display archive header information-f, --file-headers Display the contents of the overall file header-p, --private-headers Display object format specific file header contents-P, --private=OPT,OPT... Display object format specific contents-h, --[section-]headers Display the contents of the section headers-x, --all-headers Display the contents of all headers-d, --disassemble Display assembler contents of executable sections-D, --disassemble-all Display assembler contents of all sections-S, --source Intermix source code with disassembly-s, --full-contents Display the full contents of all sections requested-g, --debugging Display debug information in object file-e, --debugging-tags Display debug information using ctags style-G, --stabs Display (in raw form) any STABS info in the file-W[lLiaprmfFsoRtUuTgAckK] or--dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges,=pubtypes,=gdb_index,=trace_info,=trace_abbrev,=trace_aranges,=addr,=cu_index,=links,=follow-links]Display DWARF info in the file-t, --syms Display the contents of the symbol table(s)-T, --dynamic-syms Display the contents of the dynamic symbol table-r, --reloc Display the relocation entries in the file-R, --dynamic-reloc Display the dynamic relocation entries in the file
...省略其他
3、readelf命令
这个命令用于显示符号表(ELF)格式文件的信息,同样可以使用-s选项查看符号表,示例:
readelf -s xxx.o
同样实际使用过程中可以借助readelf --help命令查询支持的一起其他选项。
注意,该命令只能用于查看和分析ELF(Executable and Linkable Format)格式文件的工具。
Usage: readelf <option(s)> elf-file(s)Display information about the contents of ELF format filesOptions are:-a --all Equivalent to: -h -l -S -s -r -d -V -A -I-h --file-header Display the ELF file header-l --program-headers Display the program headers--segments An alias for --program-headers-S --section-headers Display the sections' header--sections An alias for --section-headers-g --section-groups Display the section groups-t --section-details Display the section details-e --headers Equivalent to: -h -l -S-s --syms Display the symbol table--symbols An alias for --syms--dyn-syms Display the dynamic symbol table-n --notes Display the core notes (if present)-r --relocs Display the relocations (if present)-u --unwind Display the unwind info (if present)-d --dynamic Display the dynamic section (if present)-V --version-info Display the version sections (if present)-A --arch-specific Display architecture specific information (if any)-c --archive-index Display the symbol/file index in an archive-D --use-dynamic Use the dynamic section info when displaying symbols-x --hex-dump=<number|name>Dump the contents of section <number|name> as bytes-p --string-dump=<number|name>Dump the contents of section <number|name> as strings-R --relocated-dump=<number|name>Dump the contents of section <number|name> as relocated bytes-z --decompress Decompress section before dumping it
...省略其他