10 链接器--定制链接脚本 配合使用系统服务 设计体积受限的可执行程序

嵌入式开发实战:如何用GCC的__attribute__((section))优化SDRAM函数布局(附链接器脚本配置) 本文详细介绍了如何利用GCC的`__attribute__((section))`属性优化嵌入式系统中的SDRAM函数布局,包括编译、链接和运行时配置的全流程。通过实战案例和链接器脚本配置,帮助开发者解决内存不足和性能瓶颈问题,提升关键函数的执行效率。 阅读详情

学习自唐佐林老师,仅作为个人笔记


方向:如何设计一个体积受限的可执行程序,内容只有打印一行字符串

解决思路:

怎样做到体积最小?
1 独立于 libc 库进行编译链接

2 独立于 其他 一些无关的或者说仅仅使用了一点点部分的第三方库
总之尽量减少使用其他的库

所以需要自己定义链接脚本,因为既然独立于 libc库,也就是说需要自己指定入口函数了,不再使用默认的_start 入口函数了

3 不依赖 libc 库的 printf(),自己直接使用内嵌汇编调用系统服务进行字符串打印!!

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

链接脚本 只留代码段 和 只读数据段,因为字符串位于只读数据段,其余不用的段屏蔽。并且冲定义入口函数

链接脚本

ENTRY(program) 

SECTIONS
{
    .text 0x08048000 + SIZEOF_HEADERS :
    {
        *(.text)
        *(.rodata)
    }
    
    /DISCARD/ :
    {
        *(*)
    }
}

Makefile

CC := gcc
LD := ld
RM := rm -fr

TARGET := program.out
SRC := $(TARGET:.out=.c)
OBJ := $(TARGET:.out=.o)
LDS := $(TARGET:.out=.lds)

.PHONY : rebuild clean all

$(TARGET) : $(OBJ) $(LDS)
	#静态链接
	$(LD) -static -T $(LDS) -o $@ $<
	@echo "Target File ==> $@"
	
$(OBJ) : $(SRC)
	#关闭 GCC 内置函数功能,不优化编译
	$(CC) -fno-builtin -o $@ -c $^
	
rebuild : clean all

all : $(TARGET)

clean :
	$(RM) $(TARGET) $(OBJ)

C文件

void print(const char* s, int l);
void exit(int code);

void program()
{
    print("D.T.Software\n", 13);
    exit(0);
}

void print(const char* s, int l)
{
    asm volatile (
        "movl $4, %%eax\n"
        "movl $1, %%ebx\n"
        "movl %0, %%ecx\n"
        "movl %1, %%edx\n"
        "int $0x80     \n"
        :
        : "r"(s), "r"(l)
        : "eax", "ebx", "ecx", "edx"
    );
}

void exit(int code)
{
    asm volatile (
        "movl $1, %%eax\n"
        "movl %0, %%ebx\n"
        "int $0x80     \n"
        :
        : "r"(code)
        : "eax", "ebx"
    );
}

在这里插入图片描述

Power Architecture嵌入式开发:链接器优化与汇编编程实战指南 在嵌入式系统开发中,链接器优化是提升代码效率和节省存储空间的关键技术。链接器作为编译流程的最后环节,负责将多个目标文件合并为可执行程序,其优化原理包括代码合并、地址计算优化等,能显著减少程序体积并提升执行速度。这项技术的核心价值在于,它能在不修改源代码的前提下,通过分析最终的程序布局,对机器码进行精细化调整,尤其适用于资源受限的嵌入式场景,如汽车电子控制单元(ECU)和工业控制器。理解链接器的工作原理,需要结合对底层汇编语言的掌握,例如Power Architecture的指令集和调用约定。本文以NXP C 阅读详情

相关推荐

Keil MDK中One ELF Section per Function选项对代码体积的影响与优化实践

在嵌入式系统开发中,代码体积优化是提升资源利用效率的关键环节。编译器与链接器协同工作,通过垃圾回收机制移除未使用的代码和数据,从而减少最终二进制文件的大小。其中,函数级的垃圾回收技术能够显著提升空间回收的粒度,其核心原理在于改变目标文件中代码的组织方式。通过为每个函数生成独立的ELF段,链接器可以精确识别并剔除未被引用的函数,这对于使用大型库或模块化程度高的项目尤其有价值。这种技术不仅降低了ROM占用,也为内存受限的嵌入式设备带来了更好的成本效益。在实际应用中,结合Keil MDK的One ELF Sect

weixin_34167819的博客 345

嵌入式开发中链接器脚本的内存布局设计与实战应用

