【ARM 嵌入式 编译系列 6 -- GCC objcopy, objdump, readelf, nm 介绍】

文章目录

    • GCC objcopy 简介
      • objcopy 常用参数
    • GCC objdump 简介
    • GCC readelf 介绍
    • GCC nm 介绍

GCC objcopy 简介

objcopy 是 GNU二进制工具集(binutils)的一部分,主要用于复制和转换目标文件。

在ARM GCC中,arm-none-eabi-objcopy通常用于从链接后的ELF格式文件中提取出二进制文件或其他格式的内容,这对于嵌入式开发特别有用,因为这样的文件可以直接烧写到微控制器的闪存中。

objcopy 常用参数

下面是一些常用的参数:

-O:表示输出文件的格式。常见的格式有:binary(二进制文件)、ihex(Intel HEX文件)、srec(Motorola SREC文件)、elf32-littlearm(小端字节序的ELF文件)等;

-S(或 --strip-all):去除所有的符号信息和重定位信息,使得输出文件更小;

-j:仅复制指定的section。例如,-j .text 表示只复制.text段的内容;
-R (或--remove-section),输出文件中不要重定位信息和符号信息,缩小了文件尺寸。

下面是一个使用示例:

arm-none-eabi-objcopy -O binary -S -j .text -j .data myprogram.elf myprogram.bin

这行命令的意思是:从myprogram.elf中提取出.text段和.data段的内容,并将它们转换为二进制文件myprogram.bin。同时,所有的符号信息和重定位信息都会被去除。

注意:在使用arm-none-eabi-objcopy时,你应当确保输入的ELF文件已经正确链接。否则,你可能会得到一个无法在硬件上运行的二进制文件,此外,使用objcopy不能够改变大/小端。

$ arm-linux-objcopy -O binary -R .note -R .comment -S boot.elf boot.bin

GCC objdump 简介

GCC objdump 用于显示关于目标文件的信息。这些信息包括文件的头部信息、节区内容、符号表、重定位入口点等。使用 objdump 可以对二进制文件进行深入分析,这对于调试和理解程序的工作原理非常有用。

Objdump 支持大量的命令行选项,可以用来控制显示的信息的数量和类型。以下是一些主要的选项:

-a, --archive-header: 显示存档的头部信息;
-d, --disassemble: 反汇编代码段;
-h, --section-headers: 显示节区头部;
-r, --reloc: 显示重定位入口点;
-s, --full-contents: 显示所有节区的完全内容;
-t, --syms: 显示符号表。

一个简单的使用例子如下,假设我们编译出一个名为 soc.o 的 文件:

arm-none-eabi-objdump -h soc.osoc.o:     file format elf32-littlearmSections:
Idx Name          Size      VMA       LMA       File off  Algn0 .text         00000000  00000000  00000000  00000034  2**1CONTENTS, ALLOC, LOAD, READONLY, CODE1 .data         00000000  00000000  00000000  00000034  2**0CONTENTS, ALLOC, LOAD, DATA2 .bss          00000000  00000000  00000000  00000034  2**0ALLOC3 .text.__NVIC_SetPriority 00000054  00000000  00000000  00000034  2**2CONTENTS, ALLOC, LOAD, READONLY, CODE4 .text.SCB_EnableICache 0000004c  00000000  00000000  00000088  2**2
....

上面的命令显示了 soc 文件中各个节区的信息,包括名称、大小、虚拟地址、加载地址和文件偏移量等。

另一个例子是反汇编代码段

arm-none-eabi-objdump -d soc.osoc.o:     file format elf32-littlearmDisassembly of section .text.__NVIC_SetPriority:00000000 <__NVIC_SetPriority>:0:   b480            push    {r7}2:   b083            sub     sp, #124:   af00            add     r7, sp, #06:   4603            mov     r3, r08:   6039            str     r1, [r7, #0]a:   80fb            strh    r3, [r7, #6]c:   f9b7 3006       ldrsh.w r3, [r7, #6]10:   2b00            cmp     r3, #012:   db0a            blt.n   2a <__NVIC_SetPriority+0x2a>14:   683b            ldr     r3, [r7, #0]

上面的命令显示了 soc 文件中.text. 段的反汇编代码。

GCC readelf 介绍

readelf 是一个用于显示 ELF 格式文件信息的命令行工具, objdump 类似,readelf 也可以显示文件的头部信息、节区内容、符号表、重定位入口点等。但是,readelf 是专门针对 ELF 格式文件的工具,因此它可以显示更加详细的信息。

以下是一些主要的 readelf 选项:
-a, --all: 显示所有信息;
-h, --file-header: 显示 ELF 头部;
-l, --program-headers, --segments: 显示程序头部或段;
-S, --section-headers, --sections: 显示节区头部;
-s, --syms, --symbols: 显示符号表;
-r, --relocs: 显示重定位入口点。

一个简单的使用例子如下,假设我们有一个名为 soc.o 的文件:

arm-none-eabi-readelf -h soc.o
ELF Header:Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00Class:                             ELF32Data:                              2's complement, little endianVersion:                           1 (current)OS/ABI:                            UNIX - System VABI Version:                       0Type:                              REL (Relocatable file)Machine:                           ARMVersion:                           0x1Entry point address:               0x0Start of program headers:          0 (bytes into file)Start of section headers:          25652 (bytes into file)Flags:                             0x5000000, Version5 EABISize of this header:               52 (bytes)Size of program headers:           0 (bytes)Number of program headers:         0Size of section headers:           40 (bytes)Number of section headers:         61Section header string table index: 60

上面的命令显示了 soc.o 文件的头部信息。

另一个例子是显示节区头部:

arm-none-eabi-readelf -S soc.o
There are 61 section headers, starting at offset 0x6434:Section Headers:[Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al[ 0]                   NULL            00000000 000000 000000 00      0   0  0[ 1] .text             PROGBITS        00000000 000034 000000 00  AX  0   0  2[ 2] .data             PROGBITS        00000000 000034 000000 00  WA  0   0  1[ 3] .bss              NOBITS          00000000 000034 000000 00  WA  0   0  1[ 4] .text.__NVIC[...] PROGBITS        00000000 000034 000054 00  AX  0   0  4[ 5] .text.SCB_En[...] PROGBITS        00000000 000088 00004c 00  AX  0   0  4[ 6] .text.SCB_En[...] PROGBITS        00000000 0000d4 000088 00  AX  0   0  4[ 7] .text.SysTic[...] PROGBITS        00000000 00015c 000044 00  AX  0   0  4[ 8] .rel.text.Sy[...] REL             00000000 0047b8 000008 08   I 58   7  4[ 9] .text.crg_key_en  PROGBITS        00000000 0001a0 000028 00  AX  0   0  4[10] .text.crg_key_dis PROGBITS        00000000 0001c8 000028 00  AX  0   0  4[11] .text.unlock[...] PROGBITS        00000000 0001f0 000028 00  AX  0   0  4[12] .text.lock_c[...] PROGBITS        00000000 000218 000024 00  AX  0   0  4[13] .text.reboot      PROGBITS        00000000 00023c 000030 00  AX  0   0  4[14] .rodata.name      PROGBITS        00000000 00026c 00001e 00   A  0   0  4[15] FSymTab           PROGBITS        00000000 00028c 00000c 00   A  0   0  4[16] .relFSymTab       REL             00000000 0047c0 000018 08   I 58  15  4[17] .text.get_ref_clk PROGBITS        00000000 000298 000078 00  AX  0   0  4

上面的命令显示了 soc.o 文件中的节区头部信息。

GCC nm 介绍

nm 用于显示目标文件的符号表信息的命令行工具。符号表包含了程序中函数和变量的符号信息,这对于定位问题和理解程序的工作原理非常有用。

以下是一些主要的 nm 选项:

-a, --debug-syms: 显示调试符号;
-g, --external-only: 只显示外部符号;
-n, --numeric-sort: 按照地址排序符号;
-r, --reverse-sort: 反向排序符号;
-S, --print-size: 显示符号的大小;
-u, --undefined-only: 只显示未定义的符号。

一个简单的使用例子如下,假设我们有一个名为 soc.o 文件:

arm-none-eabi-nm -u soc.oU __bss_endU __bss_startU clock_framework_initU console_uart_initU _edataU enable_syscntU _estackU _etextU _heap_endU _heap_startU power_domain_framework_initU reset_framework_initU rt_components_board_initU rt_console_set_deviceU rt_hw_interrupt_initU rt_interrupt_enterU rt_interrupt_leaveU rt_kprintfU rt_system_heap_initU rt_tick_increaseU _sdataU _sstackU _stext

上面的命令只显示soc.o文件未定义的符号 。每行的输出包含了符号的类型和名字。类型是一个字符,指示了符号的类型和属性。

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

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

相关文章

C语言 字符指针

1、介绍 概念&#xff1a; 字符指针&#xff0c;就是字符类型的指针&#xff0c;同整型指针&#xff0c;指针指向的元素表示整型一样&#xff0c;字符指针指向的元素表示的是字符。 假设&#xff1a; char ch a;char * pc &ch; pc 就是字符指针变量&#xff0c;字符指…

数据库--数据类型

数据库相关链接&#xff1a; 数据库基础操作--增删改查&#xff1a;http://t.csdn.cn/189CF 数据库--三大范式、多表查询、函数sql&#xff1a;http://t.csdn.cn/udJSG 数据类型 创建表的时候&#xff0c;我们在类型这里给出了不同的选项&#xff0c;比如有int &#xff0c;…

python num循环怎么从1开始

如何实现python for循环从1开始&#xff1f; range()函数的作用和用法&#xff1a; 编写一个从数值1开始的循环&#xff1a; 执行后得到的结果 其他注意事项

HCIA---动态路由---RIP协议

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 前言 一.动态路由 二.动态路由协议分类 IGP&#xff1a;内部网关协议 EGP:外部网关协议 三.RIP协议概述 RIP版本分类&#xff1a; RIP三要素&#xff1a; RIP…

3.0 Python 迭代器与生成器

当我们需要处理一个大量的数据集合时&#xff0c;一次性将其全部读入内存并处理可能会导致内存溢出。此时&#xff0c;我们可以采用迭代器Iterator和生成器Generator的方法&#xff0c;逐个地处理数据&#xff0c;从而避免内存溢出的问题。 迭代器是一个可以逐个访问元素的对象…

【LeetCode】870 . 优势洗牌

870 . 优势洗牌 方法&#xff1a;贪心 思路 这道题的思想类似于 “田忌赛马” &#xff0c;把 nums1 当成是田忌的马&#xff0c;nums2 当成是齐威王的马。 讨论田忌的下等马&#xff08;nums1 的最小值&#xff09;&#xff1a; 如果它能比过齐威王的下等马&#xff08;nums…

Java设计模式之策略模式

1. 策略模式介绍 1、根据它来避免 if-else 或 switch 分支判断&#xff0c;避免使用多重条件转移语句&#xff1b; 2、支持“开闭原则”&#xff0c;可以在原有基础上选择行为方法&#xff0c;同时允许增加行为方法。 2. 策略模式结构类 ① 接口或抽象类&#xff1a;自定义接口…

探讨uniapp的navigator 页面跳转问题

navigator 页面跳转。该组件类似HTML中的<a>组件&#xff0c;但只能跳转本地页面。目标页面必须在pages.json中注册。 "tabBar": {"color": "#7A7E83","selectedColor": "#3cc51f","borderStyle": "bl…

分布式学习最佳实践:从分布式系统的特征开始

正文   在延伸feature&#xff08;分布式系统需要考虑的特性&#xff09;的时候&#xff0c;我逐渐明白&#xff0c;这是因为要满足这些feature&#xff0c;才设计了很多协议与算法&#xff0c;也提出了一些理论。比如说&#xff0c;这是因为要解决去中心化副本的一致性问题&…

第三节:在WORD为应用主窗口下关闭EXCEL的操作(1)

【分享成果&#xff0c;随喜正能量】夏日里的遗憾&#xff0c;一定都会被秋风温柔化解。吃素不难&#xff0c;难于不肯捨贪口腹之心。若不贪口腹&#xff0c;有何吃素之不便乎。虽吃华素&#xff0c;不吃素日&#xff0c;亦须少吃。以一切物类&#xff0c;皆是贪生怕死&#xf…

【Linux】以太网协议——数据链路层

链路层解决的问题 IP拥有将数据跨网络从一台主机送到另一台主机的能力&#xff0c;但IP并不能保证每次都能够将数据可靠的送到对端主机&#xff0c;因此IP需要上层TCP为其提供可靠性保证&#xff0c;比如数据丢包后TCP可以让IP重新发送数据&#xff0c;最终在TCP提供的可靠性机…

【LeetCode】102. 二叉树的层序遍历、107. 二叉树的层序遍历 II

作者&#xff1a;小卢 专栏&#xff1a;《Leetcode》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 102. 二叉树的层序遍历 102. 二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节…

记录一下Java实体转json字段顺序问题

特殊需求&#xff0c;和C交互他们那边要求字段顺序要和他们定义的一致(批框架) 如下&#xff1a; Data public class UserDto {private String name;private Integer age;private String addr; }未转换前打印&#xff1a; 转换后打印&#xff1a; 可以看到转换为json顺序打印…

SpringMVC 的基本概念(一)

1.1 关于三层架构和 MVC 1.1.1 三层架构 我们的开发架构一般都是基于两种形式&#xff0c;一种是 C/S 架构&#xff0c;也就是客户端 / 服务器&#xff0c;另一种是 B/S 架构&#xff0c;也就 是浏览器服务器。在 JavaEE 开发中&#xff0c;几乎全都是基于 B/S 架构…

Windows 环境下 Python3 离线安装 cryptography 失败

发布Flask Web项目时&#xff0c;报错缺少Cryptography&#xff0c;于是尝试重新安装该库&#xff0c;但本机没有网络&#xff0c;只支持手动离线安装&#xff0c;尝试了pip、setup.py两种方式安装&#xff0c;结果都报错。。最后使用将安装包拷贝至本机(在其他电脑上安装的sit…

计算机网络 网络层 IPv4地址

A类地址第一位固定0 B类10 其下同理

Golang基础教程

Golang基础教程 golang简介安装golanggolang开发工具go常用命令golang开发 vscode快捷键如何编写golang代码golang标识符、关键字、命名规则golang变量go语言常量go语言数据类型go语言布尔类型go语言数字类型golang字符串golang格式化输出golang运算符go语言中的流程控制golan…

hutool 读取每个sheet,数据转成List<Map<>>的格式

1.接收上传的excel文件流,取出第一个sheet ApiOperation("【干部管理】根据excel导入干部和企业")PostMapping("/importExcel")Transactionalpublic Result importExcel(RequestParam MultipartFile file) throws IOException {Logger logger LoggerFact…

22 | 书籍推荐数据分析

import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn import neighbors from sklearn.model_selection import train_test_split from sklearn.preprocessing import