首页 > 其他分享 >减小编译出来的 .so 文件的尺寸方法

减小编译出来的 .so 文件的尺寸方法

时间:2024-08-22 18:27:23浏览次数:5  
标签:减小 llvm -- 编译 libyourlibrary so strip 调试信息

要减小编译出来的 .so 文件的尺寸,可以通过去除符号表、调试信息等非必要的内容来实现:

一、Linux系统下方法

1. 使用 strip 命令

strip 命令可以删除 .so 文件中的符号表和调试信息,从而减小文件大小。

strip --strip-unneeded libyourlibrary.so
  • --strip-unneeded 参数只会删除不必要的符号,而保留那些可能在运行时使用的符号。

如果你不需要调试信息和符号表,可以使用更强力的选项:

strip --strip-all libyourlibrary.so
  • --strip-all 会删除所有符号和调试信息,这种方式会最大限度地减小 .so 文件的大小。

2. 编译时使用优化选项

在编译时,使用 -s 选项来自动去除符号表:

gcc -o libyourlibrary.so -shared -s source_file.c
  • -s 选项会在编译过程中去除所有符号表。

3. 使用 ld 链接器优化选项

在链接时,使用 --gc-sections 选项去除未使用的代码段:

gcc -o libyourlibrary.so -shared source_file.c -Wl,--gc-sections
  • --gc-sections 选项会移除未被使用的代码段和数据段。

4. 使用 -ffunction-sections-fdata-sections

在编译时,使用 -ffunction-sections-fdata-sections 将每个函数和数据段放在各自的段中,使得链接器可以更容易地去除未使用的部分:

gcc -o libyourlibrary.so -shared -ffunction-sections -fdata-sections source_file.c

5. 压缩 .so 文件

你还可以使用 upx 这样的工具对 .so 文件进行压缩:

upx --best libyourlibrary.so
  • upx 是一种可执行文件压缩工具,可以压缩 .so 文件,但不会影响其功能。

6. 去除调试信息

在编译时去除调试信息:

gcc -o libyourlibrary.so -shared -g0 source_file.c
  • -g0 参数会避免生成调试信息。

通过以上这些方法,你可以显著减小 .so 文件的大小而不影响其功能。根据具体需求,选择适当的步骤组合可以达到最佳的效果。



二、macOS系统下方法

在 macOS 上,strip 命令的选项和 Linux 上有所不同。以下是你可以使用的选项来减小 .so 文件的大小:

1. 使用 macOS 支持的 strip 选项

在 macOS 上,可以使用以下命令来移除符号表和调试信息:

strip -x libyourlibrary.so
  • -x 选项会删除所有局部符号,但保留全局符号,这样保留了程序在运行时可能需要的符号。

如果你想尽可能地减小文件大小,可以使用:

strip -S libyourlibrary.so
  • -S 选项会删除调试符号表和调试信息。

2. 使用 -u-r 选项

你还可以使用 -u-r 选项来删除未使用的全局符号:

strip -u -r libyourlibrary.so
  • -u 删除未使用的符号表。
  • -r 删除未使用的调试信息。

3. 组合使用

你可以结合这些选项,根据具体需要来减小 .so 文件(在 macOS 上通常是 .dylib 文件)的大小:

strip -x -S libyourlibrary.so


三、处理 ARM 架构ELF 文件

在 macOS 上处理 ARM 架构的 ELF 文件时,strip 工具可能无法正常工作,因为它主要用于处理 macOS 的 Mach-O 格式文件。当你的 libyourlibrary.so 文件是一个 64-bit ARM 架构的 ELF 文件,通常用于 Linux 或 Android 平台。要解决这个问题,你可以使用以下方法:

1. 在 Linux 环境进行处理

你可以在 Linux 环境中使用 strip 工具来处理这个文件,因为 strip 在 Linux 上对 ELF 文件的支持更好。

strip --strip-debug libyourlibrary.so

这将删除调试信息,并减小文件大小。

2. macOS使用 arm-linux-gnueabi-strip 工具

