TypeCodes

Unix系统中nm命令展示目标文件符号的方法

在unix系统中,通过gnu开源gcc或者g++工具生成的目标文件(object file),可以用nmobjdumpreadelf这三个命令来查看。

nm:显示目标文件中的符号;
objdump:打印目标文件中的详细信息;
readelf:显示关于 ELF 目标文件的信息。

之前在调试makefile文件的时候,链接动态库出错:libsrcpbl.so: undefined reference to 'gcProgramName'。也就是变量gcProgramName没定义,后来通过nm -u libsrcpbl.so命令辅助排查解决了。

为了更全面的了解一下这个命令,在自己的CentOS7.1机器上通过man nm操作查看gnu官方说明手册。同时,对里面涉及的一些opinion选项和nm命令显示的符号做了DESCRIPTION说明,供以后参考。

###### CentOS7.1上查看nm命令的man手册,部分选项仍未能理解。如有熟悉者请指教,谢谢!
[root@typecodes lib]# man nm
NM(1)                                                                  GNU Development Tools                                                                 NM(1)

NAME
       nm - list symbols from object files

SYNOPSIS【纲要】
       nm [-A|-o|--print-file-name] [-a|--debug-syms]
          [-B|--format=bsd] [-C|--demangle[=style]]
          [-D|--dynamic] [-fformat|--format=format]
          [-g|--extern-only] [-h|--help]
          [-l|--line-numbers] [-n|-v|--numeric-sort]
          [-P|--portability] [-p|--no-sort]
          [-r|--reverse-sort] [-S|--print-size]
          [-s|--print-armap] [-t radix|--radix=radix]
          [-u|--undefined-only] [-V|--version]
          [-X 32_64] [--defined-only] [--no-demangle]
          [--plugin name] [--size-sort] [--special-syms]
          [--synthetic] [--target=bfdname]
          [objfile...]

DESCRIPTION
       GNU nm lists the symbols from object files objfile....  If no object files are listed as arguments, nm assumes the file a.out.【GNU nm命令展示nm参数中的所有目标文件中的符号(默认目标文件是a.out)】

       For each symbol, nm shows:

       o   The symbol value, in the radix selected by options (see below), or hexadecimal by default.【符号是按照下面radix进制(默认十六进制)显示】

       o   The symbol type.  At least the following types are used; others are, as well, depending on the object file format.  If lowercase, the symbol is usually
           local; if uppercase, the symbol is global (external).  There are however a few lowercase symbols that are shown for special global symbols ("u", "v"
           and "w").【小写符号通常表示值是局部的,大写表示全局或外部的。小写u,v,w除外】

           "A" The symbol's value is absolute, and will not be changed by further linking.【符号的值是绝对固定的,在后面的链接中也不会改变】

           "B"
           "b" The symbol is in the uninitialized data section (known as BSS).【符号位于内存中未初始化的区域,即BSS段】

           "C" The symbol is common.  Common symbols are uninitialized data.  When linking, multiple common symbols may appear with the same name.  If the symbol
               is defined anywhere, the common symbols are treated as undefined references.【C表示符号类型是未初始化的。当链接时,可能出现多个常用符号同名,这时如果该符号值都被定义了,那么会被当作未定义的引用(重定义错误)】

           "D"
           "d" The symbol is in the initialized data section.【已经初始化的数据段(全局变量)】

           "G"
           "g" The symbol is in an initialized data section for small objects.  Some object file formats permit more efficient access to small data objects, such
               as a global int variable as opposed to a large global array.【小目标文件中的未初始化的数据段的符号】

           "i" For PE format files this indicates that the symbol is in a section specific to the implementation of DLLs.  For ELF format files this indicates
               that the symbol is an indirect function.  This is a GNU extension to the standard set of ELF symbol types.  It indicates a symbol which if
               referenced by a relocation does not evaluate to its address, but instead must be invoked at runtime.  The runtime execution will then return the
               value to be used in the relocation.

           "N" The symbol is a debugging symbol.【N代表调试符号】

           "p" The symbols is in a stack unwind section.【非重定向的栈区】

           "R"
           "r" The symbol is in a read only data section.【只读数据区】

           "S"
           "s" The symbol is in an uninitialized data section for small objects.【未初始化的数据区域】

           "T"
           "t" The symbol is in the text (code) section.【内存中代码文本段(通常是全局非静态函数等)】

           "U" The symbol is undefined.【未定义的符号,需要从其它对象文件中链接进来】

           "u" The symbol is a unique global symbol.  This is a GNU extension to the standard set of ELF symbol bindings.  For such a symbol the dynamic linker
               will make sure that in the entire process there is just one symbol with this name and type in use.【链接器保证唯一性的符号】

           "V"
           "v" The symbol is a weak object.  When a weak defined symbol is linked with a normal defined symbol, the normal defined symbol is used with no error.
               When a weak undefined symbol is linked and the symbol is not defined, the value of the weak symbol becomes zero with no error.  On some systems,
               uppercase indicates that a default value has been specified.

           "W"
           "w" The symbol is a weak symbol that has not been specifically tagged as a weak object symbol.  When a weak defined symbol is linked with a normal
               defined symbol, the normal defined symbol is used with no error.  When a weak undefined symbol is linked and the symbol is not defined, the value
               of the symbol is determined in a system-specific manner without error.  On some systems, uppercase indicates that a default value has been
               specified.【表示如果其他函数库中也有对这个符号的定义,则其他符号的定义可以覆盖这个定义】

           "-" The symbol is a stabs symbol in an a.out object file.  In this case, the next values printed are the stabs other field, the stabs desc field, and
               the stab type.  Stabs symbols are used to hold debugging information.

           "?" The symbol type is unknown, or object file format specific.

       o   The symbol name.

