使用-section等参数实现对库的裁剪,从而减小程序体积

ARM Cortex-M开发中One ELF Section per Function选项对代码体积优化的深度解析 在嵌入式系统开发中,代码体积优化是提升资源利用效率的关键技术。其核心原理基于编译链接过程中的无用代码消除机制,链接器通过分析符号引用关系,移除未被调用的函数和数据以减小最终二进制文件大小。这项技术的工程价值在于能够显著降低Flash存储占用,尤其适用于ARM Cortex-M等资源受限的MCU平台。在Keil MDK等开发环境中,通过调整编译选项可以控制链接器的优化粒度。其中,“One ELF Section per Function”选项通过为每个函数生成独立的ELF段,使得链接器能够以函数为单位进行精确 阅读详情

在实际的项目里面,产品中除去系统加载使用的空间外,留给具体的功能应用程序的空间较小,因此需要对应用程序用到的库进行裁剪。比如在实际的项目中,应用程序和库一共14M,最后进行裁剪,减少了6-7M

 对于空间有限,使用的库较多(依赖的第三方开源库openssl等)占用体积较大,我们如果使用动态库(.so)显然不适合,因此我们可以使用静态库(.a),但是这样还不够,依赖的库中有很多实现的函数,但是应用程序并没有使用,没用的函数就应该不链接进来,占用宝贵的空间。

对此就需要修改编译选项:

(1)编译时加入:-ffunction-sections, -fdata-sections 选项,这样编译的时候,把每个函数作为一个section,每个数据(应该是指全局变量之类的吧)也作为一个section。如果不加-ffunction-sections选项,则默认似乎是每个源文件为一个section进行链接,这样子只要这个文件中用到了一个函数,那么所有的函数都会被链接进来。

(2)链接时加入:--gc-sections选项 ,这样链接的时候,--gc-sections会把没用到的section丢弃掉,最终的可执行文件就只包含用到了的函数和数据。链接的单位,是函数级别,这样就能丢弃没使用的函数。

当我们依赖静态库,编译和链接选项加如上所示后,应用程序变小,但是查看符号表等,发现一些库中的函数依然存在,于是经过一些时间的排查,当添加上-fvisibility=hidden

在linux下,源文件中的所有函数都有一个默认的visibility属性为public,在编译命令中加入-fvisibility=hidden参数,会将所有默认的public的属性变为hidden。此时,如果对函数设置__attribute__ ((visibility("default")))参数,使特定的函数仍然按默认的public属性处理,则-fvisibility=hidden参数不会对该函数起作用。所以,设置了-fvisibility=hidden参数之后,只有设置了__attribute__ ((visibility("default")))的函数才是对外可见的,如此则效果等同于Visual Studio下的__declspec(dllexport)定义。

综上:

修改了CMakeLists.txt:
ADD_DEFINITIONS("-Wall")
ADD_DEFINITIONS("-fPIC")
ADD_DEFINITIONS("-Wl,-Bsymbolic -lm")
ADD_DEFINITIONS("-std=c++11")
SET(CMAKE_CXX_FLAGS "-Wall -fPIC -s -fvisibility=hidden -ffunction-sections -fdata-sections -Wl,-rpath-link=$(../../../Library/ISVP_T20Z/lib) -Wl,-Bsymbolic -lm -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DISVP")

       

Unity iOS Framework体积优化:从诊断到压缩的完整方案 在移动应用开发中,包体积优化是提升用户体验和转化率的关键环节。其核心原理在于减少冗余代码和资源,通过编译器优化、资源压缩等技术手段实现。从技术价值看,优化不仅能降低App Store下载大小,还能提升应用启动速度和运行效率。在Unity跨平台开发场景下,iOS Framework的体积膨胀问题尤为突出,这通常由未压缩的纹理资源、音频文件以及未剥离的托管代码导致。针对此问题,开发者可以运用纹理ASTC压缩、音频格式转换、IL2CPP代码剥离等方法,结合Xcode的编译器优化等级设置和Bitcode支持,系统性 阅读详情

相关推荐

Map文件解析:从内存布局到程序优化的实战指南

在嵌入式开发和系统级编程中,理解程序的内存布局是进行高效调试和性能优化的基础。链接映射文件(Map文件)作为链接器生成的核心文档,完整记录了代码段、数据段、符号地址等关键信息,是分析程序内存使用、定位链接错误和优化体积的必备工具。通过解析Map文件,开发者可以深入掌握程序底层运行机制,实现从黑盒到白盒的转变。在工程实践中,Map文件常用于排查栈溢出、内存泄漏、可执行文件膨胀等典型问题,例如结合热词“栈溢出”分析内存越界,或利用热词“符号表”定位未定义引用。掌握Map文件的查看技巧与分析方法,能显著提升系统稳

