GUN 工具学习

| 2010年6月18日

GUN 工具学习

作者:许振文

nm

nm默认的输入文件为a.out,也就是说,如果nm后面没有跟要查看的二进制文件名的话, 那它会默认读取当前文件夹下的a.out文件作为其输入。

在使用nm中会有一下几种表示符号类型的标识:

  1. A:符号值是绝对的,不会被后面的连接所修改
  2. B:符号在未初始数据段中
  3. C:是一个在未初始数据段中的普通符号
  4. D:符号在初始化后的数据段中
  5. G:在初始化数据段中小对象的符号
  6. I:一个符号的间接符号
  7. N:这个符号是调试符号
  8. R:只读符号
  9. S:未初始化数据段中小对象符号
  10. T:代码段中的符号
  11. U:为定义符号
  12. V:这个符号是一个弱对象,当一个普通定义了的符号连接到一个弱定义符号,是没错的,但是一个没有定义的符号接到弱未定义符号,那弱符号就变成没错的零了。
  13. -:
  14. ?:符号类型未知,或是文件具体格式未知

该工具使用格式:nm option(s) file option(s):取自下面所罗列的参数 file:要查看的二进制文件名称

helight@Zhwen:~$ nm -h
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
显示格式为BSD格式
 -C, --demangle[=STYLE] Decode low-level symbol names into user-level names
                         The 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
 -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 and line number for each symbol
使用调试信息找到每个符号的文件名和行号
 -n, --numeric-sort     Sort symbols numerically by address
将符号按照其地址排序
 -o                     Same as -A
和-A的功能是一样的
 -p, --no-sort          Do not sort the symbols
不排序
 -P, --portability      Same as --format=posix
使用posix格式显示
 -r, --reverse-sort    Reverse the sense of the sort
使用倒序排列
 -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
使用RADIX来显示符号值,使用BFDNAME格式来区分目标对象
 -u, --undefined-only   Display only undefined symbols
显示未定义的符号
 -X 32_64               (ignored)
 @FILE                  Read options from FILE
从后面这个文件中读取参数
 -h, --help             Display this information
显示帮助信息
 -V, --version          Display this program's version number
显示nm这个工具本身的版本信息

nm: supported targets: elf32-i386 a.out-i386-linux efi-app-ia32 elf32-little elf32-big elf64-x86-64
efi-app-x86_64 elf64-little elf64-big srec symbolsrec tekhex binary ihex trad-core
Report bugs to <http://www.sourceware.org/bugzilla/>.

以上是nm所能够支持的文件格式。

readelf

readelf工具使用来显示一个或多个ELF格式文件信息的GNU工具。使用不同的参数可以查看ELF文件不同的的信息。 该工具使用格式:readelf option(s) elffile option(s):取自下面所罗列的参数 elffile:要查看的ELF文件名称

$readelf --help
Usage: readelf <option(s)> elf-file(s)
Display information about the contents of ELF format files
Options are:
 -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I
//显示所有ELF文件的信息。相当于在readelf后面加上参数-h, -l, -S, -s, -r, -d, -V, -A,
 -h --file-header       Display the ELF file header
//显示ELF文件的文件头
 -l --program-headers   Display the program headers
    --segments          An alias for --program-headers
//显示程序头(program-header)和程序段(segment)和段下面的节,不止一个文件头哦!
 -S --section-headers   Display the sections' header
    --sections          An alias for --section-headers
//显示较为详细的节信息(section)
 -g --section-groups    Display the section groups
//显示节组成的群(这个不一定有)
 -t --section-details   Display the section details
//也是显示较为详细的节信息,和-S差不多一样,个人喜欢使用-S(这个显示的信息比较整齐)
 -e --headers           Equivalent to: -h -l -S
//显示头信息:包括ELF文件头,程序头,段,和节信息,相当于-h -l -S
 -s --syms              Display the symbol table
     --symbols          An alias for --syms
//显示符号信息,
 -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)
//显示版本节点信息。ELF文件中有一些节点专门用来说明文件或是系统的版本信息的
 -A --arch-specific     Display architecture specific information (if any).
//显示体系结构相关的信息
 -D --use-dynamic       Use the dynamic section info when displaying symbols
//在显示符号时使用动态节信息
 -x --hex-dump=<number> Dump the contents of section <number>

 -w[liaprmfFsoR] or
 --debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=str,=loc,=Ranges]
                        Display the contents of DWARF2 debug sections
 -I --histogram         Display histogram of bucket list lengths
 -W --wide              Allow output width to exceed 80 characters
//允许显示一行超过80个字符
 @<file>                Read options from <file>
//从后面这个文件中读取参数
 -H --help              Display this information
//显示帮助信息
 -v --version           Display the version number of readelf
//显示readelf这个工具的版本信息

objdump

/未完成/ ogjdump工具使用来查看一个或是多个目标文件信息的一种工具,具体的参数控制显示不同的信息。 这个工具主要对编程人员比较有用。

helight@Zhwen:test$ objdump -H
Usage: objdump <option(s)> <file(s)>
Display information from object <file(s)>.
以下是在使用objdump工具时必须要加的参数(至少一个)
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
 -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, --dwarf              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
 @<file>                  Read options from <file>
 -v, --version            Display this program's version number
 -i, --info               List object formats and architectures supported
 -H, --help               Display this information<br><br>

以下是可选参数
The following switches are optional:
 -b, --target=BFDNAME           Specify the target object format as BFDNAME
 -m, --architecture=MACHINE     Specify the target architecture as MACHINE
 -j, --section=NAME             Only display information for section NAME
 -M, --disassembler-options=OPT Pass text OPT on to the disassembler
 -EB --endian=big               Assume big endian format when disassembling
 -EL --endian=little            Assume little endian format when disassembling
     --file-start-context       Include context from start of file (with -S)
 -I, --include=DIR              Add DIR to search list for source files
 -l, --line-numbers             Include line numbers and filenames in output
 -C, --demangle[=STYLE]         Decode mangled/processed symbol names
                                 The STYLE, if specified, can be `auto', `gnu',
                                 `lucid', `arm', `hp', `edg', `gnu-v3', `java'
                                 or `gnat'
 -w, --wide                     Format output for more than 80 columns
 -z, --disassemble-zeroes       Do not skip blocks of zeroes when disassembling
     --start-address=ADDR       Only process data whose address is >= ADDR
     --stop-address=ADDR        Only process data whose address is <= ADDR
     --prefix-addresses         Print complete address alongside disassembly
     --[no-]show-raw-insn       Display hex alongside symbolic disassembly
     --adjust-vma=OFFSET        Add OFFSET to all displayed section addresses
     --special-syms             Include special symbols in symbol dumps

objdump: supported targets: elf32-i386 a.out-i386-linux efi-app-ia32 elf32-little elf32-big elf64-x86-64
efi-app-x86_64 elf64-little elf64-big srec   symbolsrec tekhex binary ihex trad-core
objdump: supported architectures: i386 i386:x86-64 i8086 i386:intel i386:x86-64:intel

这是objdump工具所能够支持的文件格式。

The following i386/x86-64 specific disassembler options are supported for use
with the -M switch (multiple options should be separated by commas):
下面是针对于i386/x86-64中具体的反汇编格式的选择,使用-M来选择。多个参数使用逗号隔开。
 x86-64      Disassemble in 64bit mode
 i386        Disassemble in 32bit mode
 i8086       Disassemble in 16bit mode
 att         Display instruction in AT&T syntax
 intel       Display instruction in Intel syntax
 addr64      Assume 64bit address size
 addr32      Assume 32bit address size
 addr16      Assume 16bit address size
 data32      Assume 32bit data size
 data16      Assume 16bit data size
 suffix      Always display instruction suffix in AT&T syntax
Report bugs to <http://www.sourceware.org/bugzilla/>.
helight@Zhwen:test$

ctags

用于生成符号索引,我主要用来阅读源代码。先在源代码文件夹中生成函数,变量等的索引,然后就可以是用”ctrl+]“和“ctrl+o”在函数 或是变量的定义和调用之间进行切换。

注意:这里说的查看是在vim,emasc,gvim等文本工具中查看。

一般使用一下几个命令:

“ctags -R”:创建符号索引。要在源代码文件夹内执行。在执行完之后会在所在文件夹产生一个“tags”的

文件,这个文件就是索引文件,在查找是都是以这个索引文件中的索引去在函数间转跳的。

“ctrl+]”是对某个函数或是变量定义的查找, “ctrl+o”是返回上一个查找处。

helight@Zhwen:~$ ctags --help
Exuberant Ctags 5.7, Copyright (C) 1996-2007 Darren Hiebert
 Compiled: Jun  9 2008, 09:07:41
 Addresses: <dhiebert@users.sourceforge.net>, http://ctags.sourceforge.net
 Optional compiled features: +wildcards, +regex

Usage: ctags [options] [file(s)]

 -a   Append the tags to an existing tag file.
将一个tags文件追加到一个已经存在的tags文件中
 -B   Use backward searching patterns (?...?).
使用向后搜索匹配
 -e   Output tag file for use with Emacs.
指定生成Emacs所使用的tags文件
 -f <name>
      Write tags to specified file. Value of "-" writes tags to stdout
      ["tags"; or "TAGS" when -e supplied].
将要生成的索引文件输出到这里指定的文件。
 -F   Use forward searching patterns (/.../) (default).
使用向前搜索匹配
 -h <list>
      Specify list of file extensions to be treated as include files.
      [".h.H.hh.hpp.hxx.h++"].
处理指定列表中文件,即只是对指定列表中的文件生成索引。
 -I <list|@file>
      A list of tokens to be specially handled is read from either the
      command line or the specified file.
要处理的指定符号,符号可以是在文件中指定的或是命令行中的。
 -L <file>
      A list of source file names are read from the specified file.
      If specified as "-", then standard input is read.
 -n   Equivalent to --excmd=number.
这个是在索引中是否一定标注行号
 -N   Equivalent to --excmd=pattern.

 -o   Alternative for -f.
-f 的另一种表示
 -R   Equivalent to --recurse.
这里是说递归将子文件夹中的文件也进行操作
 -u   Equivalent to --sort=no.
相当于参数“--sort=no”就是不将索引符号排序,这样查找比价慢
 -V   Equivalent to --verbose.
是否对每个源文件使用描述
 -x   Print a tabular cross reference file to standard output.
将索引信息的表格打印到标准输出
 --append=[yes|no]
      Should tags should be appended to existing tag file [no]?
是否将要生成的tags文件追加到已经存在的tags文件中。
 --etags-include=file
     Include reference to 'file' in Emacs-style tag file (requires -e).
 --exclude=pattern
     Exclude files and directories matching 'pattern'.
包含指定匹配的文件或是目录
 --excmd=number|pattern|mix
      Uses the specified type of EX command to locate tags [mix].
对当地tags文件使用指定的命令。
 --extra=[+|-]flags
     Include extra tag entries for selected information (flags: "fq").
包含外加的tag文件
 --fields=[+|-]flags
     Include selected extension fields (flags: "afmikKlnsStz") [fks].
 --file-scope=[yes|no]
      Should tags scoped only for a single file (e.g. "static" tags
      be included in the output [yes]?
 --filter=[yes|no]
      Behave as a filter, reading file names from standard input and
      writing tags to standard output [no].
 --filter-terminator=string
      Specify string to print to stdout following the tags for each file
      parsed when --filter is enabled.
 --format=level
      Force output of specified tag file format [2].
 --help
      Print this option summary.
显示所支持的参数及其信息
 --if0=[yes|no]
      Should C code within #if 0 conditional branches be parsed [no]?
 --<LANG>-kinds=[+|-]kinds
      Enable/disable tag kinds for language <LANG>.
 --langdef=name
      Define a new language to be parsed with regular expressions.
 --langmap=map(s)
      Override default mapping of language to source file extension.
 --language-force=language
      Force all files to be interpreted using specified language.
强制使用指定的语言
 --languages=[+|-]list
      Restrict files scanned for tags to those mapped to langauges
      specified in the comma-separated 'list'. The list can contain any
      built-in or user-defined language [all].
 --license
      Print details of software license.
显示这个工具的许可证
 --line-directives=[yes|no]
      Should #line directives be processed [no]?
 --links=[yes|no]
      Indicate whether symbolic links should be followed [yes].
 --list-kinds=[language|all]
      Output a list of all tag kinds for specified language or all.
 --list-languages
      Output list of supported languages.
 --list-maps=[language|all]
      Output list of language mappings.
 --options=file
      Specify file from which command line options should be read.
 --recurse=[yes|no]
      Recurse into directories supplied on command line [no].
 --regex-<LANG>=/line_pattern/name_pattern/[flags]
      Define regular expression for locating tags in specific language.
 --sort=[yes|no|foldcase]
      Should tags be sorted (optionally ignoring case) [yes]?.
是否将索引符号排序
 --tag-relative=[yes|no]
      Should paths be relative to location of tag file [no; yes when -e]?
是否件路径信息和tag文件相联系
 --totals=[yes|no]
      Print statistics about source and tag files [no].
显示源文件和tag文件的统计信息
 --verbose=[yes|no]
      Enable verbose messages describing actions on each source file.
使用对源文件描述
 --version
      Print version identifier to standard output.
显示版本信息
helight@Zhwen:~$

man

你会使用Linux操作系统下的MAN命令吗?

(1)所有的手册页都属于一个特定的领域,用一个字符来表示。 Linux下最通用的领域及其名称及说明如下: 领域 名称 说明

  1. 1 用户命令, 可由任何人启动的。
  2. 2 系统调用, 即由内核提供的函数。
  3. 3 例程, 即库函数。
  4. 4 设备, 即/dev目录下的特殊文件。
  5. 5 文件格式描述, 例如/etc/passwd。
  6. 6 游戏, 不用解释啦!
  7. 7 杂项, 例如宏命令包、惯例等。
  8. 8 系统管理员工具, 只能由root启动。
  9. 9 其他(Linux特定的), 用来存放内核例行程序的文档。
  10. n 新文档, 可能要移到更适合的领域。
  11. o 老文档, 可能会在一段期限内保留。
  12. l 本地文档, 与本特定系统有关的。 例如:man ls就会有LS(1)

(2)man的一些常用参数和用法

man -a cmd

打开所有领域内的同名帮助,例如 man fam ,你首先会进入一个fam(1M)的命令版fam帮助,你再按q键 就会进入FAM(3X),库函数版的帮助

man -aw cmd

显示所有cmd的所有手册文件的路径,如 man -aw fam 就是

/usr/share/man/man1/fam.1m.gz
/usr/share/man/man3/fam.3x.gz

man 领域代号 cmd 直接指定特定领域内搜索手册页,如 man 3 fam 直接进入库函数版的帮助

man -M cmd

指定手册文件的搜索路径,如 man -M /home/mysql/man mysql 显示的就是你安装的mysql的帮助, 而不是系统自带的旧版mysql的帮助

man cmd| col -b > cmd.txt

把man手册信息输出到文本文件 LANG=语言代号

man -w cmd

man 特定语言manpage文件的路径 查看特定语言版本的手册页 例如,要查看mplayer的中文man

shell> LANG=zh
shell> man -w mplayer
/usr/share/man/zh/man1/mplayer.1.gz

新开一个shell窗口(或在原窗口 shell> LANG=en_US.UTF-8)

shell> man /usr/share/man/zh/man1/mplayer.1.gz

(3)man的配置文件/etc/man.config 如果你不想每次man cmd都要用-M指定路径,那么可以通过修改配置文件,添加内容如

MANPATH /home/mysql/man

man在各领域的搜索次序可以通过修改 MANSECT 1:8:2:3:4:5:6:7:9:tcl:n:l:p 实现,一般不推荐修改。

看完本文有收获?请分享给更多人

关注「黑光技术」,关注大数据+微服务