一、nm

1.1 nm命令介绍

nm是name的缩写,这个命令主要用来列出某些文件中的符号信息(就是一些函数和全局变量),文件可以是对象文件、可执行文件或对象文件库。如果文件中没有包含符号信息,nm报告该情况,但不把它解释为出错。nm缺省情况下报告十进制符号表示法下的数字值。

1.2 选项

1.3 符号说明

对于每一个符号来说,其类型如果是小写的,则表明该符号是local的。大写则表明该符号是global(external)的。

  • A:该符号的值是绝对的,在以后的链接过程重,不允许改变。这样的符号,常常出现在中断向量表中,例如用符号来表示各个中断向量在中断向量表中的位置
  • B:该符号的值出现在非初始化数据段BSS中。例如,一个文件中定义全局static int s_int。则符号s_int类型为B,位于BSS section中。其值表示该符号在BSS段上的偏移。一般而言,BSS段分配于RAM中
  • C:该符号为commom。common symbol是未初始化数据段,该符号没有包含于一个section中。只有在链接过程中才进行分配。符号的值表示要分配的字节数。例如,在一个C文件中,定义int g_no_init,并且该符号在别的地方会被引用,则该符号类型就是C,否则为B。
  • D:该符号位于初始化数据段中。一般来说,分配到data section中。比如,全局变量int g_init=2;
  • G:该符号也位于初始化数据段中。主要用于small object,提供访问small data object的一种方式
  • I:该符号是对另一个符号的间接引用
  • N:该符号是一个debugging的符号
  • R:该符号位于只读数据区。比如,全局变量const int const_int=0;如果在一个函数中定义const char* test=“abc”;const int a=2;使用nm都不会得到符号信息。
  • S:符号位于非初始化数据区,用于small object
  • T:符号位于代码区 text section
  • U:符号在当前文件中是未定义的,即该符号的定义在别的文件中。比如,当前文件中调用另一个文件中的函数,在这个目标文件中,函数就是未定义的。但是在定义它的文件中,类型为T。对于全局变量来说,在定义它的文件中,符号类型是C,在使用它的文件中,文件类型是U
  • V:该符号是一个weak object
  • ?:该符号没有定义

1.4 代码例子:

//test.h
void print();
//test.c
#include<stdio.h>
#include "test.h"void print(){printf("rainy days\n");
}
//main.c
#include"test.h"
int main(){print();return 0;
}

接下来观察下nm命令的作用效果:

输出如下:

a.out:
0000000000201010 B __bss_start
0000000000201010 b completed.7698w __cxa_finalize@@GLIBC_2.2.5
0000000000201000 D __data_start
0000000000201000 W data_start
0000000000000560 t deregister_tm_clones
00000000000005f0 t __do_global_dtors_aux
0000000000200dc0 t __do_global_dtors_aux_fini_array_entry
0000000000201008 D __dso_handle
0000000000200dc8 d _DYNAMIC
0000000000201010 D _edata
0000000000201018 B _end
00000000000006e4 T _fini
0000000000000630 t frame_dummy
0000000000200db8 t __frame_dummy_init_array_entry
000000000000086c r __FRAME_END__
0000000000200fb8 d _GLOBAL_OFFSET_TABLE_w __gmon_start__
0000000000000700 r __GNU_EH_FRAME_HDR
00000000000004e8 T _init
0000000000200dc0 t __init_array_end
0000000000200db8 t __init_array_start
00000000000006f0 R _IO_stdin_usedw _ITM_deregisterTMCloneTablew _ITM_registerTMCloneTable
00000000000006e0 T __libc_csu_fini
0000000000000670 T __libc_csu_initU __libc_start_main@@GLIBC_2.2.5
000000000000064d T main
000000000000063a T printU puts@@GLIBC_2.2.5
00000000000005a0 t register_tm_clones
0000000000000530 T _start
0000000000201010 D __TMC_END__
nm: main.c: File format not recognizedmain.o:U _GLOBAL_OFFSET_TABLE_
0000000000000000 T mainU print
nm: test.c: File format not recognized
nm: test.h: File format not recognizedtest.o:U _GLOBAL_OFFSET_TABLE_
0000000000000000 T printU puts

可以看到,对于目标文件和可执行文件而言,均可以获得其中的函数,如print函数。

我们继续观察下静态库和动态库:

输出如下:

libtest.a:test.o:U _GLOBAL_OFFSET_TABLE_
0000000000000000 T printU putslibtest.so:
0000000000201028 B __bss_start
0000000000201028 b completed.7698w __cxa_finalize@@GLIBC_2.2.5
0000000000000530 t deregister_tm_clones
00000000000005c0 t __do_global_dtors_aux
0000000000200e18 t __do_global_dtors_aux_fini_array_entry
0000000000201020 d __dso_handle
0000000000200e20 d _DYNAMIC
0000000000201028 D _edata
0000000000201030 B _end
0000000000000620 T _fini
0000000000000600 t frame_dummy
0000000000200e10 t __frame_dummy_init_array_entry
00000000000006d0 r __FRAME_END__
0000000000201000 d _GLOBAL_OFFSET_TABLE_w __gmon_start__
0000000000000634 r __GNU_EH_FRAME_HDR
00000000000004e8 T _initw _ITM_deregisterTMCloneTablew _ITM_registerTMCloneTable
000000000000060a T printU puts@@GLIBC_2.2.5
0000000000000570 t register_tm_clones
0000000000201028 d __TMC_END__

