使用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

相关文章

Django中的函数视图和类视图以及路由的定义方式

《Django中的函数视图和类视图以及路由的定义方式》Django视图分函数视图和类视图,前者用函数处理请求,后者继承View类定义方法,路由使用path()、re_path()或url(),通过in... 目录函数视图类视图路由总路由函数视图的路由类视图定义路由总结Django允许接收的请求方法http

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1