linux nm/objdump/readelf/addr2line命令详解

我们在开发过程中通过需要反汇编查看问题,那么我们这里使用rk3568开发板来举例nm/objdump/readelf/addr2line 分析动态库和可执行文件以及.o文件。

1,我们举例nm/objdump/readelf/addr2line解析linux 内核文件vmlinux

(1),addr2line解析地址0xffffffc00911a2e

lark@ubuntu:~/Public/rk356x-linux/kernel$ addr2line -e vmlinux  -f -C ffffffc00911a2e4
skb_copy_bits
/home/lark/Public/rk356x-linux/kernel/net/core/skbuff.c:3610

使用上面的addr2line的时候记得编译时需要在Makefile里面加入-g,并且在编译net模块里面的编译里面不要使用strip,而要使用not strip的版本。
(2),readelf 查看skb_copy_bits

lark@ubuntu:~/Public/rk356x-linux/kernel$ readelf -s vmlinux | grep "skb_copy_bits"
149816: ffffffc009b5c4da     0 NOTYPE  LOCAL  DEFAULT    8 __kstrtab_skb_copy_bits
149817: ffffffc009b55ba3     0 NOTYPE  LOCAL  DEFAULT    8 __kstrtabns_skb_copy_bits
149819: ffffffc009b0a864     0 NOTYPE  LOCAL  DEFAULT    6 __ksymtab_skb_copy_bits
196394: ffffffc00911a2e4   548 FUNC    GLOBAL DEFAULT    2 skb_copy_bits

(3),objdump查看skb_copy_bits

lark@ubuntu:~/Public/rk356x-linux$ objdump -d kernel/vmlinux | grep "skb_copy_bits"
ffffffc008bca2e8:    94153fff     bl    ffffffc00911a2e4 <skb_copy_bits>
ffffffc008bd0c50:    941525a5     bl    ffffffc00911a2e4 <skb_copy_bits>
ffffffc008bd0e48:    94152527     bl    ffffffc00911a2e4 <skb_copy_bits>
ffffffc008bd1498:    94152393     bl    ffffffc00911a2e4 <skb_copy_bits>
ffffffc008bd154c:    94152366     bl    ffffffc00911a2e4 <skb_copy_bits>
ffffffc008bd8730:    941506ed     bl    ffffffc00911a2e4 <skb_copy_bits>
ffffffc008bd8838:    941506ab     bl    ffffffc00911a2e4 <skb_copy_bits>
ffffffc008c5e7b8:    9412eecb     bl    ffffffc00911a2e4 <skb_copy_bits>
ffffffc008c6de38:    9412b12b     bl    ffffffc00911a2e4 <skb_copy_bits>
ffffffc008c6e234:    9412b02c     bl    ffffffc00911a2e4 <skb_copy_bits>
ffffffc008c6e530:    9412af6d     bl    ffffffc00911a2e4 <skb_copy_bits>
ffffffc00911a2e4 <skb_copy_bits>:
ffffffc00911a318:    54000d0b     b.lt    ffffffc00911a4b8 <skb_copy_bits+0x1d4>  // b.tstop
ffffffc00911a330:    54000d4c     b.gt    ffffffc00911a4d8 <skb_copy_bits+0x1f4>
ffffffc00911a344:    340007e1     cbz    w1, ffffffc00911a440 <skb_copy_bits+0x15c>
ffffffc00911a360:    14000008     b    ffffffc00911a380 <skb_copy_bits+0x9c>
ffffffc00911a37c:    5400060d     b.le    ffffffc00911a43c <skb_copy_bits+0x158>
ffffffc00911a388:    5400056b     b.lt    ffffffc00911a434 <skb_copy_bits+0x150>  // b.tstop
ffffffc00911a3a4:    54fffe0d     b.le    ffffffc00911a364 <skb_copy_bits+0x80>
ffffffc00911a3cc:    340001d3     cbz    w19, ffffffc00911a404 <skb_copy_bits+0x120>
ffffffc00911a410:    54fffaa1     b.ne    ffffffc00911a364 <skb_copy_bits+0x80>  // b.any
ffffffc00911a438:    17ffffd5     b    ffffffc00911a38c <skb_copy_bits+0xa8>
ffffffc00911a444:    b5000096     cbnz    x22, ffffffc00911a454 <skb_copy_bits+0x170>
ffffffc00911a448:    1400001a     b    ffffffc00911a4b0 <skb_copy_bits+0x1cc>
ffffffc00911a450:    b4000316     cbz    x22, ffffffc00911a4b0 <skb_copy_bits+0x1cc>
ffffffc00911a45c:    540003ab     b.lt    ffffffc00911a4d0 <skb_copy_bits+0x1ec>  // b.tstop
ffffffc00911a480:    54fffe6d     b.le    ffffffc00911a44c <skb_copy_bits+0x168>
ffffffc00911a498:    97ffff93     bl    ffffffc00911a2e4 <skb_copy_bits>
ffffffc00911a49c:    350000c0     cbnz    w0, ffffffc00911a4b4 <skb_copy_bits+0x1d0>
ffffffc00911a4a4:    54fffba0     b.eq    ffffffc00911a418 <skb_copy_bits+0x134>  // b.none
ffffffc00911a4ac:    b5fffd56     cbnz    x22, ffffffc00911a454 <skb_copy_bits+0x170>
ffffffc00911a4b0:    34fffb55     cbz    w21, ffffffc00911a418 <skb_copy_bits+0x134>
ffffffc00911a4d4:    17ffffe3     b    ffffffc00911a460 <skb_copy_bits+0x17c>
ffffffc00911a4f8:    54fff900     b.eq    ffffffc00911a418 <skb_copy_bits+0x134>  // b.none
ffffffc00911a504:    17ffff8c     b    ffffffc00911a334 <skb_copy_bits+0x50>
ffffffc00911c8a0:    97fff691     bl    ffffffc00911a2e4 <skb_copy_bits>