如果你无法在 Linux 环境中操作,可以考虑安装交叉编译工具链,它包含了 arm-linux-gnueabi-strip 工具,专门用于处理 ARM 架构的 ELF 文件。

在 macOS 上,可以通过 brew 来安装适合的工具链:

brew install gcc-arm-embedded

然后你可以使用 arm-none-eabi-strip 工具来处理文件:

arm-none-eabi-strip --strip-debug libyourlibrary.so

3. macOS使用 llvm-strip(推荐使用!!!)

在 macOS 上处理 ARM 架构的 ELF 文件,建议使用 llvm-strip 工具,它是 LLVM 项目的一部分,支持多种架构和文件格式。可以避免 macOS 原生工具不支持 ELF 文件的问题,同时实现文件大小的减小。

(1)安装 llvm
brew install llvm

确保 LLVM 工具链在你的路径中
虽然你安装了 LLVM,但它可能不在你的系统路径中。你可以使用以下命令检查:

brew info llvm

这个命令会显示 LLVM 的安装路径和如何将其工具添加到你的 PATH 中。例如:

export PATH="/usr/local/opt/llvm/bin:$PATH"

或者,如果你使用的是 Apple Silicon Mac(M1 或 M2 芯片),则可能是:

export PATH="/opt/homebrew/opt/llvm/bin:$PATH"

使用 which llvm-objcopy 来验证 llvm-objcopy 是否在你的 PATH 中:

which llvm-objcopy

如果显示了路径,说明命令可以使用。如果没有显示,可能是因为 LLVM 的工具链路径没有正确添加到 PATH 中。

(2)处理:

使用 llvm-strip 处理

llvm-strip --strip-debug libyourlibrary.so

使用 llvm-objcopy处理
llvm-strip 的功能可以通过 llvm-objcopy 来实现。可以使用以下命令来移除所有符号表和调试信息:

llvm-objcopy --strip-all libyourlibrary.so

4. 验证文件处理情况

处理完之后,可以使用 file 命令再次检查文件状态,确保它已经被剥离调试信息。同时对比前后文件大小!!!

file libyourlibrary.so


四、补充说明macOS工具链LLVM llvm-stripllvm-objcopy 区别

llvm-stripllvm-objcopy 是 LLVM 工具链中的两个不同工具,区别如下:

1. llvm-strip:

  • 功能: llvm-strip 是一个专门用来移除对象文件和可执行文件中的符号表和调试信息的工具。
  • 使用场景: 如果你只想从文件中删除符号表或调试信息,而不修改其他内容,llvm-strip 是一个简单的选择。
  • 常用选项:
    • --strip-debug: 仅删除调试信息(不影响其他符号)。
    • --strip-all: 删除所有符号和调试信息。

2. llvm-objcopy:

  • 功能: llvm-objcopy 是一个更通用和功能更强大的工具。它不仅可以删除符号表和调试信息,还可以进行更多的对象文件操作,如拷贝部分内容、修改文件格式等。
  • 使用场景: 如果你需要进行更复杂的文件处理操作,如修改文件的某些部分、转换文件格式或删除特定的符号,llvm-objcopy 更加合适。
  • 常用选项:
    • --strip-debug: 和 llvm-strip 类似,删除调试信息。
    • --strip-all: 删除所有符号和调试信息。
    • 其他选项,如 --add-section--remove-section 等,提供了更加丰富的功能。

3. 对比总结:

  • 简单操作: 如果你只需要删除符号表或调试信息,llvm-strip 是一个更简单的工具。
  • 复杂操作: 如果你需要进行复杂的文件操作或修改,llvm-objcopy 提供了更强大的功能。

标签:减小,llvm,--,编译,libyourlibrary,so,strip,调试信息
From: https://blog.csdn.net/tyfwin/article/details/141434119

