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

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.initRM := 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.mkifneq ($(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.defsOPTIONAL_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 2warn-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.xdnf.cn/news/148185.html

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

相关文章

开源 AI 智能名片 S2B2C 商城小程序与营销工具的快速迭代

摘要:本文以开源 AI 智能名片 S2B2C 商城小程序为研究对象,探讨在营销工具快速迭代的背景下,该小程序如何借鉴以拼多多为代表的“小程序拼团”、以蘑菇街为代表的“小程序直播”、以花点时间为代表的“小程序按月订花”等经典案例&#xff0c…

数据集-目标检测系列-摩托车检测数据集 motorcycle >> DataBall

数据集-目标检测系列-摩托车检测数据集 motorcycle >> DataBall 数据集-目标检测系列-摩托车(motorcycle)检测数据集 数据量:1W 想要进一步了解,请联系 DataBall。 DataBall 助力快速掌握数据集的信息和使用方式&#xf…

《论软件架构建模技术与应用》写作框架,软考高级系统架构设计师

论文真题 软件架构风格是描述一类特定应用领域中系统组织方式的惯用模式,反映了领域中诸多系统所共有的结构特征和语义特征,并指导如何将各个模块和子系统有效组织成一个完整的系统。分层架构是一种常见的软件架构风格,能够有效简化设计&…

Python语法进阶之路

一、Python基础 1.1 注释 定义和作用 对代码解释说明,增强可读性 单行注释 # 多行注释 """ 这是一个多行注释 """ 1.2 变量及变量类型 定义和作用 计算机目的是计算,编程是为了更方便计算,计算对象就是…

论前端框架的对比和选择 依据 前端框架的误区

前端框架的对比和选择依据 在前端开发中,有多种框架可供选择,以下是一些常见前端框架的对比和选择依据: 一、Vue.js 特点: 渐进式框架,灵活度高,可以逐步引入到项目中。学习曲线相对较平缓,容…

Attention is All You Need精读

原文开头,不是搬运 dog。All attention is all you need Abstract 摘要 这篇文章的内容源于基于编码器-解码器架构的RNN模型,在其他人的工作中,我们可以发现注意力机制对于提升编码器-解码器架构模型的性能很重要。这篇文章提出了一个比较简…

SpringBoot 更改启动图标

每次springboot开启时,开会显示spring的图标,这个图标是可以修改的。 一、原始的图标样式 二、修改图标样式 https://patorjk.com/software/taag/#pdisplay&fGraffiti&thttps://patorjk.com/software/taag/#pdisplay&fGraffiti&t 在…

MMROTATE 1.X特征图可视化(绘制Heat Map)

本文参考MMYOLO官方的特征图可视化教程,对MMROTATE相关算法进行特征图可视化 1. 新建featmap_vis_demo.py文件 在mmrotate项目文件夹下新建 featmap_vis_demo.py : # Copyright (c) OpenMMLab. All rights reserved. import argparse import os from t…

“吉林一号”宽幅02B系列卫星

离轴四反光学成像系统 1.光学系统参数: 焦距:77.5mm; F/#:7.4; 视场:≥56゜; 光谱范围:400nm~1000nm。 2.说明: 光学系统采用离轴全反射式结构,整…

CIM平台应用的一些思考

今天中午看了一些书,讲致幻剂在疾病治疗的一些作用。致幻剂包括毒蘑菇等这类东西,有精神疾病或其他心里疾病的患者在吸食或注射(专业医生的指导下)会忘记或减轻身体的痛苦,忘记死亡,相信永生,治…

VMWare虚拟机安装CentOS-7-x86_64-DVD-1611操作系统

VMWare虚拟机安装CentOS7操作系统 1、虚拟机准备打开VMware单机创建新的虚拟机典型与自定义安装选择虚拟机硬件兼容性选择安装程序光盘映射文件(iso)选择客户机操作系统命名虚拟机处理器配置内存配置网络连接类型I/O类型选择磁盘类型选择磁盘指定磁盘的最大磁盘大小磁盘名称我们…

高中数学:立体几何-平面的定义与公理

文章目录 一、平面定义及画法1、定义2、表示方法 二、公理1、公理12、公理23、公理3 一、平面定义及画法 1、定义 平面是向四周无限延展的。 2、表示方法 我们常用矩形的直观图,即平行四边形表示平面. 我们常用希腊字母α,β&#xff0c…

八. 实战:CUDA-BEVFusion部署分析-coordTrans Precomputation

目录 前言0. 简述1. 案例运行2. coordTrans3. Precomputation总结下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》,链接。记录下个人学习笔记,仅供自己参考 本次课程我们来学习下课程第八章—实战:CUDA-BEVFusion部署分…

『正版软件』XYplorer 专业的 Windows 文件管理工具软件

在数字化时代,我们每天都在与各种文件打交道。无论是工作文档、个人照片还是多媒体资料,管理这些文件的效率直接关系到我们的工作效率和生活体验。今天,我要向大家推荐一款功能强大、操作简便的文件管理软件 —— XYplorer。 XYplorer&#x…

【小bug】使用 RestTemplate 工具从 JSON 数据反序列化为 Java 对象时报类型转换异常

起因:今天编写一个请求时需要通过RestTemplate调用外部接口,获取一些信息,但是在获取了外部接口响应内容后,使用强制转换发现报了类型转换异常。之前也遇到过,但是没记录下来,今天又查了一遍……干脆记录一…

【hot100-java】【搜索旋转排序数组】

R8-二分查找篇 等等,不是?O(logn)?那岂不是一次遍历数组都超时了hh. 二分查找分类 class Solution {public int search(int[] nums, int target) {if (numsnull||nums.length0){return -1;}int start0;int endnums.length-1;int mid;while …

以太坊客户端Geth的介绍与搭建

一、以太坊客户端 1.介绍 以太坊客户端是指用于连接、交互和参与以太坊区块链网络的软件。以太坊客户端允许用户执行各种操作,如发送交易、挖矿、部署智能合约、同步区块链数据等。 2.功能 区块链同步:客户端会下载并验证以太坊区块链的所有区块&…

windows 出现身份验证错误,要求的函数不受支持

现象环境: win10 mstsc内网远程server2016,出现错误代码: 远程桌面连接出现身份验证错误。要求的函数不受支持。这可能是由于CredSSP加密数据库修正 出现身份验证错误 原因: 系统更新,微软系统补丁的更新将 Cred…

【Godot4.3】2D程序生成植物概论

概述 Godot的2D程序化植物生成是我一直想要探讨的一个内容,但是一直没有真正开动,在刚过去的中秋节假期期间,在老家无聊,在一个素描本上构思了一系列想法。本篇就基于这些自己的想法介绍一下程序化植物生成的基本思路。不一定对&…

c++ 找到给定点集的简单闭合路径(Find Simple Closed Path for a given set of points)

给定一组点,将这些点连接起来而不相交 例子: 输入:points[] {(0, 3), (1, 1), (2, 2), (4, 4), (0, 0), (1, 2), (3, 1}, {3, 3}}; 输出:按以下顺序连接点将 不造成任何交叉 {(0, 0), (3, …