可以看到,我们可以从静态库和动态库中获取到函数名称,如print函数

nm命令详解
nm命令简介

linux c文件处理命令相关推荐

  1. Linux之文件权限命令

    Linux之文件权限命令 1. chmod命令的介绍 命令 说明 chmod 修改文件权限 chmod修改文件权限有两种方式: 字母法 数字法 2. chmod 字母法的使用 角色说明: 角色 说明 ...

  2. Linux查看文件内容命令:cat, tail, head, more, less

    Linux查看文件内容命令:cat, tail, head, more, less cat 直接显示整个文件. cat直接显示全部文件内容,没有换页等交互. cat filename more mor ...

  3. linux 删除中文文件夹,Linux删除文件夹命令是什么

    Linux删除文件夹命令有:1.rmdir命令,用于删除空的文件夹,语法格式"rmdir [-p] 文件夹名称":2.rm命令,用于删除一个文件或者文件夹,语法格式"rm ...

  4. linux打包文件夹命令

    原文链接:linux打包文件夹命令 linux打包文件夹命令如下 .tar文件 例:文件夹名为fileName 打包:tar cvf fileName.tar logs/ 解压:tar xvf fil ...

  5. linux运行文件的命令

    linux运行文件的命令 自己的随记 运行c语言文件 sudo gedit test.c gcc -o test 文件名.c ./test 运行 .sh文件 首先要开启权限,再运行 chmod 777 ...

  6. linux上创建一文件夹命令,linux创建文件夹命令是什么

    linux创建文件夹命令是mkdir,语法为[mkdir (选项)(参数)],其中Z为设置安全上下文,当使用SELinux时有效,version显示版本信息. 本文操作环境:linux2.6.32系统 ...

  7. Linux删除文件夹命令

    Linux删除文件夹命令(通用,但需要谨慎操作): rm -rf 文件夹名称 比如需要删除当前路径下的一个test1的文件夹: rm -rf test 如果删除空文件夹,也可以使用命令进行删除: rm ...

  8. linux如何用终端删除文件夹,linux删除文件夹命令

    在Linux系统中没有回收站,因此我们要删除文件夹的时候需要注意,下面由学习啦小编为大家整理了linux删除文件夹命令,希望对大家有帮助! linux删除文件夹命令详解 一.rm命令使用权限 所有用户 ...

  9. Linux删除文件夹命令实例

    linux删除文件夹命令 在用Linux的时分,有时分要删除一个文件夹,常常会提示次此文件非空,没法删除,这个时分,必需运用rm -rf命令.关于一些小白用户常常在运用Linux命令,会十分当心,以免 ...

  10. 新建文件夹命令 linux,linux创建文件夹命令是什么

    linux创建文件夹命令是mkdir,语法为[mkdir (选项)(参数)],其中Z为设置安全上下文,当使用SELinux时有效,version显示版本信息. 本文操作环境:linux2.6.32系统 ...

最新文章

  1. 中国AI登上Nature子刊:看病历分析儿科疾病,准确率90%,超人类医师
  2. bat文件注册为Windows服务与依赖关系设置
  3. ASP.NET2.0 菜单控件menu的动态静态用法
  4. 去掉chorme浏览器自动补全时input框的背景样式
  5. SpringMvc自定义参数绑定
  6. java类的加载,链接,初始化
  7. 编译器错误信息: CS1010: 常数中有换行符
  8. android windows 虚拟机下载,windows10虚拟机安卓版
  9. 登陆服务器显示guest,登录界面如何隐藏guest账号
  10. ThingJS:次时代3D城市大屏,2款工具3分钟搭建完成!
  11. 多个正方体叠加所得立体图形的表面积
  12. 计算机用户删除文件找回,文件删除了怎么找回来_文件删掉了怎么恢复-win7之家...
  13. JavaScript:100以内质数1000以内的质数显示和统计
  14. 环境数据采集系统——中期总结
  15. HCIA网络基础01
  16. 【写博客常用】x86,x64,arm都是什么
  17. JDK的安装与配置(windows环境)
  18. 【金猿产品展】Wyn Enterprise——嵌入式商业智能软件,让数据分析无处不在
  19. 基于Python接口自动化测试框架(初级篇)附源码
  20. cad二次开发-在vs编译软件环境下使用c#语言编写dll文件-添加单行文本

热门文章

  1. Flutter实战之AS快键键
  2. 超强阵容实操教学, 0 基础 Flink 训练营免费抢报啦!
  3. Android 中的Binder跨进程通信机制与AIDL
  4. Kotlin 新版来了,支持跨平台!
  5. studio中碰到的jni问题:java.lang.UnsatisfiedLinkError
  6. 怎么查询sybase money列数据长度_用PBI分析上市公司财务数据(一)
  7. sql developer下载_开放下载!《Rocket MQ 使用排查指南》精解100+常见问题
  8. 流程控制示例:---3个实例示例:
  9. python物性库能调用哪些物质_浅谈湿空气物性计算软件CoolProp的应用
  10. 触发器及其应用实验报告总结_2020年中考总复习: 光现象、透镜及其应用知识点总结...