相关文章

  • 蓝队新手应该学习的 4 个 SOC 工具(如何掌握这些基本的 SOC 工具及其相关技能。)
    安全运营中心(SOC)分析师依靠各种工具来帮助他们监视他们的域。然而,仅仅依靠工具来完成工作,而未能理解其背后的基本流程和方法,对于分析师来说可能是一个代价高昂的错误。我们发现,近三分之一(29.5%)的专业人士认为事件处理流程和方法是SOC分析师需要掌握的最重要的知识领域:我从......
  • 164. 可达性统计 topsort
    //164.可达性统计.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*https://www.acwing.com/problem/content/166/给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量。输入格式第一行两个整数N,M,接下来M行每行两个整数x,......
  • JESD79-5C_v1.30-2024 JEDEC DDR5 SOLID STATE TECHNOLOGY ASSOCIATION 最新内存技术
    JESD79-5C_v1.30-2024JEDECDDR5SOLIDSTATETECHNOLOGYASSOCIATION最新DDR5内存技术规范​JEDEC技术协会公布新DDR5内存规范、更稳定、安全,支持PRAC新技术下载: https://download.csdn.net/download/tgs2033/89661013样本下载:链接:https://pan.baidu.com/s/13-Ioep......
  • Jenkins从2.401.1升级到2.440.1后项目配置报错,提示:JSONObject["scm"] is not a JSONOb
    因为安全原因升级了Jenkins。然后发现Project-->Configure那里配置竟然嵌套了,而且保存修改的时候,提示:JSONObject["scm"]isnotaJSONObject. 异常信息表明在JSON中尝试获取一个名为“scm”的属性时,期望得到的是一个JSONObject,但实际上并不是。可能是因为JSON中的......
  • lazarus 3.4+fpc trunk编译tachart控件出错
    lazarus3.4+fpctrunk编译tachart控件出错原因:最新的fpc禁止访问private引起的修改方法:1、打开lazarus\components\tachart\tadatatools.pas将functionTDataPointDistanceTool.FindRef(APoint:TPoint;AMode:TDataPointMode;ADest:TDataPointTool.TPointRef;AOtherEndS......
  • Jetson设备通过网线连接主机,通过主机共享网络连接
    jetson设备可以通过网线连接电脑,通过设置ip在一个网段下即可实现通信。通信后如果相互ping通,可以通过Nomachine在主机上登录Jetson的远程图像界面。通过主机连接Wifi并设置共享模式,则Jetson也可以通过主机联网。Jetson成功联网后,如果主机使用某常用软件科学上网,可以设置Al......
  • mybatis-plus配置自定义sqlInjector(使用InsertBatchSomeColumn),出现Invalid bound stat
    项目一开始未引入mybatis-plus,使用的是mybatis,配置文件为xml,有一个配置类中配置了SqlSessionFactory的相关内容。引入mybatis-plus后,想使用InsertBatchSomeColumn遇到Invalidboundstatement(notfound),多处配置发现没有效果并依旧报错,最终在刚才的配置类中的SqlSessionFact......
  • SOA架构开发小助手PAVELINK.SOA-Converter V1.4.2新版本发布
    PAVELINK.SOA-Converter转换工具,用于衔接基于SOA的控制器设计、开发及测试过程中所常见的各类软件工具。PAVELINK.SOA-Converter能提供IDL及服务矩阵等文件的语法及规则检查,自动化完成多种不同格式IDL文件之间的转换,以及其它常用的各类型格式文件转换。 PAVELINK.SOA-Converter......
  • 使用 JsonSchema 校验 JSON数据
    有时候JSON数据格式需要校验是否合法,我们可以使用JsonSchema来校验数据是否合法。引入pom.xmlhttps://json-schema.org/<dependency><groupId>com.networknt</groupId><artifactId>json-schema-validator</artifactId><versio......
  • 多模态学习之论文阅读:《Systematic comparison of deep-learning based fusion strate
    《Systematiccomparisonofdeep-learningbasedfusionstrategiesfor multi-modal ultrasoundindiagnosisof liver cancer》 -2024.10 NEUROCOMPUTING 影响因子7.9(一)多模态数据构成研究设计了“病变配对”方法来构建数据集,包括B模式超声、剪切波弹性成像(SWE)和......