weixin_34159110的博客 374

gcc之 -ffunction-sections

背景 有时我们的程序会定义一些暂时使用不上的功能和函数,虽然我们不使用这些功能和函数,但它们往往会浪费我们的ROM和RAM的空间。这在使用静态库时,体现的更为严重。有时,我们只使用了静态库仅有的几个功能,但是系统默认会自动把整个静态库全部链接到可执行程序中,造成可执行程序的大小大大增加。 参数详解 为了解决前面分析的问题,我们引入了标题中的几个参数。GCC链接操作是以section作为最小的处理单元,只要一个section中的某个符号被引用,该section就会被加入到可执行程序中去。因此,GCC在编

liyucheng987的博客 5248

LibU跨平台C库解析:版本差异与嵌入式优化

C语言作为系统级编程的基石,其跨平台开发一直面临诸多挑战。通过封装操作系统差异的通用库是实现可移植性的关键技术,其中内存管理和网络通信是核心难点。LibU作为轻量级工具库,采用模块化设计提供字符串处理、调试日志等基础设施,特别适合嵌入式系统和网络服务开发。该库通过不同分支版本实现平台优化:libux针对BSD系统改进I/O性能,libuK为嵌入式Linux精简内存占用,libu-win32适配Windows特有API。开发者可根据项目需求选择版本,利用统一API降低迁移成本,在IoT设备和服务器应用中实现高

weixin_31099291的博客 274

gcc -ffunction-sections -fdata-sections -Wl,–gc-sections 参数详解

有时我们的程序会定义一些暂时使用不上的功能和函数,虽然我们不使用这些功能和函数,但它们往往会浪费我们的ROM和RAM的空间。这在使用静态库时,体现的更为严重。有时,我们只使用了静态库仅有的几个功能,但是系统默认会自动把整个静态库全部链接到可执行程序中,造成可执行程序的大小大大增加。指示链接器去掉不用的section(其中-wl, 表示后面的参数 -gc-sections 传递给链接器),这样就能减少最终的可执行程序的大小了。可以看见,在最终的目标文件中,未使用的函数并未被链接进最终的目标文件。

木牛的博客 2286

告别乱码!u8g2库自定义中文字库制作全攻略(基于GUItool与BDF转换)

本文详细介绍了如何使用u8g2库在嵌入式开发中实现LCD屏幕的中文显示。通过GUItool生成BDF文件,并结合bdfconv工具转换为C源文件,开发者可以轻松制作自定义中文字库。文章还提供了字体选择、字符映射表制作、内存优化等实用技巧,帮助解决中文乱码问题,提升显示效果。

weixin_33714884的博客 360

STM32 HAL库工程手动搭建指南:从零构建Keil5纯净项目模板

在嵌入式开发领域,硬件抽象层(HAL)是连接应用软件与底层硬件的重要桥梁,它通过标准化的接口封装了芯片外设的复杂操作,极大地提升了代码的可移植性和开发效率。其核心原理在于提供了一套统一的API,使得开发者无需深入寄存器细节即可操控硬件。对于STM32开发者而言,掌握HAL库项目的构建原理具有重要价值,这不仅有助于理解编译链配置、文件依赖关系,更是进行深度定制和问题排查的基础。在实际应用场景中,无论是使用STM32CubeMX进行图形化配置,还是进行裸机或RTOS开发,一个结构清晰、手动搭建的纯净工程模板都是

benben 467

gcc的-ffunction-sections和-fdata-sections选项与ld的--gc-sections选项

-ffunction-sections, -fdata-sections会使compiler为每个function和data item分配独立的section。 --gc-sections会使ld删除没有被使用的section。 链接操作以section作为最小的处理单元,只要一个section中有某个符号被引用,该section就会被放入output中。 这些选项一起使用

findaway123的专栏 2万+

从零开始用STM32驱动RGB屏:配置PCLK、DE同步信号的避坑指南

本文详细介绍了如何使用STM32驱动RGB接口LCD屏幕,重点解析了PCLK配置、同步信号极性和DE使能等关键参数的设置方法。通过实战代码示例和常见问题排查指南,帮助开发者避免常见配置错误,实现稳定的显示效果。特别针对800x480 IPS屏提供了优化建议和调试技巧。

