| 2010年6月18日
GUN 工具学习
作者:许振文
nm
nm默认的输入文件为a.out,也就是说,如果nm后面没有跟要查看的二进制文件名的话, 那它会默认读取当前文件夹下的a.out文件作为其输入。
在使用nm中会有一下几种表示符号类型的标识:
- A:符号值是绝对的,不会被后面的连接所修改
- B:符号在未初始数据段中
- C:是一个在未初始数据段中的普通符号
- D:符号在初始化后的数据段中
- G:在初始化数据段中小对象的符号
- I:一个符号的间接符号
- N:这个符号是调试符号
- R:只读符号
- S:未初始化数据段中小对象符号
- T:代码段中的符号
- U:为定义符号
- V:这个符号是一个弱对象,当一个普通定义了的符号连接到一个弱定义符号,是没错的,但是一个没有定义的符号接到弱未定义符号,那弱符号就变成没错的零了。
- -:
- ?:符号类型未知,或是文件具体格式未知
该工具使用格式: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 用户命令, 可由任何人启动的。
- 2 系统调用, 即由内核提供的函数。
- 3 例程, 即库函数。
- 4 设备, 即/dev目录下的特殊文件。
- 5 文件格式描述, 例如/etc/passwd。
- 6 游戏, 不用解释啦!
- 7 杂项, 例如宏命令包、惯例等。
- 8 系统管理员工具, 只能由root启动。
- 9 其他(Linux特定的), 用来存放内核例行程序的文档。
- n 新文档, 可能要移到更适合的领域。
- o 老文档, 可能会在一段期限内保留。
- 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 实现,一般不推荐修改。
关注「黑光技术」,关注大数据+微服务