(4),nm/nm -gDC查看skb_copy_bits

lark@ubuntu:~/Public/rk356x-linux/kernel$ nm vmlinux | grep "skb_copy_bits"
ffffffc009b55ba3 r __kstrtabns_skb_copy_bits
ffffffc009b5c4da r __kstrtab_skb_copy_bits
ffffffc009b0a864 r __ksymtab_skb_copy_bits
ffffffc00911a2e4 T skb_copy_bits

2,nm/objdump/readelf/addr2line参数说明

(1)objdump参数说明:

-d/--disassemble:反汇编可执行段(.text等)
-S/--source:混合显示源码和汇编(需编译时加-g)
-s/--full-contents:显示所有段原始内容(十六进制+ASCII)
‌符号分析参数‌
-t/--syms:显示符号表(含全局变量/函数地址)
-T/--dynamic-syms:显示动态符号表(用于共享库)
‌段信息参数‌
-h/--section-headers:显示段头表(各段偏移/大小)
-x/--all-headers:显示所有头信息(ELF头+段头+符号表)
‌架构参数‌
-m/--architecture=<arch>:指定目标架构(如-m i386:x86-64)

(2)nm参数说明:

-A    显示文件名(适用于多文件)    nm -A *.o
-C    解码 C++ 符号(demangle)    nm -C lib.so
-D    显示动态符号(共享库特有)    nm -D libc.so.6
-g    仅显示外部(全局)符号    nm -g a.out
-l    显示源代码行号(需编译时加 -g)    nm -l program
-S    显示符号大小    nm -S kernel.o
-u    仅显示未定义符号    nm -u failed.o
--defined-only    仅显示已定义符号    nm --defined-only lib.a
--no-demangle    禁止 C++ 符号解码    nm --no-demangle
-t <format>    自定义输出格式(dox 十进制/八进制/十六进制)    nm -t x lib.o

(3)readelf参数说明:
-h:显示ELF文件头(魔数、架构、入口地址等)readelf -h libtest.so  # 查看动态库文件头
-l:列出程序头(Program Headers),描述内存布局readelf -l a.out  # 分析可执行文件内存段节区分析‌
-S:显示所有节区头(Section Headers),包括.text/.data等readelf -S test.o  # 查看目标文件节
-x <section>:以十六进制导出指定节区内容readelf -x .text program  # 导出代码段机器码符号与重定位‌
-s:显示符号表(函数/变量名、地址、绑定类型)readelf -s libc.so.6  # 查看glibc导出符号
-r:查看重定位表(动态链接依赖项)readelf -r demo  # 分析可执行文件重定位项动态链接信息‌
-d:显示动态节(Dynamic Section),如依赖库NEEDED89readelf -d nginx  # 查看二进制依赖的so文件

