减少可执行文件大小的过程

2023-12-23

我正在生成一个在 ARM 处理器上运行的十六进制文件,我希望将其保持在 32K 以下。它目前比这个大得多,我想知道是否有人可以提供一些关于缩小它的最佳方法的建议?

这是我到目前为止所做的

  1. 因此,我对其运行“size”以确定十六进制文件有多大。
  2. 然后再次“大小”以查看链接以创建十六进制文件的每个目标文件有多大。看来大部分大小来自外部库。
  3. 然后我使用“readelf”来查看哪些函数占用了最多的内存。
  4. 我搜索了代码,看看是否可以消除对这些函数的调用。

这就是我陷入困境的地方,有一些函数我不直接调用(例如 _vfprintf),并且我找不到调用它的函数,因此我可以删除调用(因为我认为我不需要它)。

那么接下来的步骤是什么?

对答案的回应:

  • 正如我所看到的,正在调用的函数占用了大量内存。然而我找不到它的名字。
  • 我想省略这些函数(如果可能的话),但我找不到调用它们的函数!我猜可以从任意数量的库函数中调用。
  • 我认为链接器正在按预期工作,它只包含相关的库文件。您如何知道是否仅包含相关功能?你可以为此设置一个标志或其他东西吗?
  • 我正在使用海湾合作委员会

一般清单:

  • 确保禁用编译器和链接器调试选项
  • 在打开所有大小选项的情况下编译和链接(gcc 中的 -O)
  • Run strip在可执行文件上
  • 生成映射文件并检查函数大小。您可以让链接器生成映射文件(-M使用 ld 时),或者您可以在最终的可执行文件上使用 objdump(请注意,这仅适用于未剥离的可执行文件!)这实际上不会解决问题,但它会让您知道最严重的问题。
  • Use nm研究从每个目标文件调用的符号。这应该有助于查找谁在调用您不想调用的函数。

最初的问题是一个关于仅包含相关功能的子问题。gcc将包括使用的每个目标文件中的所有函数。换句话说,如果您有一个包含 10 个函数的目标文件,则所有 10 个函数都将包含在您的可执行文件中,即使实际调用了其中一个 1。

标准库(例如 libc)会将函数分割成许多单独的目标文件,然后将其存档。然后将可执行文件链接到存档。 通过分成许多目标文件,链接器能够仅包含实际调用的函数。 (这假设您是静态链接)

您没有理由不能使用同样的技巧。当然,您可能会争辩说,如果不调用这些函数,您可能可以自己删除它们。

如果您静态链接其他库,您也可以在它们上运行上面列出的工具,以确保它们遵循类似的规则。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