sky77的博客 540

gcc / -ffunction-sections、-fdata-sections、-Wl,--gc-sections

一、背景 有时我们的程序会定义一些暂时使用不上的功能和函数,虽然我们不使用这些功能和函数,但它们往往会浪费我们的 ROM 和 RAM 的空间。这在使用静态库时,体现的更为严重。有时,我们只使用了静态库仅有的几个功能,但是系统默认会自动把整个静态库全部链接到可执行程序中,造成可执行程序的大小大大增加。 二、参数详解 为了解决前面分析的问题,我们引入了标题中的几个参数。GCC链接操作是以 section 作为最小的处理单元,只要一个 section 中的某个符号被引用,该 section 就会被加入到可.

布袋和尚 2882

从USB相机标定到Aruco码精准定位:基于aruco-ros的机器人视觉实践

本文详细介绍了基于aruco-ros的机器人视觉实践,从USB相机标定到Aruco码精准定位的全流程。通过实战案例和优化技巧,展示了Aruco码在机器人导航中的高精度位姿识别能力,帮助开发者快速实现毫米级视觉定位系统。

weixin_27310417的博客 487

LeetCode 面试经典 150 题回顾

最经典 150 题,掌握面试所有知识点 面试经典 150 题 : 题目分析、解题思路、复杂度分析、代码展示

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 8万+

去除可执行文件中没用到的符号

1. 编译阶段使用: -ffunction-sections -fdata-sections 2. 链接阶段使用: -Wl,--gc-sections 在GCC,LD官方文档中如下讲解: 在GCC,LD官方文档中如下讲解: -ffunction-sections -fdata-sections Place each function or data item into its

Alan0521的专栏 3639

(建议收藏)2024最新 URL Scheme大全APP跳转界面地址更新中 ios快捷指令快捷方式链接跳转微信小程序必备autojs可用免root (可定制开发和提取URL Scheme 参数提取)

(建议收藏)2024最新 URL Scheme大全APP跳转界面地址更新中 ios快捷指令快捷方式链接跳转微信小程序必备autojs可用免root (可定制开发和提取URL Scheme 参数提取)

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1万+

安卓动态链接库文件体积优化探索实践

编译选项 | 体积 || strip + opt-level = ‘z’ + lto + panic = ‘abort’ + 代码裁减 + panic_immediate_abort | 135k || strip + opt-level = ‘z’ + lto + panic = ‘abort’ + 代码裁减 + panic_immediate_abort + 移除section | 95k |

JDDTechTalk的博客 1958

构建AI Agent驱动的智能健康管理系统

数据碎片化:健康数据分散在不同的设备和平台中,难以统一管理和分析。个性化不足:健康管理方案通常是通用的,难以根据个人的健康状况实时调整。用户参与度低:用户难以获得及时、个性化的健康建议,导致健康管理效果不佳。AI Agent是一个能够感知环境、采取行动以实现目标的智能实体。根据智能体的智能水平,可以分为简单反应式智能体和复杂适应式智能体。实时监测健康数据。获取个性化的健康建议。收到健康风险预警。

AI天才研究院 749

短信验证码逻辑漏洞学习——各种绕过姿势技巧

短信验证码逻辑漏洞学习——各种绕过姿势技巧

记录并分享学习安全的知识点.. 2557

Keil MDK-ARM中One ELF Section per Function选项对代码容量的影响与优化实践

在嵌入式系统开发中,代码体积优化是提升资源利用效率的关键环节。其核心原理在于编译器与链接器的协同工作,通过对目标文件中的函数进行精细化管理,实现未使用代码的消除。这项技术的核心价值在于能够在不修改源代码逻辑的前提下,显著减少最终二进制文件的大小,尤其适用于Flash资源紧张的微控制器(MCU)应用场景。具体到Keil MDK-ARM开发环境,一个名为“One ELF Section per Function”的编译选项正是实现此优化的关键。它通过改变函数在ELF文件中的组织方式,使链接器能够以单个函数为粒度

weixin_33698043的博客 391

使用C#和ASP.NET创建登录页面

在Visual Studio中,右键单击项目,选择"添加",然后选择"新建项"。在对话框中选择"Web",然后选择"Web 窗体"。在Visual Studio中,右键单击项目,选择"添加",然后选择"新建项"。在Visual Studio中,选择"新建项目",然后选择"ASP.NET Web应用程序"。在上面的代码中,我们创建了一个简单的用户界面,包含一个用户名输入框、一个密码输入框和一个登录按钮。在上面的代码中,我们创建了一个简单的用户界面,包含一个用户名输入框、一个密码输入框和一个登录按钮。