(4)addr2line的使用说明:

参数作用适用场景
-e <file>指定目标可执行文件或共享库(默认a.out解析非默认名称的二进制文件 
-f显示函数名称定位崩溃函数上下文 
-C解混淆C++符号(还原可读函数名)分析C++程序崩溃点 
-s仅显示文件名(隐藏路径)简化输出信息 
-p美化输出格式(地址/函数/位置单行显示)增强可读性 
-i显示内联函数调用链分析优化后的代码逻辑 
-a显示原始地址(十六进制)地址校验 
-j <section>指定段名称(如.text)替代绝对地址分析内核模块 

3,nm/objdump/readelf/addr2line解析linux 动态库

lark@ubuntu:~/Public/rk356x-linux/debian/overlay-debug/usr/lib$ nm -D libpng12.so | grep "png_set_bgr"
000000000000ad64 T png_set_bgr

 lark@ubuntu:~/Public/rk356x-linux/debian/overlay-debug/usr/lib$ ./../../../../prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-objdump -d libpng12.so | grep "png_set_bgr"
00000000000046f0 <png_set_bgr@plt>:
000000000000ad64 <png_set_bgr@@PNG12_0>:
    ad64:    b4000080     cbz    x0, ad74 <png_set_bgr@@PNG12_0+0x10>
    f4e0:    97ffd484     bl    46f0 <png_set_bgr@plt>
   10c08:    97ffceba     bl    46f0 <png_set_bgr@plt>

 lark@ubuntu:~/Public/rk356x-linux/debian/overlay-debug/usr/lib$ ./../../../../prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-readelf -s libpng12.so | grep "png_set_bgr"
   230: 000000000000ad64    20 FUNC    GLOBAL DEFAULT   11 png_set_bgr@@PNG12_0

4,aarch64-none-linux-gnu-nm/objdump/readelf/addr2line解析.o文件

(0),查看编译服务器

lark@ubuntu:~/Public/rk356x-linux/kernel$ strings vmlinux  | grep "gcc"
Linux version 5.10.160 (lark@ubuntu) (aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29)) 10.3.1 20210621, GNU ld (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29)) 2.36.1.20210621) #1 SMP Fri May 9 07:51:32 PDT 2025

(1),aarch64-none-linux-gnu-nm 查看skb_copy_bits 

lark@ubuntu:~/Public/rk356x-linux$ ./prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-nm kernel/vmlinux.o | grep "skb_copy_bits"
ffffffc009b55ba3 r __kstrtabns_skb_copy_bits
ffffffc009b5c4da r __kstrtab_skb_copy_bits
ffffffc009b0a864 r __ksymtab_skb_copy_bits
ffffffc00911a2e4 T skb_copy_bits 

 (2),aarch64-none-linux-gnu-objdump 查看skb_copy_bits 

 lark@ubuntu:~/Public/rk356x-linux$ ./prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-objdump -d kernel/vmlinux.o | grep "skb_copy_bits"
  64ab1c:    94000000     bl    1102764 <skb_copy_bits>
  64abec:    94000000     bl    1102764 <skb_copy_bits>
  64ac50:    94000000     bl    1102764 <skb_copy_bits>
  bb3768:    94000000     bl    1102764 <skb_copy_bits>
  bba0d0:    94000000     bl    1102764 <skb_copy_bits>
  bba2c8:    94000000     bl    1102764 <skb_copy_bits>
  c579b0:    94000000     bl    1102764 <skb_copy_bits>
0000000001102764 <skb_copy_bits>:

 1102798:    54000d0b     b.lt    1102938 <skb_copy_bits+0x1d4>  // b.tstop
 11027b0:    54000d4c     b.gt    1102958 <skb_copy_bits+0x1f4>
 11027c4:    340007e1     cbz    w1, 11028c0 <skb_copy_bits+0x15c>
 11027e0:    14000008     b    1102800 <skb_copy_bits+0x9c>
 11027fc:    5400060d     b.le    11028bc <skb_copy_bits+0x158>
 1102808:    5400056b     b.lt    11028b4 <skb_copy_bits+0x150>  // b.tstop
 1102824:    54fffe0d     b.le    11027e4 <skb_copy_bits+0x80>
 110284c:    340001d3     cbz    w19, 1102884 <skb_copy_bits+0x120>
 1102890:    54fffaa1     b.ne    11027e4 <skb_copy_bits+0x80>  // b.any

 (3),aarch64-none-linux-gnu-readelf 查看skb_copy_bits