OPTIONS     【nm 可以使用的参数】
       The long and short forms of options, shown here as alternatives, are equivalent.【下面展示的分别以长、短形式的选项都是等效的】

       -A
       -o
       --print-file-name
           Precede each symbol by the name of the input file (or archive member) in which it was found, rather than identifying the input file once only, before
           all of its symbols.【输出符号所对应的库的名字,便于查找符号对应的被定义的库】

       -a
       --debug-syms
           Display all symbols, even debugger-only symbols; normally these are not listed.【展示所有的符号(包括默认不展示的调试符号)】

       -B  The same as --format=bsd (for compatibility with the MIPS nm).

       -C
       --demangle[=style]
           Decode (demangle) low-level symbol names into user-level names.  Besides removing any initial underscore prepended by the system, this makes C++
           function names readable. Different compilers have different mangling styles. The optional demangling style argument can be used to choose an
           appropriate demangling style for your compiler.【将低级符号名解码(demangle)成用户级的名字,使得C++函数名具有可读性。为了区分重载函数,c++编译器会将函数返回值/参数等信息附加到函数名称中去组成一个mangle过的符号。这里的-C选项就是做一个逆操作,输出其原始可理解的符号名称】

       --no-demangle
           Do not demangle low-level symbol names.  This is the default.

       -D
       --dynamic
           Display the dynamic symbols rather than the normal symbols.  This is only meaningful for dynamic objects, such as certain types of shared libraries.【显示动态符号(只对动态目标有效,如特定类型的共享库)】

       -f format
       --format=format
           Use the output format format, which can be "bsd", "sysv", or "posix".  The default is "bsd".  Only the first character of format is significant; it can
           be either upper or lower case.【使用format格式输出】

       -g
       --extern-only
           Display only external symbols.【仅显示外部符号】

       -h
       --help
           Show a summary of the options to nm and exit.

       -l
       --line-numbers
           For each symbol, use debugging information to try to find a filename and line number.  For a defined symbol, look for the line number of the address of
           the symbol.  For an undefined symbol, look for the line number of a relocation entry which refers to the symbol.  If line number information can be
           found, print it after the other symbol information.【对每个符号,使用调试信息(对象文件编译时增加-g选项)以便找到文件名和行号。对于已定义的符号,查找符号地址的行号。对于未定义符号,查找指向符号重定位入口的行号。如果可以找到行号信息,显示在符号信息之后】

       -n
       -v
       --numeric-sort
           Sort symbols numerically by their addresses, rather than alphabetically by their names.【按照符号对应的地址排序而不是字母】

       -p
       --no-sort
           Do not bother to sort the symbols in any order; print them in the order encountered.【按目标文件中遇到的符号顺序显示】

       -P
       --portability
           Use the POSIX.2 standard output format instead of the default format.  Equivalent to -f posix.【使用POSIX.2标准输出格式代替默认的输出格式。等同于使用任选项-f?posix】

       -r
       --reverse-sort
           Reverse the order of the sort (whether numeric or alphabetic); let the last come first.【不管以数字或字母为基本,都反转排序】

       -S
       --print-size
           Print both value and size of defined symbols for the "bsd" output style.  This option has no effect for object formats that do not record symbol sizes,
           unless --size-sort is also used in which case a calculated size is displayed.

       -s
       --print-armap
           When listing symbols from archive members, include the index: a mapping (stored in the archive by ar or ranlib) of which modules contain definitions
           for which names.【当列出库中成员的符号时,包含索引(即哪些模块包含哪些名字的映射)】

       -t radix
       --radix=radix
           Use radix as the radix for printing the symbol values.  It must be d for decimal, o for octal, or x for hexadecimal.【使用radix进制显示符号值。radix只能为―d(十进制)、―o(八进制)或―x(十六进制)】

       -u
       --undefined-only
           Display only undefined symbols (those external to each object file).【仅显示未定义的符号(它们对目标文件都是外部的)】

       -V
       --version
           Show the version number of nm and exit.【显示nm版本并退出】

       -X  This option is ignored for compatibility with the AIX version of nm.  It takes one parameter which must be the string 32_64.  The default mode of AIX
           nm corresponds to -X 32, which is not supported by GNU nm.

       --defined-only
           Display only defined symbols for each object file.【仅显示每个目标文件中已定义的符号】

       --plugin name
           Load the plugin called name to add support for extra target types.  This option is only available if the toolchain has been built with plugin support
           enabled.

       --size-sort
           Sort symbols by size.  The size is computed as the difference between the value of the symbol and the value of the symbol with the next higher value.
           If the "bsd" output format is used the size of the symbol is printed, rather than the value, and -S must be used in order both size and value to be
           printed.【按大小排列符号顺序。该大小是按照一个符号的值与它下一个符号的值进行计算的】

       --special-syms
           Display symbols which have a target-specific special meaning.  These symbols are usually used by the target for some special processing and are not
           normally helpful when included included in the normal symbol lists.  For example for ARM targets this option would skip the mapping symbols used to
           mark transitions between ARM code, THUMB code and data.

       --synthetic
           Include synthetic symbols in the output.  These are special symbols created by the linker for various purposes.  They are not shown by default since
           they are not part of the binary's original source code.

       --target=bfdname
           Specify an object code format other than your system's default format.【指定一个目标代码的格式,而非系统默认的格式】

       @file
           Read command-line options from file.  The options read are inserted in place of the original @file option.  If file does not exist, or cannot be read,
           then the option will be treated literally, and not removed.

           Options in file are separated by whitespace.  A whitespace character may be included in an option by surrounding the entire option in either single or
           double quotes.  Any character (including a backslash) may be included by prefixing the character to be included with a backslash.  The file may itself
           contain additional @file options; any such options will be processed recursively.

SEE ALSO
       ar(1), objdump(1), ranlib(1), and the Info entries for binutils.

COPYRIGHT
       Copyright (c) 1991-2013 Free Software Foundation, Inc.

       Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later
       version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the
       license is included in the section entitled "GNU Free Documentation License".

binutils-2.23.52.0.1                                                        2015-05-12                                                                       NM(1)
 Manual page nm(1) line 178/223 (END) (press h for help or q to quit)
打赏支持

Comments »