代码在git

是names的缩写, nm命令主要是用来列出某些文件中的符号(说白了就是一些函数和全局变量等)。 下面, 我们一起来看看。
linux中的nm命令简介

nm *
nm: main.c: 不可识别的文件格式
nm: test.c: 不可识别的文件格式
nm: test.h: 不可识别的文件格式

这说明nm对这类文件无用
继续看nm能否读取目标文件和可执行文件:

ls
gcc -c test.c main.c
gcc test.o main.o
./a.out
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: 不可识别的文件格式main.o:U _GLOBAL_OFFSET_TABLE_
0000000000000000 T mainU print
nm: test.c: 不可识别的文件格式
nm: test.h: 不可识别的文件格式test.o:U _GLOBAL_OFFSET_TABLE_
0000000000000000 T printU puts

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

我们继续看静态库和动态库, 如下:

 gcc -c test.car rcs libtest.a test.ogcc -shared -fPIC -o libtest.so test.onm lib*
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函数。

好, 我们再来看看全局变量的情形, 我们把main.c改为:

cd 2
gcc main.c
nm *

a.out:
0000000000201020 B aaa
00000000000005fa T add
0000000000201010 D bbb
0000000000201019 B __bss_start
000000000020101c b completed.7698w __cxa_finalize@@GLIBC_2.2.5
0000000000201000 D __data_start
0000000000201000 W data_start
0000000000000520 t deregister_tm_clones
00000000000005b0 t __do_global_dtors_aux
0000000000200df8 t __do_global_dtors_aux_fini_array_entry
0000000000201008 D __dso_handle
0000000000200e00 d _DYNAMIC
0000000000201019 D _edata
0000000000201028 B _end
0000000000000694 T _fini
00000000000005f0 t frame_dummy
0000000000200df0 t __frame_dummy_init_array_entry
000000000000080c r __FRAME_END__
0000000000200fc0 d _GLOBAL_OFFSET_TABLE_w __gmon_start__
00000000000006a4 r __GNU_EH_FRAME_HDR
00000000000004b8 T _init
0000000000200df8 t __init_array_end
0000000000200df0 t __init_array_start
00000000000006a0 R _IO_stdin_usedw _ITM_deregisterTMCloneTablew _ITM_registerTMCloneTable
0000000000000690 T __libc_csu_fini
0000000000000620 T __libc_csu_initU __libc_start_main@@GLIBC_2.2.5
000000000000060e T main
0000000000000560 t register_tm_clones
00000000000004f0 T _start
0000000000201014 D szTest
0000000000201020 D __TMC_END__
nm: main.c: 不可识别的文件格式

可以看到, 不仅有add函数, 还有全局变量aaa, bbb和szTest, 要注意, aaa是未初始化的, 所以在Bss段, 而bbb、szTest是初始化了的, 所以在Data段。 值得注意的是, 并没有ccc, 因为ccc是局部变量, nm看不到的。

我们还应该注意到, 在上面看不到"good", 为啥呢? 因为nm是用来看szTest而非"good"的。 别忘了, 我们之前介绍过的strings命令可干这事, 如下:

strings a.out
/lib64/ld-linux-x86-64.so.2
nd8B
//}Q
libc.so.6
__cxa_finalize
__libc_start_main
GLIBC_2.2.5
_ITM_deregisterTMCloneTable
__gmon_start__
_ITM_registerTMCloneTable
AWAVI
AUATL
[]A\A]A^A_
;*3$"
good

