【ARM 嵌入式 编译系列 9-- GCC 编译符号表(Symbol Table)的详细介绍】
文章目录
- 什么是符号表
- 符号表的作用是什么
- 如何生成符号表
- 符号表中的数据类型有哪些?
- 符号表与map文件什么关系?
上篇文章:ARM 嵌入式 番外篇 编译系列 8 – RT-Thread 编译命令 Scons 详细讲解
什么是符号表
在 ARM GCC 中,符号表(Symbol Table)是一个记录了代码中所有符号信息的数据结构。符号可以是变量、函数、宏、类型等标识符。符号表中的每个符号都有一个唯一的名称,并且与该符号关联的还有符号的地址、类型、大小等信息。
符号表的作用是什么
符号表在编译过程中起着重要的作用。它允许编译器在编译期间解析和处理各种符号引用。在链接过程中,链接器使用符号表来解析符号的引用和重定位地址,以便正确地将程序的各个部分连接在一起。
如何生成符号表
在 GCC 中,你可以使用 -g
选项生成调试信息,其中包括符号表。这个符号表通常以一种特定的格式(如 ELF
格式)存储在可执行文件或库文件中。调试器可以使用这个符号表来显示和查询程序中的符号信息,以便在调试时定位问题或查看变量值和函数调用栈等。
使用"nm
"命令或者"objdump
"命令来生成符号表。
以下是具体步骤:
使用带有"-g
"选项的arm-gcc
编译你的代码。例如:
arm-none-eabi-gcc -g -o output.elf input.c
这会生成一个名为"output.elf
"的二进制文件,它包含了调试信息。
使用"nm
"或"objdump
"命令生成符号表。例如:
arm-none-eabi-nm -n output.elf > symbol_table.txt
输入内容如下:
arm-none-eabi-nm -n soc.oU __bss_endU __bss_startU clock_framework_initU _edataU _estackU _etextU get_syscnt_usU _heap_endU _heap_startU rt_components_board_initU rt_console_set_deviceU rt_hw_interrupt_initU rt_kprintfU rt_system_heap_initU rt_tick_increaseU _sdataU _sstackU _stext
00000000 T baud_rate_fixup
00000000 t ctrlg_key_dis
00000000 R __fsym___cmd_reboot
00000000 R __fsym___cmd_reboot_name
00000000 T get_ref_clk
00000000 W get_sys_clock
00000000 t lock_crg_key
或者
arm-none-eabi-objdump -t output.elf > symbol_table.txt
这将会生成一个名为"symbol_table.txt
"的文件,里面包含了符号表信息。
输处内容如下:
arm-none-eabi-objdump -t soc.osoc.o: file format elf32-littlearmSYMBOL TABLE:
00000000 l df *ABS* 00000000 soc.c
00000000 l d .text 00000000 .text
00000000 l d .data 00000000 .data
00000000 l d .bss 00000000 .bss
00000000 l d .text.__NVIC_SetPriority 00000000 .text.__NVIC_SetPriority
00000000 l F .text.__NVIC_SetPriority 00000054 __NVIC_SetPriority
00000000 l d .text.SCB_EnableICache 00000000 .text.SCB_EnableICache
00000000 l F .text.SCB_EnableICache 0000004c SCB_EnableICache
00000000 l d .text.SCB_EnableDCache 00000000 .text.SCB_EnableDCache
00000000 l F .text.SCB_EnableDCache 00000088 SCB_EnableDCache
00000000 l d .text.SysTick_Config 00000000 .text.SysTick_Config
00000000 l F .text.SysTick_Config 00000044 SysTick_Config
...
00000000 l d .text.lock_crg_key 00000000 .text.lock_crg_key
00000000 l F .text.lock_crg_key 00000024 lock_crg_key
00000000 l d .text.reboot 00000000 .text.reboot
00000000 l F .text.reboot 00000030 reboot
00000000 l d .rodata.name 00000000 .rodata.name
00000000 l d FSymTab 00000000 FSymTab
00000000 l d .text.get_ref_clk 00000000 .text.get_ref_clk
注意:请将上述命令中的"arm-none-eabi-gcc"、"arm-none-eabi-nm"和"arm-none-eabi-objdump"替换成你的工具链中的实际命令。
符号表中的数据类型有哪些?
在ARM GCC生成的符号表中,常见的数据类型标识有以下几种:
'T'
或't'
:表示该符号是在text(代码)段定义的函数或者其他符号;'D'
或'd'
:表示该符号是在数据段定义的已初始化数据;'B'
或'b'
:表示该符号是在BSS段定义的未初始化数据;'C'
:表示该符号是通用符号;'U'
:表示该符号在其他文件中定义,即未定义;'W'
:表示该符号是弱符号,可能在其他文件中被重定义;'N'
:表示该符号是debugging symbol.。
注意: 大写字母表示全局符号,小写字母表示局部符号。
符号表与map文件什么关系?
符号表和map文件都是在编译链接过程中生成的输出文件,主要用于程序调试和分析。它们之间的关系和区别如下:
-
符号表(Symbol Table):符号表是在编译过程中生成的,主要包含了源代码中定义的函数和变量的信息,如名称、类型、大小、地址等。通过查看符号表,我们可以看到源代码中每个符号在编译后的具体信息,便于我们在调试过程中定位和解决问题。
-
Map文件:Map文件是在链接过程中生成的,主要包含了各个目标文件和库文件在链接过程中的地址分配情况,以及程序的内存布局等信息。通过查看Map文件,我们可以看到程序的具体内存布局,便于我们理解程序的运行过程和优化程序的内存使用。
因此,符号表和Map文件虽然都包含了程序的符号信息,但它们的生成过程和主要用途是不同的,一般来说,符号表主要用于程序调试,而Map文件主要用于程序分析和优化。
上篇文章:ARM 嵌入式 番外篇 编译系列 8 – RT-Thread 编译命令 Scons 详细讲解
相关文章:
【ARM 嵌入式 编译系列 9-- GCC 编译符号表(Symbol Table)的详细介绍】
文章目录 什么是符号表符号表的作用是什么如何生成符号表符号表中的数据类型有哪些?符号表与map文件什么关系? 上篇文章:ARM 嵌入式 番外篇 编译系列 8 – RT-Thread 编译命令 Scons 详细讲解 什么是符号表 在 ARM GCC 中,符号表…...
Apache Doris 入门教程27:BITMAP精准去重和HLL近似去重
BITMAP 精准去重 背景 Doris原有的Bitmap聚合函数设计比较通用,但对亿级别以上bitmap大基数的交并集计算性能较差。排查后端be的bitmap聚合函数逻辑,发现主要有两个原因。一是当bitmap基数较大时,如bitmap大小超过1g,网络/磁盘…...
bug总结
bug总是意外的出现,对于语法问题导致的bug是容易排查的,对于逻辑的bug和环境的bug往往令人头疼。在这里,将这些收集起来。、 【1-8来自对博客认输了!这些Bug让我目瞪口呆!_电脑放青藏高原共振是真的?_Truda.的博客-C…...

DC电源模块的高转换率
BOSHIDA DC电源模块的高转换率 DC电源模块是将交流电转换为直流电供应设备使用的装置,是现代工业制造和电子产品中不可或缺的组件之一。高转换率是DC电源模块最重要的性能之一,它直接影响着电源的效率、功耗和发热等方面,因此也深受设计师的关…...

用于网页抓取的最佳 Python 库
探索一系列用于网页抓取的强大 Python 库,包括用于 HTTP 请求、解析 HTML/XML 和自动浏览的库。 网络抓取已成为当今数据驱动世界中不可或缺的工具。Python 是最流行的抓取语言之一,拥有一个由强大的库和框架组成的庞大生态系统。在本文中,我…...
异步回调中axios,ajax,promise,cors详解区分
Ajax、Promise和Axios之间的关系是,它们都是用于在Web应用程序中发送异步HTTP请求的JavaScript库,但它们有不同的实现方式和用法。 Ajax是一种旧的技术,使用XMLHttpRequest对象来向服务器发送异步请求并获取响应。它通常需要手动编写回调函数…...

IoTDB原理剖析
一、介绍 IoTDB(物联网数据库)是一体化收集、存储、管理与分析物联网时序数据的软件系统。 Apache IoTDB采用轻量式架构,具有高性能和丰富的功能。 IoTDB从存储上对时间序列进行排序,索引和chunk块存储,大大的提升时序…...

中国1990-2021连续30年土地利用数据CLCD介绍及下载
CLCD数据介绍 CLCD(China Land Cover Dataset)数据集由武汉大学黄昕老师公布,黄昕老师基于Google Earth Engine上335,709景Landsat数据,制作中国年度土地覆盖数据集(annual China Land Cover Dataset, CLCD),包含1985+1990—2020中国逐年土地覆盖信息。 为此,黄昕老师…...

Tubi 前端测试:迁移 Enzyme 到 React Testing Library
前端技术发展迅速,即便不说是日新月异,每年也都推出新框架和新技术。Tubi 的产品前端代码仓库始建于 2015 年,至今 8 年有余。可喜的是,多年来紧随 React 社区的发展,Tubi 绝大多数的基础框架选型都遵循了社区流行的最…...

Chrome
Chrome 简介下载 简介 Chrome 是由 Google 开发的一款流行的网络浏览器。它以其快速的性能、强大的功能和用户友好的界面而闻名,并且在全球范围内被广泛使用。Chrome 支持多种操作系统,包括 Windows、macOS、Linux 和移动平台。 Chrome官网: https://ww…...

零代码编程:用ChatGPT批量删除Excel文件中的行
文件夹中有上百个Excel文件,每个文件中都有如下所示的两行,要进行批量删除。 在ChatGPT中输入提示词: 你是一个Python编程专家,要完成一个处理Excel文件内容的任务,具体步骤如下: 打开F盘的文件夹&#x…...

GaussDB数据库SQL系列-UNION UNION ALL
目录 一、前言 二、GaussDB UNION/UNION ALL 1、GaussDB UNION 操作符 2、语法定义 三、GaussDB实验示例 1、创建实验表 2、合并且除重(UNION) 3、合并不除重(UNION ALL) 4、合并带有WHERE子句SQL结果集(UNION ALL) 5、…...

Azure创建第一个虚拟机
首先,登录到 Azure 门户 (https://portal.azure.com/)。在 Azure 门户右上角,点击“虚拟机”按钮,并点击创建,创建Azure虚拟机。 在虚拟机创建页面中,选择所需的基本配置,包括虚拟机名称、操作系统类型和版…...

Redis 之 缓存预热 缓存雪崩 缓存击穿 缓存穿透
目录 一、缓存预热 1.1 缓存预热是什么? 1.2 解决方案: 二、缓存雪崩 2.1 缓存雪崩是什么?怎么发生的? 2.2 怎么解决 三、缓存穿透 3.1 是什么?怎么产生的呢? 3.2 解决方案 3.2.1、采用回写增强&a…...
Golang 程序性能优化利器 PGO 详解(二):收集样本数据和编译
在软件开发过程中,性能优化是不可或缺的一部分。无论是在Web服务、数据处理系统还是实时通信中,良好的性能都是至关重要的。Golang 从1.20版版本开始引入的 Profile Guided Optimization(PGO)机制能够帮助更好地优化 Go 程序的性能…...

《格斗之王AI》使用指南
目录 一、说明 二、步骤 1. 下载 2.配置环境 3.替换 4.测试 5.训练 一、说明 该项目是 针对B站UP主 林亦LYi 的作品 格斗之王!AI写出来的AI竟然这么强!的使用指南,目的是在帮助更多小白轻松入门,一起感受AI的魅力。 林亦LYi…...

创新引领城市进化:人工智能和大数据塑造智慧城市新面貌
人工智能和大数据等前沿技术正以惊人的速度融入智慧城市的方方面面,为城市的发展注入了强大的智慧和活力。这些技术的应用不仅令城市管理更高效、居民生活更便捷,还为可持续发展和创新奠定了坚实的基础。 在智慧城市中,人工智能技术正成为城市…...
iOS开发-处理UIControl触摸事件TrackingWithEvent
IOS BUG记录 之 处理UIControl的点击事件。 UIControl的触摸事件的方法是beginTrackingWithTouch:withEvent:,continueTrackingWithTouch:withEvent:,endTrackingWithTouch:withEvent:,cancelTrackingWithEvent: ##下面简单的介绍一下 beg…...

学无止境·运维高阶⑤(LVS-DR 群集 配置Nginx负载均衡)
LVS-DR 群集 && 配置Nginx负载均衡 一、LVS-DR 群集1、相关配置环境2、在RS上配置并启动脚本2.1相关脚本2.2 启动脚本,另一台RS同样步骤 3、LVS-DR模式配置脚本4、测试 二、Nginx负载均衡1、安装Nginx并关闭相应设置2、向主机 node2,node3 写入内…...
badger的mainfest文件解读
1. mainfest文件的作用 mainfest文件是记录lsm tree中的各层tables表的创建删除记录的一个日志文件,主要的作用是badger数据库重启后,重新恢复内存中的各层tables表 2、内容结构 先是8个字节的魔数,魔数的结构如下 ----------------------…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...