lark@ubuntu:~/Public/rk356x-linux$ ./prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-readelf -s kernel/vmlinux.o | grep "skb_copy_bits"
244692: 0000000001102764   548 FUNC    GLOBAL DEFAULT    2 skb_copy_bits

 (4),aarch64-none-linux-gnu-addr2line解析地址0xffffffc00911a2e

lark@ubuntu:~/Public/rk356x-linux$ ./prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-addr2line -e kernel/vmlinux.o -f -C ffffffc00911a2e4
skb_copy_bits
/home/lark/Public/rk356x-linux/kernel/net/core/skbuff.c:3610 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/web/82586.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++自定义简单的内存池

内存池简述 在C的STL的容器中的容器如vector、deque等用的默认分配器(allocator)都是从直接从系统的堆中申请内存&#xff0c;用一点申请一点&#xff0c;效率极低。这就是设计内存池的意义&#xff0c;所谓内存池&#xff0c;就是一次性向系统申请一大片内存&#xff08;预分…

【极客日常】分享go开发中wire和interface配合的一些经验

在先前一篇文章中&#xff0c;笔者给大家提到了go语言后端编程可以用wire依赖注入模块去简化单例服务的初始化&#xff0c;同时也可以解决服务单例之间复杂依赖的问题。但实事求是来讲&#xff0c;用wire也是有一些学习成本的&#xff0c;wire在帮助解决复杂依赖的问题同时&…

20250605车充安服务器受木马攻击导致服务不可用

https://mp.weixin.qq.com/s/2JyxmDIDBa9_owNjIJ6UIg 因业务服务器受木马攻击&#xff0c;服务器网络资源损耗&#xff0c;业务负载能力受损

web3-虚拟合约 vs 现实合同:权利、义务与资产的链上新秩序

web3-虚拟合约 vs 现实合同&#xff1a;权利、义务与资产的链上新秩序 一、智能合约vs真实世界合约 传统合约&#xff1a;基础要素 如下图&#xff0c;现实世界的合约&#xff0c;会有一个条款&#xff0c;然后下面还有一个“Alice”的签名 提出合约和接受合约&#xff1b; …

【面经分享】京东

线程池核心参数 7 个参数。 coreSize maxSize 阻塞队列 时间 时间 线程工厂 拒绝策略 核心参数的话&#xff0c;有 coreSize、阻塞队列、拒绝策略。 JVM 组成 内存上划分&#xff1a; 线程私有&#xff1a;Java 虚拟机栈&#xff0c;本地方法栈、Tlab、程序计数器 …

工作流引擎-11-开源 BPM 项目 jbpm

工作流引擎系列 工作流引擎-00-流程引擎概览 工作流引擎-01-Activiti 是领先的轻量级、以 Java 为中心的开源 BPMN 引擎&#xff0c;支持现实世界的流程自动化需求 工作流引擎-02-BPM OA ERP 区别和联系 工作流引擎-03-聊一聊流程引擎 工作流引擎-04-流程引擎 activiti 优…

深度学习在非线性场景中的核心应用领域及向量/张量数据处理案例,结合工业、金融等领域的实际落地场景分析

一、工业场景&#xff1a;非线性缺陷检测与预测 1. ‌半导体晶圆缺陷检测‌ ‌问题‌&#xff1a;微米级划痕、颗粒污染等缺陷形态复杂&#xff0c;与正常纹理呈非线性关系。‌解决方案‌&#xff1a; ‌输入张量‌&#xff1a;高分辨率晶圆图像 → 三维张量 (Batch, Height,…

Python-线程同步

多线程 案例 说明&#xff1a; 唱歌方法 sing()跳舞方法 dance()启用两个线程调用主线程结束 代码 # 导入线程模块 import threading import timedef sing(name,age):time.sleep(2)print(唱歌者姓名&#xff1a; name &#xff0c;年龄&#xff1a; str(age))print(正在唱…

前端八股之JS的原型链

1.原型的定义 每一个对象从被创建开始就和另一个对象关联&#xff0c;从另一个对象上继承其属性&#xff0c;这个另一个对象就是 原型。 当访问一个对象的属性时&#xff0c;先在对象的本身找&#xff0c;找不到就去对象的原型上找&#xff0c;如果还是找不到&#xff0c;就去…

