linux命令nm

fiy 其他 190

回复

共3条回复 我来回复
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    nm(Symbol Table Utils)是一个在Linux系统中常用的命令行工具,用于查看目标文件或可执行文件中的符号表信息。它能够显示文件中的全局变量、函数、静态变量和外部变量等信息。

    nm命令的基本语法如下:

    nm [options] file

    其中,options为命令的可选参数,file为要查看符号表的文件名。

    nm命令常用的选项有:

    – -A或–print-file-name:显示每个符号所在的文件名;
    – -a或–debug-syms:打印出所有的符号,包括调试符号;
    – -B或–format=sysv:使用类SysV式的输出格式;
    – -C或–demangle:解码C++函数名的缩写;
    – -D或–dynamic:显示动态符号;
    – -f或–with-undefined:只显示未定义的符号;
    – -g或–extern-only:只显示外部链接的符号;
    – -l或–line-numbers:显示每个符号名称对应的源代码行号;
    – -p或–no-sort:不进行符号表的排序;
    – -r或–reverse-order:反向显示符号表;
    – -u或–defined-only:只显示已定义的符号;
    – -v或–verbose:显示详细的输出。

    nm命令可以用于查看目标文件或可执行文件中的符号表信息,对于开发者来说,该命令非常有用。它可以帮助我们了解程序所引用的外部函数、全局变量等信息,从而更好地进行代码分析和调试工作。在Linux系统中,nm命令常常与其他工具配合使用,如objdump、readelf等,在各种编程和调试场景下发挥着重要作用。

    2年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    nm命令是Linux系统中的一个工具,用于显示一个二进制文件(如可执行程序、共享库、目标文件)中的符号表。这个命令可以列出每个符号的名称和地址,以及符号的类型和绑定属性。下面是关于nm命令的一些重要信息:

    1. 命令语法:nm [选项] <文件>

    命令选项包括:
    -a 或 –debug-syms:显示所有符号,包括调试符号。
    -D 或 –dynamic:只显示动态符号。
    -g 或 –extern-only:只显示全局符号。
    -l 或 –line-numbers:显示每个符号的行号。
    -C 或 –demangle:解码C++函数名。
    -p 或 –print-size:显示每个符号的大小。

    2. 符号类型的解释:
    – U:未定义的符号,需要从其他地方解析。
    – W:弱符号,可能被其他符号覆盖。
    – A:绝对符号,即其地址在编译时已经确定。
    – T:文本段符号,表示一个函数或程序的入口点。
    – D:数据段符号,表示一个初始化的全局或静态变量。
    – B:BSS段符号,表示一个未初始化的全局或静态变量。
    – C:构造函数或析构函数。
    – G:全局符号。

    3. 符号绑定属性的解释:
    – LOCAL:局部符号,只在当前模块中可见。
    – GLOBAL:全局符号,可以在其他模块中引用。
    – WEAK:弱符号,可以被其他模块覆盖。
    – DEFAULT:默认符号,与全局符号具有相同的绑定属性。

    4. 应用场景:
    – 查看一个二进制文件中的符号,以便分析其结构和依赖关系。
    – 找出共享库中缺失的符号,以解决链接错误。
    – 调试程序时,跟踪函数的调用关系和地址。

    5. 示例命令:
    – nm helloWorld:显示可执行文件helloWorld中的符号表。
    – nm -D libtest.so:只显示共享库libtest.so的动态符号。
    – nm -C -l myProgram.o:显示目标文件myProgram.o的符号和行号,并对C++函数名进行解码。
    – nm -g -p a.out:只显示可执行文件a.out中的全局符号,并显示每个符号的大小。

    总的来说,nm命令是一个非常有用的工具,在Linux开发和调试过程中经常用到,可以帮助开发人员深入理解和分析二进制文件的结构和依赖关系,从而提高代码的可维护性和性能。

    2年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Linux命令”nm”用于显示目标文件或者可执行文件中的符号表。符号表记录了目标文件中定义的函数、全局变量和静态变量的信息。nm命令可以帮助我们查找某个函数或者变量在文件中的具体位置,方便我们进行调试和查找bug。

    下面让我们详细介绍一下nm命令的使用方法。

    ### 1. 语法

    nm命令的语法如下:

    “`
    nm [选项] [文件名]
    “`

    ### 2. 选项

    nm命令的常用选项如下:

    – `-A` 或 `–debug-syms`:显示所有调试符号。
    – `-a` 或 `–debug-syms`:显示所有调试符号,并包括局部符号。
    – `-C` 或 `–demangle`:将C++的符号名进行反解析。
    – `-D` 或 `–dynamic`:显示动态符号。
    – `-f` 或 `–with-filename`:显示每个符号所在的文件名。
    – `-g` 或 `–extern-only`:只显示外部引用的符号。
    – `-n` 或 `–numeric-sort`:按照数字排序。
    – `-o` 或 `–print-file-name`:打印文件名。
    – `-p` 或 `–portability`:允许在不同的系统上进行移植。
    – `-r` 或 `–reverse-sort`:按照相反的顺序排序。
    – `-s` 或 `–size-sort`:按照符号大小排序。
    – `-u` 或 `–undefined-only`:只显示未定义的符号。
    – `-v` 或 `–version`:显示版本信息。
    – `-V` 或 `–version`:显示版本号。
    – `-w` 或 `–no-sort`:不进行排序,按照文件中的顺序显示符号。

    ### 3. 操作流程

    使用nm命令可以分为以下几个步骤:

    Step 1: 打开终端

    首先,打开终端,进入命令行环境。

    Step 2: 输入命令

    在命令行中输入nm命令,后面跟上需要查看符号表的文件名,例如:

    “`
    nm test.o
    “`

    上述命令将会显示test.o文件中的符号表信息。

    Step 3: 分析输出

    执行命令后,终端会显示文件中的符号表信息。每一行代表一个符号,包含符号的地址、类型和名称。

    地址列显示符号的地址,类型列展示符号的类型,名称列显示符号的名称。

    根据需要可以使用不同的选项来过滤并排序符号表的输出。

    ### 4. 示例

    让我们通过一个示例来更好地理解nm命令的使用。

    假设我们有一个源文件test.c,内容如下:

    “`c
    #include

    void foo()
    {
    printf(“Hello, World!\n”);
    }

    int main()
    {
    foo();
    return 0;
    }
    “`

    我们首先需要将该源文件编译为可执行文件。打开终端,进入源文件所在的目录,使用gcc编译源文件,命令如下:

    “`
    gcc test.c -o test
    “`

    编译完成后,我们得到一个名为test的可执行文件。

    接下来,使用nm命令查看可执行文件中的符号表信息,命令如下:

    “`
    nm test
    “`

    终端将会显示如下的符号表信息:

    “`
    0000000000400526 T _GLOBAL_OFFSET_TABLE_
    00000000004006d4 R __FRAME_END__
    00000000004006e0 D _edata
    00000000004006e8 B _end
    0000000000400480 T _start
    00000000004004a0 t deregister_tm_clones
    00000000004004d0 t register_tm_clones
    0000000000400510 T __do_global_dtors_aux
    0000000000400530 T frame_dummy
    000000000040057d T foo
    0000000000400590 T main
    0000000000400640 T __libc_csu_init
    00000000004006a0 T __libc_csu_fini
    00000000004006a4 U __libc_start_main@@GLIBC_2.2.5
    00000000004006b0 U printf@@GLIBC_2.2.5
    “`

    上述输出中,每一行对应一个符号。以地址为例,地址列中的开头字符可以是`T`、`W`、`B`、`G`等等。`T`表示该符号在文本(程序代码)段,`D`表示在数据段,`B`表示在BSS段,`R`表示在只读数据段,`U`表示这个符号未被定义。

    对于该示例中的符号表输出,`foo`和`main`分别对应源文件test.c中的函数foo和main。可以看到,nm命令帮助我们找到了这两个函数的地址。

    ### 5. 总结

    通过本文,我们学习了Linux命令nm的基本使用方法。nm命令可以显示目标文件或者可执行文件中的符号表信息,帮助我们了解和分析代码的结构和功能。

    标号的格式通常包括符号的地址、类型和名称。我们可以通过不同的选项来过滤和排序符号表的输出,提高分析的效率。

    使用nm命令,我们可以在Linux环境中更加灵活和高效地进行程序调试和代码分析。希望本文对您在使用nm命令时有所帮助。

    2年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部