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

本文主要是介绍使用nm命令获取linux的可执行文件里或动态库中的所有函数名称,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一   使用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区,具体可以通过第二列的类型来判断。

这篇关于使用nm命令获取linux的可执行文件里或动态库中的所有函数名称的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/760522

相关文章

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定