kafka命令

kafka安装先安装zookeeper&#xff0c;jdk 确保jdk版本与kafka版本匹配&#xff1a; 先启动zookeeper&#xff1a; # 启动独立安装的zookeeper ./zkServer.sh start # 也可以自动kafka自带的zookerper ./zookeeper-server-start.sh ../config/zookeeper.pr…

微服务面试(分布式事务、注册中心、远程调用、服务保护)

1.分布式事务 分布式事务&#xff0c;就是指不是在单个服务或单个数据库架构下&#xff0c;产生的事务&#xff0c;例如&#xff1a; 跨数据源的分布式事务跨服务的分布式事务综合情况 我们之前解决分布式事务问题是直接使用Seata框架的AT模式&#xff0c;但是解决分布式事务…

Linux --进程优先级

概念 什么是进程优先级&#xff0c;为什么需要进程优先级&#xff0c;怎么做到进程优先级这是本文需要解释清楚的。 优先级的本质其实就是排队&#xff0c;为了去争夺有限的资源&#xff0c;比如cpu的调度。cpu资源分配的先后性就是指进程的优先级。优先级高的进程有优先执行的…

React 性能监控与错误上报

核心问题与技术挑战 现代 React 应用随着业务复杂度增加&#xff0c;性能问题和运行时错误日益成为影响用户体验的关键因素。没有可靠的监控与错误上报机制&#xff0c;我们将陷入被动修复而非主动预防的困境。 性能指标体系与错误分类 关键性能指标定义 // performance-me…

芒果深度学习检测:开启农业新视界(猫脸码客第230期)

芒果深度学习检测&#xff1a;开启农业新视界 一、引言 芒果作为热带水果中的“明星”&#xff0c;在全球水果市场占据着重要地位&#xff0c;拥有广泛的市场需求和可观的经济价值。伴随人们生活品质的提升&#xff0c;对芒果品质的要求也愈发严苛。芒果产业规模持续扩张&#…

PDF文件转换之输出指定页到新的 PDF 文件

背景 一份 PDF 学习资料需要打印其中某几页&#xff0c;文件有几百兆&#xff0c;看到 WPS 有PDF拆分功能&#xff0c;但是需要会员&#xff0c;开了一个月会员后完成了转换。突然想到&#xff0c;会员到期后如果还要拆解的话&#xff0c;怎么办呢&#xff1f;PDF 文件拆解功能…

【计网】SW、GBN、SR、TCP

目录 三种可靠传输机制&#xff08;数据链路层&#xff09; 停止-等待&#xff08;Stop and Wait&#xff0c;SW&#xff09;协议 回退N帧&#xff08;Go-back-N&#xff0c;GBN&#xff09;协议 选择重传&#xff08;Selective Repeat&#xff0c;SR&#xff09;协议 传输…

Go的隐式接口机制

正确使用Interface 不要照使用C/Java等OOP语言中接口的方式去使用interface。 Go的Interface的抽象不仅可以用于dynamic-dispatch 在工程上、它最大的作用是&#xff1a;隔离实现和抽象、实现完全的dependency inversion 以及interface segregation(SOLID principle中的I和D)。…

Async-profiler 内存采样机制解析:从原理到实现

引言 在 Java 性能调优的工具箱中&#xff0c;async-profiler 是一款备受青睐的低开销采样分析器。它不仅能分析 CPU 热点&#xff0c;还能精确追踪内存分配情况。本文将深入探讨 async-profiler 实现内存采样的多种机制&#xff0c;结合代码示例解析其工作原理。 为什么需要内…

Android 颜色百分比对照

本文就是简单写个demo,打印下颜色百分比的数值.方便以后使用. 1: 获取透明色 具体的代码如下: /*** 获取透明色* param percent* param red* param green* param blue* return*/public static int getTransparentColor(int percent, int red, int green, int blue) {int alp…

MPLS-EVPN笔记详述

目录 EVPN简介: EVPN路由: 基本四种EVPN路由 扩展: EVPN工作流程: 1.启动阶段: 2.流量转发: 路由次序整理: 总结: EVPN基本术语: EVPN表项: EVPN支持的多种服务模式: 简介: 1.Port Based: 简介: 配置实现: 2.VLAN Based: 简介: 配置实现: 3.VLAN Bundle: 简…