nm命令介绍

nm命令介绍

nm用来列出一个目标文件中的各种符号,nm命令还是比较简单而且强大的。它用来列出一个目标文件中的各种符号。符号的种类很多,以下是一些常见的符号类型
nm输出字符 含义
R Read only symbol. 比如在代码中有一个const MAXDATA = 3095; 则MAXDATA就是一个Read only symbol
N 这是一个调试符号
D 这是一个已经初始化的变量的符号。比如代码中int i = 1和char *str = "Hello"则i和str都是这种类型的符号
T Text段的符号。子程序都是这种符号,比如文件中实现了一个函数function,则function就是这种符号
U 未定义的符号。如果文件中引用了不存在的函数,则这些未定义的函数符号就是这种类型
S 未初始化的符号,比如全局变量int s;则s的符号就是此类型

例子

先来例子,以下是test.c的内容:

#include <stdio.h>

int x,y;

void print(int n)
{
    for (int i = 0; i < n; i++) {
        printf("hello world\n");
    }
}

int main()
{
    x = 1;
    y = 2;

    print(x+y);

    return 0;
}

在执行"gcc -g -O -c test.c"产生test.o之后,用"nm -A test.o"的输出为:

test.o:0000000000000000 r .LC0
test.o:000000000000002f T main
test.o:0000000000000000 T print
test.o:                 U puts
test.o:0000000000000004 B x
test.o:0000000000000000 B y

nm的用法

nm的用法很简单,以下几个关键字比较常用:

1、"-A",列出符号名的时候同时显示来自于哪个文件。
这在同时列出多个文件(比如一个链接库)的符号时比较有用

2、"-a",列出所有符号
这将会把调试符号也列出来。默认状态下调试符号不会被列出。

0000000000000000 r .LC0
0000000000000000 N .debug_abbrev
0000000000000000 N .debug_info
0000000000000000 N .debug_line
0000000000000000 N .debug_line_str
0000000000000000 N .debug_loclists
0000000000000000 N .debug_rnglists
0000000000000000 N .debug_str
0000000000000000 t .text
000000000000002f T main
0000000000000000 T print
                 U puts
0000000000000000 a test.c
0000000000000004 B x
0000000000000000 B y

3、"-l",列出符号在源代码中对应的行号
指定这个参数后,nm将利用调试信息找出文件名以及符号的行号。对于一个已定义符号,将会找出这个符号定义的行号,对于未定义符号,显示为空

0000000000000000 r .LC0
000000000000002f T main /home/marvin/workspace/temp/test.c:12
0000000000000000 T print        /home/marvin/workspace/temp/test.c:5
                 U puts /usr/include/x86_64-linux-gnu/bits/stdio2.h:112
0000000000000004 B x    /home/marvin/workspace/temp/test.c:3
0000000000000000 B y    /home/marvin/workspace/temp/test.c:3

4、"-n",根据符号的地址来排序
默认是按符号名称的字母顺序排序的

                 U puts
0000000000000000 r .LC0
0000000000000000 T print
0000000000000000 B y
0000000000000004 B x
000000000000002f T main

5、"-u",只列出未定义符号
同"--undefined-only", 而"--defined-only"将只列出已定义符号

                 U puts
posted @ 2023-01-10 23:21  main_c  阅读(1)  评论(0)    收藏  举报  来源