linux中的nm命令相关推荐

  1. linux中的nm命令简介【转】

    (转自:https://blog.csdn.net/stpeace/article/details/47089585) nm不是ni ma的缩写, 当然, 也不是ni mei的缩写, 而是names的 ...

  2. nm linux 输出含义,nm 命令输出项解析

    Linux下的nm命令详解 nm命令的输出包含三个部分:1 符号值.默认显示十六进制,也可以指定: 2 符号类型.小写表示是本地符号,大写表示全局符号(external); 3 符号名称. 给个例子: ...

  3. Linux中升级更新命令yum upgrade和yum update的区别

    这篇文章主要介绍了Linux中升级更新命令yum upgrade和yum update的区别,Linux升级命令有两个分别是yum upgrade和yum update, 这个两个命令是有区别的,本文 ...

  4. Linux中的In命令

    2019独角兽企业重金招聘Python工程师标准>>> ln是linux中一个非常重要命令.它的功能是为某一个文件在另外一个位置建立一个同步的链接,这个命令最常用的参数是-s,具体用 ...

  5. Linux中history历史命令使用方法详解

    在/etc/profile里添加如下:#History export HISTTIMEFORMAT="[%F %T]" HISTDIR=/home/common/.hist if ...

  6. linux一条命令添加用户并设置密码,linux中如何通过命令行来添加用户并设置密码...

    linux中如何通过命令行来添加用户并设置密码 (7页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.90 积分 LINUX中如何通过命令行来添加用户 ...

  7. linux dmesg信息哪来的,linux中的dmesg命令简介

    今天, 我们来介绍一个linux中的dmesg命令,事实上, 我们之前用过, 但是没有单独介绍过. 看一下dmesg命令的用途吧: dmesg命令用会把开机信息存到ring bufer中, 形成一个缓 ...

  8. Linux中如何用命令打开文件夹

    Linux中如何用命令打开文件夹 文章目录: 一.点击Linux桌面文件图标打不开 二.解决方式 三.杀死所有nautilus相关进程 你是否遇到过Linux桌面文件图标打不开,我就遇到过,此时我的眼 ...

  9. linux中ftp的用法,linux中的ftp命令用法(7页)-原创力文档

    第 第 PAGE 1 页 共 NUMPAGES 1 页 linux中的ftp命令用法 Linux系统中的ftp命令功能强大,那么它的具体用法是怎样呢?下面由小编为大家整理了linux中的ftp命令用法 ...

最新文章

  1. leetcode--回文数--python
  2. 天津计算机考研901,2013年天津大学901计算机考研真题
  3. [转]蓝牙基带数据传输机理分析
  4. mysql pool返回值_【Mysql】你知道一条查询语句是如何执行的吗?
  5. 通过零拷贝进行有效的数据传输(java、c)
  6. 支持向量机SVM的学习笔记
  7. @程序员,快来速取硬核的汇编语言知识大全!
  8. Python培训班怎么选?
  9. UVA152 Tree's a Crowd【暴力+最值】
  10. QQ音乐无损下载工具 Music Download Man v3.1绿色版
  11. 用动画来赋予PPT生命力(师从于珞珈老师)
  12. 央行数字货币离我们还有多远?
  13. Portraiture 3.5.6磨皮滤镜插件适用于Photoshop磨皮美化功能
  14. C. Dominant Piranha(思维)
  15. java语言,MP3音频文件进行合并功能
  16. keil uvisoin软件打开他人的工程文件上面出现黄色感叹号警告标志,后续编译不能生成.o文件而报错
  17. cr全称是什么意思,城域网中的AC、BRAS、SW、SR、CR是什么意思
  18. 6.3 Git 工具 - 交互式暂存
  19. CEF(Chromium Embedded Framework和JavaScript交互相互调用函数和设置数据
  20. “奔驰车主哭诉维权”续:双方再次协商无果

热门文章

  1. zynq 文件系统中加载PL fpga.bit笔记
  2. 十三五乐山全力推进智慧城市和新能源汽车等项目
  3. NHibernate概括
  4. java内部类的定义原则
  5. 不要使用字符串常量作为对象锁去同步代码
  6. 使用docker部署一个直接可用的puppet服务端
  7. 【编程题目】求二叉树中节点的最大距离
  8. jquery and event
  9. Java写十进制和二进制互转
  10. python读写二进制文件的方法