TzData的博客 763

裸机C代码编译体积暴增300%?揭秘隐藏在#pragma pack和__attribute__((section))背后的4类编译器“隐形膨胀源”

解决边缘计算节点C代码编译体积异常膨胀问题,提出C语言边缘计算节点轻量化编译方法。聚焦裸机环境,剖析#pragma pack、__attribute__((section))等引发的4类隐形膨胀源,通过内存对齐优化与段布局控制实现体积缩减。适用于资源受限的嵌入式边缘设备,显著提升部署效率,值得收藏。

Instrulink的博客 281

Mastercam软件二次开发:使用C#进行Mastercam二次开发

C#(发音为“C Sharp”)是一种现代、面向对象的编程语言,由微软开发,首次发布于2000年。它结合了C和C++的强大功能,同时引入了Java的垃圾回收机制,使得C#在开发效率和运行性能之间找到了一个良好的平衡点。C#的设计目标是提高开发者的生产力,它支持多种编程范式,包括面向对象、泛型、委托和事件等,这使得它成为开发Windows应用程序、Web应用程序、游戏(尤其是使用Unity引擎)和企业级应用的理想选择。

kkchenjj的博客 2215

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【无标题】keil编译gd32里工程,不编译adc等未使用外设,降低生成的程序包大小

配置位置设置项作用Target使用现代的AC6编译器,功能更强。指令编译器生成体积最小的代码。勾选将每个函数单独打包,便于后续精准删除。Linker: 添加链接时进行全局优化,并删除所有未被调用的函数包。

Wxinxiaozhang的博客 266

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Keil5+ARM Compiler 6优化黄山派代码体积技巧

本文深入探讨基于Keil MDK与ARM Compiler 6的嵌入式代码体积优化技术,涵盖编译优化等级选择、函数内联、弱符号、结构体紧凑布局、C++运行时裁剪、链接器去死代码、scatter文件内存控制及map文件分析等关键手段,实现20%~40%的代码压缩,提升嵌入式工程的资源利用率与专业性。

kotlin6android的博客 947

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

linux readelf 指令

readelf是Linux系统中用于分析ELF格式二进制文件的命令行工具,可查看可执行文件、共享库等的内部结构,但不会修改文件内容。它支持多种选项,如-h显示文件头、-d显示动态段信息等。典型应用包括检查依赖库(NEEDED条目)、分析程序结构等,尤其适用于交叉编译环境下的依赖排查和系统裁剪。如使用aarch64-linux-gnu-readelf -d libcurl.so | grep NEEDED可快速获取ARM64架构下curl库的运行时依赖,帮助解决缺失库或版本冲突问题。

qq_42831621的博客 307

嵌入式开发中mbedtls的RAM/ROM优化实战指南

在嵌入式系统开发中,资源优化是核心挑战之一,尤其当涉及安全通信协议栈时。TLS/SSL协议作为保障网络通信安全的基础,其实现库如mbedtls(前身PolarSSL)因模块化设计而备受青睐。然而,在Flash和RAM资源受限的MCU平台上,默认配置往往包含冗余功能,导致固件体积膨胀和内存溢出风险。理解mbedtls的架构原理后,开发者可通过精准功能裁剪、编译链接优化及运行时内存管理,显著降低资源占用。例如,通过配置文件禁用未使用的加密算法(如DES、MD5)、调整SSL缓冲区大小、并利用编译器的段回收技术,

weixin_30448603的博客 401

UEFI启动优化案例:将EDK II启动时间从30秒降至10秒

在工业控制、物联网网关等嵌入式场景中,EDK II(UEFI开发工具包)的默认配置往往因冗余调试组件和未优化的启动流程,导致启动时间长达30秒以上。某智能网关项目中,客户明确要求将设备启动时间压缩至15秒以内,否则将影响产线部署效率。本文基于实际优化案例,从构建配置、模块裁剪、压缩算法三个维度,详解如何将EDK II启动时间从30秒优化至10秒。 ## 读完本文你将掌握: - EDK II启动流...

gitblog_00287的博客 472
上一篇: 压抑的西安互联网环境,你有纠结辞职吗?
下一篇: 使用nmcli network-manager管理wifi网络
沉迷WebRTC
博客等级 码龄11年 205粉丝 135原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值