在嵌入式系统开发中,内存管理是核心基础概念,它决定了程序代码与数据在物理存储介质中的组织方式。其原理在于通过链接器脚本(Linker Script)这一关键工具,将编译器生成的逻辑内存段映射到芯片的物理地址空间,实现软件逻辑与硬件资源的精确对接。这项技术的价值在于赋予开发者对内存布局的绝对控制权,从而优化性能、节省存储空间并满足特定硬件约束。应用场景广泛覆盖从资源受限的微控制器到高性能处理器,尤其在需要精细控制代码位置、实现内存隔离或加速关键算法的嵌入式项目中至关重要。本文聚焦于**链接器脚本**的编写与调

488

嵌入式开发中链接器命令文件(LCF)的内存布局与实战配置详解

在嵌入式系统开发中,内存管理是确保程序稳定高效运行的核心基础。不同于拥有虚拟内存管理的通用操作系统,嵌入式环境通常直接面向物理硬件,要求开发者精确控制代码与数据在芯片存储介质中的存放位置。其原理是通过链接器命令文件(Linker Command File, LCF)这一关键配置文件,在编译链接阶段指导链接器将不同的程序节区(如.text、.data、.bss)分配到指定的物理地址空间。这项技术的核心价值在于能够满足中断向量表固定地址、关键数据高速访问、资源受限等硬性约束,从而优化性能并保证系统正确启动。其典

weixin_30482383的博客 334

MSP430 GCC链接器优化:从内存管理到代码缩减实战指南

在嵌入式系统开发中,链接器扮演着至关重要的角色,它负责将编译后的目标文件合并、重定位并分配到具体的内存地址。理解链接器的工作原理,特别是符号解析、节区合并与内存分配这三个核心阶段,是进行高效内存管理的基础。通过精细控制链接过程,开发者可以显著优化程序的内存占用和启动性能,这对于资源受限的微控制器(如TI MSP430系列)具有极高的技术价值。在实际应用中,链接器优化技巧广泛应用于需要极致压缩代码体积、精确控制变量生命周期或实现快速启动的低功耗嵌入式场景。本文聚焦于MSP430 GCC工具链,深入探讨如何利用

weixin_34396902的博客 586

STM32CubeIDE用户必看:GCC编译器里那些容易被忽略的‘隐藏’设置项

本文为STM32CubeIDE用户详细解析GCC编译器中那些容易被忽略的'隐藏'设置项,包括内存优化、链接时优化(LTO)、函数与数据分段等关键选项。通过合理配置这些设置,开发者可以在嵌入式环境中显著提升代码性能、减少资源占用,并优化调试效率。特别适合追求极致性能或面临资源瓶颈的STM32开发者。

weixin_30342209的博客 369

深入解析CodeWarrior命令行工具链:编译、链接与嵌入式构建优化实战

在嵌入式系统开发中,编译器和链接器是构建工具链的核心组件,它们共同完成了从高级语言源代码到可执行机器码的转换与组织。编译器负责语法分析、优化和代码生成,将C/C++等源代码转换为目标文件;链接器则负责符号解析、地址重定位和内存布局,将多个目标文件与库合并为单一可执行映像。理解这套工具链的工作原理,对于实现高性能、高可靠性的嵌入式软件至关重要,尤其是在资源受限、对执行效率和内存占用有严苛要求的场景下,如汽车电子、工业控制等领域。通过精细配置编译选项(如优化级别、语言标准)和链接器命令文件,开发者可以控制代码生

469

链接器和链接脚本

