使用nm命令获取linux的可执行文件里或动态库中的所有函数名称 您所在的位置:网站首页 静态函数库的名字 使用nm命令获取linux的可执行文件里或动态库中的所有函数名称

使用nm命令获取linux的可执行文件里或动态库中的所有函数名称

2023-08-09 20:40| 来源: 网络整理| 查看: 265

一   使用nm命令获取动态库的符号(获取生成的动态库.so文件里面的所有函数名称)

执行 nm -s helloworld

二 使用nm命令获取可执行文件里的符号(获取生成的执行文件里面的所有函数名称)

linux的nm命令可以获取可执行文件里的符号表。

如可执行文件helloworld,

执行 nm helloworld  

root@ubuntu:/share/learn#  root@ubuntu:/share/learn# nm helloworld  0804a024 B __bss_start 0804a024 b completed.7181 0804a018 D __data_start 0804a018 W data_start 08048360 t deregister_tm_clones 080483d0 t __do_global_dtors_aux 08049f0c t __do_global_dtors_aux_fini_array_entry 0804a01c D __dso_handle 08049f14 d _DYNAMIC 0804a024 D _edata 0804a028 B _end 08048504 T _fini 08048518 R _fp_hw 080483f0 t frame_dummy 08049f08 t __frame_dummy_init_array_entry 080486bc r __FRAME_END__ 0804a000 d _GLOBAL_OFFSET_TABLE_          w __gmon_start__ 0804841b T hello1_print 08048473 T hello2_print 080482b0 T _init 08049f0c t __init_array_end 08049f08 t __init_array_start 0804851c R _IO_stdin_used          w _ITM_deregisterTMCloneTable          w _ITM_registerTMCloneTable 08049f10 d __JCR_END__ 08049f10 d __JCR_LIST__          w _Jv_RegisterClasses 08048500 T __libc_csu_fini 080484a0 T __libc_csu_init          U __libc_start_main@@GLIBC_2.0 0804844a T main          U puts@@GLIBC_2.0 08048390 t register_tm_clones 0804a020 D s 08048320 T _start 0804a024 D __TMC_END__ 08048446 T __x86.get_pc_thunk.ax 08048350 T __x86.get_pc_thunk.bx root@ubuntu:/share/learn# 

 

如0804841b T hello1_print

第一列是当前符号的地址,第二列是当前符号的类型,第三列是当前符号的名称。

nm加上-C指定列出符号是demangle,可以使得结果更加易读,但本人测试C的代码,加上-C跟没加是一样的结果。

 

nm 命令使用以下符号(用同样的字符表示弱符号作为全局符号)之一来表示文件符号类型:

符号类型有以下几类,小写表示局部,大写表示全局

A

符号的值不会在连接时发生改变,是固定的

b\B

符号在未初始化数据段(BSS)

C

The symbol is common. Common symbols are uninitialized data. When linking, multiple common symbols may appear with the same name. If the symbol is defined anywhere, the common symbols are treated as undefined references.

D\d

符号在初始化的数据段里(.data)

G\g

符号在初始化的数据段里(small objects),个别的允许小数据的目标文件

N

符号是调试符号

p

符号在stack unwind段里

R\r

符号在只读数据段里

S\s

符号在未初始化的数据段里(for small objects)

T\t

符号在代码(text)段(code)

U

符号未定义

u

符号是一个唯一的全局符号

值大小

如果可应用,nm 命令报告与符号有关的大小。

nm命令的用途:

1  主要查看可执行文件里有没有指定的符号

格式 nm -C 可执行文件 | grep 符号

如nm -C helloworld | grep hello1 

 

 

2  解决程序编译时undefined reference的错误及mutiple definition

 

3  查看某个符号的地址,以及进程空间的大概位置bss、data、text区,具体可以通过第二列的类型来判断。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有