减少可执行文件大小的过程 的相关文章

  • 尝试使用 qemu-arm 运行arm二进制文件时如何解决“加载共享库时出错”?

    我正在运行 Linux Mint 14 并安装了 qemu qemu user 和 gnueabi 工具链 我编译了 test carm linux gnueabi gcc test c o test 当我尝试跑步时qemu arm usr
  • Node.js |如何通过串口向设备发送和接收一个字节?

    我正在尝试编写使用以下方法的 Node js 脚本serialport https serialport io 用于读取和写入数据的 npm 包COM5串行端口 使用 RS 232 电缆连接到设备 该设备会自动传输其拥有的数据 要检索设备内
  • 创建 32 位计数器时出现全局变量问题

    我正在尝试做正交解码 using 爱特梅尔 Xmega AVR微控制器 Xmega只有16 bit柜台 另外 我已经用完了所有可用的计时器 现在要做32 bit柜台我用过一个16 bit柜台并在其over under flow interr
  • C 中的可移植函数(无汇编)返回其堆栈帧的大小

    用 C 编写一个可移植函数 无需汇编 返回其堆栈帧的大小 int stackframe size 尝试如下解决 该函数在使用 VS 2010 编译时返回 228 字节 有没有办法验证其正确性 int stackframe size int
  • ARM 调用约定是否允许函数不将 LR 存储到堆栈中?

    正如标题所示 我在理解 ARM 架构的调用约定时遇到问题 特别是 我仍然很难知道当你调用子程序时 LR 寄存器会发生什么 我认为 当您进入子程序时 处理 LR 寄存器的最明显 最安全的方法是将其存储到堆栈中 但该行为没有出现在文档中 因此我
  • ELF 文件头

    关于 elf 文件头的一个简单问题 我似乎找不到任何关于如何在 elf 头中添加 更改字段的有用信息 我希望能够更改幻数并向标题添加构建日期 以及可能的其他一些内容 据我了解 链接器创建标头信息 但我在 LD 脚本中没有看到任何引用它的内容
  • 使用 Android NDK 使用 -fsigned-char 进行构建安全吗?

    为了与其他平台保持一致 我需要使用signed char在我正在处理的一些本机代码中 但默认情况下在Android NDK上char类型是unsigned 我尝试明确使用signed char类型 但它生成太多警告differ in sig
  • u-boot:搬迁

    这是一个与u boot相关的基本问题 为什么 u boot 代码会自行重新定位 好吧 如果 u boot 是从 NOR flash 或启动 ROM 空间执行 那么这是有道理的 但如果它已经从 SDRAM 运行 为什么它必须再次重新定位自己呢
  • Compact Framework 3.5 上的 System.Data.SQLite 问题

    我在我的紧凑框架应用程序中使用 sqlite 来记录系统中的事件 我也在使用系统 数据 SQLite http sqlite phxsoftware com 该事件具有描述其发生时间的时间戳 我将此时间戳记作为刻度存储在我的表中 除此列外
  • 在链接时合并全局数组/从多个编译单元填充全局数组

    我想定义一系列的东西 比如事件处理程序 的内容 该数组在编译时是完全已知的 但定义在 多个编译单元 分布在多个库中 至少在最终 静态 链接之前是相当解耦的 我想要 也保持这种方式 因此添加或删除编译单元将 还可以自动管理事件处理程序 而无需
  • 工作站和嵌入式程序员之间的心态差异[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Intel 机器上构建 Apple Silicon 二进制文件

    如何在 macOS 11 Intel 上编译 C 项目以在 Silicon 上运行 我当前的构建脚本很简单 configure make sudo make install 我尝试过使用 host and target标志与aarch64
  • 如何设置 CMake 与 clang 交叉编译 Windows 上的 ARM 嵌入式系统?

    我正在尝试生成 Ninja makefile 以使用 Clang 为 ARM Cortex A5 CPU 交叉编译 C 项目 我为 CMake 创建了一个工具链文件 但似乎存在错误或缺少一些我无法找到的东西 当使用下面的工具链文件调用 CM
  • DS-5:什么是 FVP、RTSM、基础模型、AEM 模型、快速模型、CADI?

    DS 5 模拟器使用了很多术语 如 FVP RTSM 快速模型 基础模型 AEM 模型 CADI Arm的文档中提供的解释不是很清楚 这些术语的含义是什么 作为 DS 5 的最终用户我应该关心哪些术语 Model 软件模拟的行业术语 就 A
  • 架构armv7的重复符号

    尝试在我现有的应用程序中使用 Layar SDK 时出现以下错误 我该如何解决这个问题 Ld Users pnawale Library Developer Xcode DerivedData hub afxxzaqisdfliwbzxbi
  • ARM NEON 矢量化失败

    我想在 ARM cortex a9 上启用 NEON 矢量化 但在编译时得到以下输出 未矢量化 不支持相关 stmt D 14140 82 D 14143 77 D 14141 81 这是我的循环 void my mul float32 t
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • ARM Cortex-M3 启动代码

    我试图了解 STM32 微控制器的 Keil realview v4 附带的初始化代码是如何工作的 具体来说 我试图了解堆栈是如何初始化的 In the 文档 http infocenter arm com help index jsp t
  • 上下文切换到安全模式(arm trustzone)的成本是多少

    我试图了解在arm中可信 安全 和非安全模式之间来回切换的成本 从非安全世界转移到安全世界时到底需要发生什么 我知道需要设置 ns 位 基于某些特殊指令 需要刷新和更新页表 刷新和更新处理器缓存 还有什么需要发生的吗 处理器缓存 它们是分段
  • .ko 文件是如何构建的

    我正在尝试将我自己的驱动程序移植到Beagle 板 xm arm cortex A8 在移植时我试图弄清楚如何 ko文件实际构建 在我们的Makefile我们只有一个命令来构建 o file 怎样是一个 ko文件已建立 使用Linux 2

随机推荐

  • 具有 ViewModel 和行为的 Xamarin 视图

    我有一个视图 其中包含当前用户的用户配置文件 该视图包含一个视图模型 该模型具有与用户名或电子邮件地址等单个属性的双向绑定 该视图还有一个行为 它会验证输入并显示输入无效的错误 由于双向绑定 即使行为表明输入错误 视图模型也会更新值 我需要
  • 如何在 R 上使用 dodged geom_boxplot 为每个方面注释不同的值?

    我正在尝试使用组 填充 和构面向我的 ggplot 箱线图添加重要性星号 Using geom signif 我可以添加栏 例如 我也试图对躲避的箱线图做同样的事情 类似于 想象一下较小的线上方有显着性值 前一张图的代码 data libr
  • 如何处理错误然后立即脱离承诺链?

    所以我有一个 Express 应用程序 它使用中间件来解析 JSON POST 请求 然后填充req body目的 然后我有一个承诺链 它使用 Joi 根据模式验证数据 然后将其存储在数据库中 我想做的是检查这些进程之一后是否抛出错误 通过
  • 调试作为 Ajax 响应一部分的 JavaScript 代码

    所以在我的网站中 我使用jquery通过ajax来获取数据 作为 ajax 响应的一部分 一些 javascript 代码也会被执行 问题是如何在firebug或其他工具中调试这个javascript 这是我迄今为止的经验 放置调试器 不起
  • 设置overflow-x:hidden会添加垂直滚动条[重复]

    这个问题在这里已经有答案了 当我指定overflow x hidden在水平和垂直溢出的元素上 除了隐藏水平溢出的内容之外 该元素还会获得垂直滚动条 我尝试过添加overflow y visible甚至只是overflow visible
  • 如何修复警告:初始化程序周围缺少大括号?

    该警告是由vala 生成的c 代码产生的 警告 初始化程序周围缺少大括号 该代码可以工作 但警告很烦人 警告引用的vala代码是 struct Position uint x uint y private static Position p
  • 使用 jQuery FlexSlider 添加或删除幻灯片

    是否可以在运行时添加或删除幻灯片弹性滑块 http flex madebymufffin com 新版本的弹性滑块2 https github com woothemes FlexSlider已经支持这种方法了 slider addSlid
  • 如何让Service Worker离线工作?

    我无法让我的 Service Worker 离线工作 无论我使用什么教程 我在我的 index html 文件中注册了服务工作者 如下所示
  • 如何在可扩展列表视图上插入标题行

    我有一个带有一个可扩展列表视图的 Android 活动 然后我创建了 ExpandableListAdapter 因此我可以单击一个项目 然后可以看到该项目的子项目 还行吧 现在我想为每个项目的子列表插入标准标题 标题 所以我构建了这段代码
  • “返回的颜色将针对指定上下文的主题进行样式设置”是什么意思?

    我最近注意到一个方法 Context getResources getColor int 自 API 23 起已弃用 应该使用 ContextCompat getColor context R color your color 文档对此说道
  • 如何使用重命名重构作为快速修复的一部分?

    我在 DSL 中添加了一个快速修复选项 我想在其中对文档文本进行一些修改 包括重命名某些元素 我可以很好地更改该元素中的文本 但我还想重命名其所有引用 即重命名重构 我怎么做 我可以以某种方式从快速修复内部触发内置的重命名重构吗 或者 如何
  • Gtk-消息:无法加载模块“canberra-gtk-module”

    我的 pygtk 程序将此警告写入 stderr Gtk Message Failed to load module canberra gtk module 自由堪培拉 http 0pointer de lennart projects l
  • MKMapView 无法缩放地图

    我创建了一个非常基本的应用程序 仅显示 MKMapView 和 UserLocation 我有时在绘制这张底图时遇到问题 它只显示地图的一部分 每当我捏缩放地图时 它都无法重新绘制 而只显示空白的灰色图块 每当需要获取新的地图图块时 控制台
  • OpenCV 不报告准确的帧速率/计数

    我有一个 33 秒的视频 正在尝试使用 OpenCV 进行处理 我的目标是确定每个帧对应的时间实例 相对于视频的开始 我这样做是为了能够比较以不同帧速率录制的同一场景的视频帧 什么在起作用 FPS 正确报告为 59 75 这与什么是一致的f
  • Google Cloud Bigtable 客户端连接池

    我通过制作一个虚拟 Web 应用程序来处理向 Bigtable 写入数据和从 Bigtable 读取数据的请求 对 Google Cloud Bigtable 进行了负载测试 一开始 我只使用单个 Bigtable 连接作为单例 并在所有线
  • Eclipse Web 项目依赖项

    这个问题是关于 Eclipse 开发的 我正在尝试在 Eclipse 中创建一个 Web 应用程序 问题是我没有将依赖项 jar 获取到部署的存档中 我创建了一个新的动态 Web 项目并将其链接到另一个 Java 项目 Java 项目引用了
  • 在 Google App 脚本中共享日历

    我正在尝试从电子表格构建日历 然后与域内的适当人员共享它们 我将其作为附加到电子表格的脚本来执行 到目前为止 我可以读取正确的单元格并构建包含事件的日历 但我遇到的问题是弄清楚如何与正确的人共享特定的日历 我四处搜索并找到了相同的通用代码来
  • 尝试对“$(MSBuildVersion)”进行数字比较,结果为“”而不是数字,条件为“$(MSBuildVersion) >= 16.1.0”)”

    当我尝试重新加载已卸载的项目时 出现此错误 如下图所示 它说这条线来自我的Microsoft Managed Core targets 我尝试更新我的 NuGet 包 我尝试将环境变量路径值更改为 msbuild exe 所在的位置 我尝试
  • 内层div的边距影响外层div

    我有三个嵌套的 DIV 元素 如下所示 div div div This br is br a br multiline br testcase br This br is br a br multiline br testcase br
  • 减少可执行文件大小的过程

    我正在生成一个在 ARM 处理器上运行的十六进制文件 我希望将其保持在 32K 以下 它目前比这个大得多 我想知道是否有人可以提供一些关于缩小它的最佳方法的建议 这是我到目前为止所做的 因此 我对其运行 size 以确定十六进制文件有多大