Linux 没有定义的符号 调试方法 nm命令

nm命令[在GNU C语言库提供的内容中,有接口可以用来做这件事。用下面的命令查看:nm -D /lib/libc.so.6 | grep log]

nm命令还是比较简单而且强大的。它用来列出一个目标文件中的各种符号。符号的种类很多,以下是一些常见的符号类型

nm输出字符含义RRead only symbol. 比如在代码中有一个const MAXDATA = 3095; 则MAXDATA就是一个Read only symbolN这是一个调试符号D这是一个已经初始化的变量的符号。比如代码中int i = 1和char *str = "Hello"则i和str都是这种类型的符号TText段的符号。子程序都是这种符号,比如文件中实现了一个函数function,则function就是这种符号U未定义的符号。如果文件中引用了不存在的函数,则这些未定义的函数符号就是这种类型S未初始化的符号,比如全局变量int s;则s的符号就是此类型
nm命令的详细用法以及例子见正文。

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

#include <stdio.h>

static int s_global;int i = 1;char *str = "hello, world";const ID = 10;extern int e_global;void function(){ printf("Hello");}

int get_x(){ int x; x = 33; return x;}

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

a.o:00000000 R IDa.o:00000000 T functiona.o:00000014 T get_xa.o:00000000 D ia.o: U printfa.o:00000000 b s_globala.o:00000004 D str

nm的用法

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

1、"-A",列出符号名的时候同时显示来自于哪个文件。

这在同时列出多个文件(比如一个链接库)的符号时比较有用

2、"-a",列出所有符号

这将会把调试符号也列出来。默认状态下调试符号不会被列出。

3、"-l",列出符号在源代码中对应的行号

指定这个参数后,nm将利用调试信息找出文件名以及符号的行号。对于一个已定义符号,将会找出这个符号定义的行号,对于未定义符号,显示为空

4、"-n",根据符号的地址来排序

默认是按符号名称的字母顺序排序的

5、"-u",只列出未定义符号

同"–undefined-only", 而"–defined-only"将只列出已定义符号

学习不是人生的全部,但学习都征服不了,那我还能做什么?

Linux 没有定义的符号 调试方法 nm命令

相关文章:

你感兴趣的文章:

标签云: