GNU编译器(GCC):编译的4个过程及.elf、.list、.map文件功能说明

news2024/11/15 4:18:20

0 参考资料

GNU-LD-v2.30-中文手册.pdf
GNU linker.pdf

1 前言

一个完整的编译工具链应该包含以下4个部分:
(1)编译器
(2)汇编器
(3)链接器
(4)lib库
在GNU工具链中,对应的是:
(1)编译器:GCC(GNU Compiler Collection,GNU编译器套件)
(2)汇编器:GAS(GNU Assembler,GNU汇编器)
(3)链接器:LD(GNU Linker,GNU链接器)
(4)lib库:glibc(GNU C Library,GNU C 库)
本文介绍GNU编译器(GCC)编译的4个过程及.elf、.list、.map文件功能。

2 GNU编译器(GCC):编译的4个过程及.elf、.list、.map文件功能说明

2.1 GCC编译的4个阶段

在这里插入图片描述
GCC编译按顺序分成4个阶段:预处理、编译、汇编、链接。详细操作见上图。

2.2 .elf、.list、.map文件功能说明

2.2 .elf文件

elf全称是Executable and Linkable Format(可执行链接格式),生成于汇编阶段(目标文件.o就是elf格式文件)。
一个elf文件主要由三部分组成:elf头(ELF Header)、程序头表(Program Header Table)、节区头表(Section Header Table)。elf头包含了有关elf文件的基本信息如文件类型、机器类型、段数量及位置等;程序头表描述了文件中各个段的信息;节区头表描述了文件中各个节区的信息。
在Windows下可以使用安装了AnyELF插件的Total Commander工具查看.elf文件,参考博客:Windows上浏览ELF文件。下图是使用该插件查看到的.elf文件实例:
在这里插入图片描述

2.2 .list文件

.list文件扩展名一般为.list或.lst,是纯文本文件。它由.elf文件反汇编(也就是将机器码转换为汇编)得来。里面包含了指令地址、指令机器码、指令机器码反汇编得到的汇编指令。如下所示:
在这里插入图片描述
通过.list文件我们可以很清晰看到源码和最终生成的汇编语句、机器码、指令地址,对调试阶段排查bug非常有用。

2.3 .map文件

.map文件扩展名一般是.map,是纯文本文件。它里面描述了程序的源代码和目标代码之间的映射关系,主要包括以下几个关键部分:
(1)模块、段(入口)交叉引用。描述了各个源文件之间函数调用关系,展示了哪些函数调用了其它函数,以及这些调用在内存中的位置
(2)删除镜像未使用的程序段。描述了哪些会被删除的程序段,便于开发者确认哪些代码被优化掉了
(3)内存分布。这也是.map最常用的功能,它描述了各个段(.text段、.data段、.bss段)在内存中的地址及大小
(4)映射组件大小。.map文件还会给出整个镜像代码占用的总空间信息
以下是一个.map文件实例:
在这里插入图片描述

2.3 如何生成.list、.map文件

生成方法参考stm32MP135工程的makefile文件:

Tool invocations

################################################################################
# Automatically-generated file. Do not edit!
# Toolchain: GNU Tools for STM32 (12.3.rel1)
################################################################################

-include ../makefile.init

RM := rm -rf

# All of the sources participating in the build are defined here
-include sources.mk
-include Core/Startup/subdir.mk
-include Core/Net/subdir.mk
-include Core/Drivers/STM32MP13xx_HAL_Driver/Src/subdir.mk
-include Core/Common/subdir.mk
-include Core/Bsp/subdir.mk
-include objects.mk

ifneq ($(MAKECMDGOALS),clean)
ifneq ($(strip $(S_DEPS)),)
-include $(S_DEPS)
endif
ifneq ($(strip $(S_UPPER_DEPS)),)
-include $(S_UPPER_DEPS)
endif
ifneq ($(strip $(C_DEPS)),)
-include $(C_DEPS)
endif
endif

-include ../makefile.defs

OPTIONAL_TOOL_DEPS := \
$(wildcard ../makefile.defs) \
$(wildcard ../makefile.init) \
$(wildcard ../makefile.targets) \


BUILD_ARTIFACT_NAME := stm32MP135
BUILD_ARTIFACT_EXTENSION := elf
BUILD_ARTIFACT_PREFIX :=
BUILD_ARTIFACT := $(BUILD_ARTIFACT_PREFIX)$(BUILD_ARTIFACT_NAME)$(if $(BUILD_ARTIFACT_EXTENSION),.$(BUILD_ARTIFACT_EXTENSION),)

# Add inputs and outputs from these tool invocations to the build variables 
EXECUTABLES += \
stm32MP135.elf \

MAP_FILES += \
stm32MP135.map \

SIZE_OUTPUT += \
default.size.stdout \

OBJDUMP_LIST += \
stm32MP135.list \


# All Target
all:
	+@$(MAKE) --no-print-directory main-build && $(MAKE) --no-print-directory post-build

# Main-build Target
main-build: stm32MP135.elf secondary-outputs

# Tool invocations
stm32MP135.elf stm32MP135.map: $(OBJS) $(USER_OBJS) D:\stm32MP135\Application\STM32MP135DAEX_RAM.ld makefile objects.list $(OPTIONAL_TOOL_DEPS)
	arm-none-eabi-gcc -o "stm32MP135.elf" @"objects.list" $(USER_OBJS) $(LIBS) -mcpu=cortex-a7 -T"D:\stm32MP135\Application\STM32MP135DAEX_RAM.ld" --specs=nosys.specs -Wl,-Map="stm32MP135.map" -Wl,--gc-sections -static  -mfpu=vfpv4-d16 -mfloat-abi=hard -mthumb -Wl,--start-group -lc -lm -Wl,--end-group
	@echo 'Finished building target: $@'
	@echo ' '

default.size.stdout: $(EXECUTABLES) makefile objects.list $(OPTIONAL_TOOL_DEPS)
	arm-none-eabi-size  $(EXECUTABLES)
	@echo 'Finished building: $@'
	@echo ' '

stm32MP135.list: $(EXECUTABLES) makefile objects.list $(OPTIONAL_TOOL_DEPS)
	arm-none-eabi-objdump -h -S $(EXECUTABLES) > "stm32MP135.list"
	@echo 'Finished building: $@'
	@echo ' '

# Other Targets
clean:
	-$(RM) stm32MP135.elf stm32MP135.list stm32MP135.map default.size.stdout
	-@echo ' '

post-build:
	"C:\STM32Cube\Repository\STM32Cube_FW_MP13_V1.1.0\Utilities\ImageHeader\postbuild_STM32MP13.sh" "D:\ST\STM32CubeIDE_1.15.0\STM32CubeIDE\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.12.3.rel1.win32_1.0.100.202403111256\tools\bin"  "stm32MP135"
	-@echo ' '

secondary-outputs: $(SIZE_OUTPUT) $(OBJDUMP_LIST)

fail-specified-linker-script-missing:
	@echo 'Error: Cannot find the specified linker script. Check the linker settings in the build configuration.'
	@exit 2

warn-no-linker-script-specified:
	@echo 'Warning: No linker script specified. Check the linker settings in the build configuration.'

.PHONY: all clean dependents main-build fail-specified-linker-script-missing warn-no-linker-script-specified post-build

-include ../makefile.targets

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

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

相关文章

Linux-文件的压缩、解压

Linux系统常见有两种压缩格式,后缀分别是: .tar 称之为tarball,简单的将文件组装到一个.tar的文件内,并没有太多的文件体积减少,仅仅是简单的封装.gz gzip格式压缩文件,可以极大的减少压缩后的体积 针对这…

Lua中..和...的使用区别

一. .. 的用法 二. ... 的用法 在 Lua 中,... 是一个特殊符号,它用于表示不定数量的参数。当你在函数定义或调用中使用 ... 时,它可以匹配任意数量的参数,并将它们作为列表传递。在您的代码示例中&am…

基于SSD的RAG技术方案,推动LLM规模扩展

随着大型语言模型(LLM)的不断发展,它们在虚拟助手、聊天机器人和对话系统等应用中发挥着重要作用。然而,LLM面临的挑战之一是它们可能会生成虚假或误导性的信息,即所谓的“幻觉”。为了解决这一问题,检索增…

Java数据库连接——JDBC

目录 1、JDBC简介 2、JDBC应用 2.1 建立数据库连接 2.1.1 DriverManager静态方法获取连接 2.1.2 DataSource对象获取 2.2 获取SQL执行对象 2.2.1 SQL注入 2.2.2 Statement(执行静态SQL) 2.2.3 PreparedStatement(预处理的SQL执行对象) 2.3 执行SQL并返回结果 2.4 关…

Error when custom data is added to Azure OpenAI Service Deployment

题意:在向 Azure OpenAI 服务部署添加自定义数据时出现错误。 问题背景: I receive the following error when adding my custom data which is a .txt file (it doesnt matter whether I add it via Azure Cognitive Search, Azure Blob Storage, or F…

证书学习(五)Java实现RSA、SM2证书颁发

目录 一、知识回顾1.1 X.509 证书1.2 X509Certificate 类二、代码实现2.1 Maven 依赖2.2 RSA 证书颁发1)PfxGenerateUtil 证书文件生成工具类2)CertDTO 证书中间类3)RSACertGenerateTest RSA证书生成测试类4)执行结果2.3 SM2 证书颁发1)SM2Utils 国密SM2算法工具类2)SM2C…

查询一条 SQL 语句的流程

查询一条sql语句的流程 连接器:建立连接,管理连接、校验用户身份查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行(MSQL8.0 已删除)解析 SQL:通过解析器对 SQL 查询语句进行词法分析、语法分析&#xf…

【RH124】解释Linux文件系统权限

RH124教材中控制对文件的访问一章中有一道解释Linux文件系统权限的测验题,可以一起来看看: 一、权限解释 这是通过 ls -l 命令查看的结果。它显示了文件或目录的权限、拥有者、所属组等信息。 1、长列表的第一个字符表示文件类型: -是常…

(done) 声音信号处理基础知识(6) (How to Extract Audio Features)

参考:https://www.youtube.com/watch?v8A-W1xk7qs8&t2s 先复习之前分类的声学特征 时域特征流水线 如下是 441Khz 下一个采样点播放的时间。这比人类耳朵分辨率(10ms)还低。 所以,把多个采样点组合成一个 frame 的原因有,这是一个人…

计算机的错误计算(一百零一)

摘要 展示 在0附近数的函数值的计算精度问题。 计算机的错误计算(一百)探讨了 在一般情形下的计算精度问题。本节讨论其在0附近的数的函数值的计算精度问题。 例1. 已知 计算 不妨在Python 3.12.5下计算,则有 若在线运行R代码&#x…

阿⾥编码规范⾥⾯Manager分层介绍-专⽤名词和POJO实体类约定

开发⼈员:张三、李四、王五 ⼀定要避免单点故障 ⼀个微服务起码两个⼈熟悉:⼀个是主程⼀个是技术leader 推荐是团队⾥⾯两个开发⼈员 N⽅库说明 ⼀⽅库: 本⼯程内部⼦项⽬模块依赖的库(jar 包)⼆⽅库: 公司内部发布到中央仓库,可供公司…

车辆重识别(CVPR2016图像识别的深度残差学习ResNet)论文阅读2024/9/21

[2] Deep Residual Learning for Image Recognition ( CVPR 2016) 作者:Kaiming He Xiangyu Zhang Shaoqing Ren Jian Sun 单位:微软研究院 摘要: 更深层的神经网络更难训练。我们提出了一个残差学习框架,以减轻对比先前使用的深…

鸿蒙OpenHarmony【轻量系统内核扩展组件(动态加载)】子系统开发

基本概念 在硬件资源有限的小设备中,需要通过算法的动态部署能力来解决无法同时部署多种算法的问题。以开发者易用为主要考虑因素,同时考虑到多平台的通用性,LiteOS-M选择业界标准的ELF加载方案,方便拓展算法生态。LiteOS-M提供类…

【Linux 21】线程安全

文章目录 🌈 一、线程互斥⭐ 1. 线程间互斥的相关概念🌙 1.1 临界资源和临界区🌙 1.2 互斥和原子性 ⭐ 2. 互斥量 mutex⭐ 3. 互斥量接口🌙 3.1 初始化互斥量🌙 3.2 销毁互斥量🌙 3.3 互斥量上锁&#x1f3…

原子结构与电荷

1.原子结构与电荷 1.1 物质到底是由什么构成的 阴极射线 电磁波 电磁波 我们生活中的物质。究竟是由什么构成的呢?这个问题其实困扰了人们很久。 1.提出“原子”的概念 早在2400年前,古希腊哲学家德莫克里特就提出了原子的概念。当时他就认为&…

H264-NAL

目录 错误日志NAL简介参考资料 错误日志 拉流时存在如下日志,会因为拉流失败导致之后的任务也停止 missing picture in access unit with size 16384 Invalid NAL unit size Error splitting the input into NAL units. 之后只要设置抓取异常后,重新拉流&#xff…

Python--TCP/UDP通信

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 一.客户端与服务端通信原理 1. 服务器端 服务器端的主要任务是监听来自客户端的连接请求,并与之建立连接,然后接收和发送数据。 创建套接字:首先&#xff0…

【Fastapi】参数获取,json和query

【Fastapi】参数获取,json和query 前言giteegithub query形式json传递同步方法使用json 前言 花了半个月的时间看了一本小说,懈怠了…今天更新下fastapi框架的参数获取 gitee https://gitee.com/zz1521145346/fastapi_frame.git github https://git…

一些迷你型信息系统 - 2

1 Linux内核数据结构信息查询 Linux内核的数据结构众多,成千上万,做一个程序来存储查询信息;自己录入数据; 代码字段最长可录入65535个字符;每个字段录入时长度超限会有红色告警; 其他的以后想到再做&#…

git-repo系列教程(4) windows平台下安装git-repo客户端

文章目录 简介操作步骤1.设置/root目录和/home目录2.打开本地终端3.安装python34.安装git5.安装git -repo6.查看版本 需要注意点 简介 git-repo天生是在Linux和MacOS下使用,在windows下直接安装运行会出错. 经过不断尝试,终于找到了一种简单的安装方法,在网上现在是独一份. …