当链接器使用–gc-sections进行垃圾回收时,链接器可能将某些它认为没用的 section 过滤掉,此时就有必要强制让链接器保留一些特定的 section,KEEP()可以使得被标记section的内容不被清除(链接器的链接过程由一个链接脚本控制,该脚本使用链接器命令语言编写,主要用于规定各输入文件中的程序、数据等内容段在输出文件中的空间和地址如何分配。赋值可修改当前地址,指定其后内容的存储位置,如果没有以其它的方式指定输出节的地址,则地址值会根据定位器的当前值计算。

wo___fu的博客 477

国产麒麟系统下用Rider开发C#桌面应用:从环境配置到Avalonia UI实战

本文详细介绍了在国产麒麟系统上使用JetBrains Rider开发C#桌面应用的完整流程,重点讲解了Avalonia UI框架的实战应用。从环境配置、Rider安装到Avalonia项目创建和UI开发技巧,全面覆盖了在非Windows环境下进行C#开发的关键步骤和优化建议,助力开发者高效构建跨平台桌面应用。

weixin_27791839的博客 387

arm-gcc链接器和链接脚本

arm-gcc链接器和链接脚本

u014722462的博客 4198

Proteus一体化安装STC15库添加

Proteus一体化安装与STC15库添加指南 本文详细介绍了Proteus 8.9 SP2专业版的一体化安装流程和STC15系列单片机库文件的添加方法。安装过程简单快捷,无需破解,稳定性好。通过将两个库文件(Lib和LIB)复制到Proteus安装目录的DATA/LIBRARY文件夹中,即可实现STC15W4K32S4芯片的仿真功能。文中还提供了新建工程和器件放置的步骤说明,特别指出STC15W4K32S4芯片可兼容仿真其他STC15系列芯片,并附带下载链接获取资源。该教程适用于电子设计初学者和开发者。

#法外狂徒张三的博客 4万+

DOTween回调函数的隐藏技巧:优化你的Unity动画流程

本文深入探讨了DOTween回调函数在Unity动画开发中的高级应用技巧,帮助开发者优化动画流程。通过分析回调机制、链式应用模式和大规模动画系统管理,提升性能与可维护性,特别适合需要高效处理复杂动画场景的Unity开发者。

weixin_27945229的博客 319

链接脚本.lds(详细)总结附实例快速掌握

链接器:把一个或多个输入文件合并成一个输出文件,输入文件是目标文件或者链接脚本文件,输出文件是目标文件(库文件)或者可执行文件,链接器从链接脚本读完一个 section 后,将定位器符号的值增加该 section 的大小。链接脚本:链接脚本的一个主要目的是描述输入文件中的各个段(数据段,代码段,堆,栈,bss)如何被映射到输出文件中,并控制输出文件的各部分在程序地址空间内的布局,地址空间包括 ROM 和 RAM。

Luckiers的博客 1万+

Chromatix_AEC—深入解析曝光表配置与传感器参数计算

本文深入解析高通Chromatix AEC模块中的曝光表配置与传感器参数计算,详细介绍了自动曝光控制(AEC)的核心概念、首行曝光时间计算、行时间与曝光模式对比、帧率计算逻辑以及曝光表高级配置技巧。通过实战案例展示如何优化传感器参数联调,帮助开发者掌握Chromatix工具在摄像头系统中的关键应用。

266

[001] [RISC-V] Linker Script 链接脚本说明

每个输出section都有一个类型,如果没有指定TYPE类型,那么连接器根据输出section引用的输入section的类型设置该输出section的类型。一个可执行文件中的所有符号都有自己的地址,并保存在「全局符号表」中,但此时「全局符号表」中的地址还都是原来在各个目标文件中的地址,即相对于零地址的偏移。表示当前地址,它是一个变量,总是代表输出文件中的一个地址(根据输入文件section的大小不断增加,不能倒退,且只用于。来描述,包括段名、段的类型、段的起始地址、段的偏移和段的大小等。

柯西的彷徨的博客 6046

【Java微服务-医疗管理项目】(附源码+资料+教程)

尚医疗是专门为各大医院、门诊提供的一款医疗管理平台。 系统包含:系统管理、药品进销存管理、看病就诊、收费管理、检查管理、数据统计等核心模块。 通过尚医疗系统可以快速、方便的管理病人从挂号到门诊结束所涉及到的全套流程。也可以清晰明了的体现出药品进货、出售的所有记录。.........

m0_72882572的博客 2203

电流模架构Bandgap设计与仿真

带隙基准作为集成电路中一个重要模块,被广泛应用在低压差线性稳压(LDO)、充电电池保护芯片和通信电路、射频收发器、flash存储器等多种模拟及数模混合集成电路中,并且是片上集成系统(SOC)芯片中不可或缺的部分,为整个芯片提供精确的电压参考点............

qq_50968231的博客 5万+

ld 用法----gcc 过程最后一步----链接

  今天把vivi所用到的ld的用法都看懂了,常见的选项含义也清楚了。翻看了一下kernel的链接脚本,发现相当复杂,并且需要对全局有很好的把握,对整个的地址空间分配也必须清楚。这点暂时还做不到,属于后续工作。先把ld的基本用法总结一下,因为《Linkers and Loaders》还没有读完,所以暂时还不能作出总结。不过,对链接和加载已经有了更深入的认识。在读using ld时,很多地方自然就理

yyyzlf的专栏 1万+

Windows环境下ABAQUS、Fortran 编译器及Visual Studio的安装和关联

点击Continue,在随后的弹窗中勾选accept,并点击Customize(注意,在接下来的安装图片中,显示的版本号是2024.2,图片来自于一次失败的安装,懒得再截图了,步骤毫无区别,请见谅)。在下一步中,保持默认选项,之后软件会自动关联到刚才安装到visual studio,随后下一步进行安装(如果电脑中已经安装有其他版本的visual studio,则只保留2022)。在随后的弹窗中,根据指示找到。以防万一,尽量暂时退出所有杀毒软件,关闭防火墙,一般不会有影响,为确保万无一失,可以执行此步。

samurai12的博客 9952

嵌入式开发必备:DSP56800E链接器命令文件(LCF)详解与实战

在嵌入式系统开发中,链接器是连接编译后目标文件与最终可执行程序的关键工具,它负责将代码段、数据段等程序组件分配到芯片的特定内存地址。链接器命令文件(LCF)作为其控制脚本,通过定义MEMORY内存区域和SECTIONS段布局,实现对程序内存空间的精确管理。这项技术对于资源受限的嵌入式平台尤为重要,它能优化代码尺寸、确保关键函数(如中断服务程序)的正确放置,并实现高效的运行时数据初始化。掌握LCF编写,是进行性能调优、解决内存溢出和实现自定义启动流程的基础。本文以DSP56800E平台为例,深入解析LCF的M

weixin_30555515的博客 412

RK3568平台开发系列讲解(UBOOT篇)u-boot启动流程

U-Boot(Universal Bootloader)是一种开源的引导加载程序,广泛用于嵌入式系统中。它的主要功能是初始化硬件设备,加载操作系统内核,并将控制权交给操作系统。U-Boot的启动流程可以分为多个阶段,以下是典型的U-Boot启动流程:

内核笔记 1234

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

轻量级可执行文件构建:面向资源受限设备的设计思路

针对资源受限设备,优化可执行文件的构建成为关键。通过精简结构与裁剪冗余,实现高效加载与运行,提升系统响应能力。可执行文件的小型化与模块化设计,为嵌入式场景提供了切实可行的解决方案。

weixin_35753431的博客 331

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++程序体积优化实战:10个技巧让可执行文件瘦身50%

在嵌入式开发和移动端应用场景中,可执行文件体积直接影响存储成本、加载速度和运行时性能。程序体积优化(Size Optimization)涉及编译器、链接器和操作系统层面的协同工作,其核心原理是通过消除冗余代码和数据段来减少二进制文件大小。这项技术的工程价值在于提升产品部署效率和用户体验,特别适用于资源受限的嵌入式设备、移动应用分发和网络传输敏感的场景。通过合理运用编译选项如-Os优化等级、函数与数据段分离链接(-ffunction-sections/-fdata-sections)等技术,开发者可以在保持代

afeyfre41671的博客 470

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Golang编译优化实战:如何通过5个参数让二进制体积减少40%?

掌握Go编译优化选项,有效减少二进制体积。本文详解5个关键编译参数,适用于Docker部署和微服务场景,可缩减40%体积,提升运行效率。实战经验分享,值得收藏。

DebugLoom的博客 1301

LLVM链接机制详解:静态、动态与运行时链接对比

编译器链接机制是软件开发中的基础技术,决定了代码如何组织为可执行程序。静态链接将所有依赖库合并到单一可执行文件,适合部署简单的场景但会增加体积;动态链接通过共享库节省内存,是现代操作系统的默认选择;运行时链接则提供了插件架构所需的灵活性。LLVM作为领先的编译器基础设施,其链接器(如lld)在性能上相比传统工具显著提升,支持ThinLTO等优化技术。在实际工程中,链接类型的选择需要权衡启动速度、内存占用和部署复杂度,金融系统和容器化应用是两种典型场景。通过版本脚本和符号可见性控制等技巧,开发者可以优化动态库

weixin_34101914的博客 296

STM32嵌入式C++实战:破除资源受限误解,构建高质量固件

嵌入式开发长期以C语言为主,但随着固件复杂度上升,模块间耦合与维护成本成为瓶颈。C++并非桌面端STL的堆内存与异常机制,其封装、模板、RAII及constexpr等特性可在编译期完成抽象,几乎不增加运行时开销。在STM32等资源受限MCU上,通过合理裁剪特性、混合编译与工具链配置,C++能够将“人为约定”转化为“编译器强制校验”,显著提升代码可读性与可维护性。从外设驱动封装到协议解析,再到状态机与运动规划,C++的工程价值在中等以上规模固件中尤为突出。本文从语言特性、资源开销、工具链支撑和迁移策略四个维度

weixin_34274029的博客 414
上一篇: 9 内嵌汇编,可以直接调用系统服务
下一篇: 15 ABI规范 栈帧结构,帧栈的形成过程
Ma浩然
博客等级 码龄9年 1万+粉丝 462原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ma浩然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值