如何减小生成的二进制文件的大小?

2024-01-12

我知道有一个选项“-Os”可以“优化大小”,​​但它影响不大,甚至在某些情况下会增加大小:(

strip(或“-s”选项)删除调试符号表,效果很好;但它只能减少一小部分尺寸。

还有其他办法可以走得更远吗?


除了显而易见的(-Os -s),将函数对齐到不会崩溃的最小可能值(我不知道 ARM 对齐要求)可能会挤出每个函数的几个字节。
-Os should已经禁用对齐功能,但这可能仍然默认为 4 或 8 之类的值。 ARM 可以将其设置为 1,这可能会节省一些字节。

-ffast-math(或磨蚀性较小的-fno-math-errno) 不会设置 errno 并避免一些检查,从而减少代码大小。如果像大多数人一样,您无论如何也不读取 errno,那么这是一个选择。

正确使用__restrict (or restrict) and const消除冗余负载,使代码更快、更小(并且更正确)。正确地标记纯函数可以消除函数调用。

启用 LTO 可能会有所帮助,如果不可用,请将所有源文件一次性编译为二进制文件(gcc foo.c bar.c baz.c -o program而不是编译foo.c, bar.c, and baz.c首先到目标文件,然后链接)将具有类似的效果。它使优化器一次性看到所有内容,从而可能使其更好地工作。

-fdelete-null-pointer-checks可能是一个选项(请注意,通常使用任何“O”启用此选项,但是not在嵌入式目标上)。

将静态全局变量(希望没有那么多,但仍然)放入结构中可以消除很多开销初始化它们。我在编写第一个 OpenGL 加载程序时了解到了这一点。将所有函数指针放在一个结构中并使用以下命令初始化该结构= {}生成一个调用memset,而初始化指针的“正常方式”会生成一百千字节的代码,只是为了将每个指针单独设置为零。

避免非平凡构造函数静态local变量就像魔鬼(POD类型没问题)。 Gcc 将初始化非平凡构造函数静态局部变量线程安全,除非您使用-fno-threadsafe-statics,其中链接a lot额外的代码(即使您根本不使用线程)。

使用 libowfat 之类的东西代替普通的 crt 可以greatly减少二进制文件的大小。

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

如何减小生成的二进制文件的大小? 的相关文章

  • 如何重命名共享库以避免同名冲突?

    我找到了一个图书馆 libjson http sourceforge net projects libjson 我正在尝试将其构建为共享库并在项目中使用 建造很简单 修复 Makefile 错误后 SHARED 1 make install
  • Linux 的 gcc __attribute__((selectany)) 替代方案?

    我想知道是否有替代方案 attribute selectany 在Linux中 我想定义这样的东西 char a qwe zxc 并将其包含在许多链接在一起的 c 文件中 因此链接器将看到 a 的多个定义 因此不会链接 我读过这个属性 se
  • 从汇编程序获取命令行参数

    通读 专业汇编语言书籍 似乎它提供了用于读取命令行参数的错误代码 我纠正了一点 现在它从段错误变成了读取参数计数 然后是段错误 这是完整的代码 data output1 asciz There are d params n output2
  • 除了 iptables 之外还有数据包管理实用程序吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 Linux 实用程序 它可以根据一组规则更改网络数据包的有效负载 理想情况下 我会使用
  • 从 Java 读取 /dev/input/js0

    我正在尝试阅读 dev input js0来自Java 但我不断得到 java io IOException Invalid argument at java io FileInputStream read0 Native Method a
  • 编译器 libstdc++ 版本与系统版本

    我试图了解 g 如何选择它链接的 libstdc 版本 以及当库的 系统 版本不同时它意味着什么 我正在使用 gcc g 4 1 2 根据ABI 指南 http gcc gnu org onlinedocs libstdc manual a
  • 将用户添加到组但运行“id”时未反映

    R 创建了一个名为 Staff 的组 我希望能够在不以 sudo 身份启动 R 的情况下更新软件包 所以我使用以下方法将自己添加到员工中 sudo usermod G adm dialout cdrom plugdev lpadmin ad
  • 使用 AVX 内在函数代替 SSE 并不能提高速度 - 为什么?

    我已经使用 Intel 的 SSE 内在函数相当长一段时间了 并取得了良好的性能提升 因此 我希望 AVX 内在函数能够进一步加速我的程序 不幸的是 直到现在情况并非如此 可能我犯了一个愚蠢的错误 所以如果有人能帮助我 我将非常感激 我使用
  • 页面错误陷阱的成本

    我有一个应用程序 它定期 每 1 或 2 秒后 通过分叉自身来获取检查点 因此 检查点是原始进程的一个分支 它一直保持空闲状态 直到原始进程发生某些错误时被要求启动 现在我的问题是fork的写时复制机制的成本有多大 每当原始进程写入内存页面
  • 类似 wget 的 BitTorrent 客户端或库? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 是否有任何
  • 在 Linux 2.6.21 (glibc 2.3.5) 上进行 ARP 和反向 ARP

    我需要在任意 IP 网络上存储对第三方设备的持久引用 其中设备的 IP 地址可能是静态的或由 DHCP 随机分配 我不控制网络上的设备 也不能依赖 DNS 和其他现有的或与设备一起使用的临时网络协议 所以我被指示使用硬件地址和 ARP 进行
  • 如何从 C 文件更改终端中的目录

    如何从 C 程序更改将在终端上生效的目录 实际上不要告诉 system 函数或 chdir 函数 这些仅适用于 C 中的进程或子 shell 假设我正在从 bash shell 执行一个 C 程序 其进程 ID 为 10223 那么 我可以
  • 代码::块 - 警告:GDB:无法设置控制终端:不允许操作

    我已经通过官方存储库在 Ubuntu 14 04 中安装了 Code Blocks 13 12 当我编译时 一切正常 但是当我调试时 shell 中会显示以下消息 警告 GDB 无法设置控制终端 操作不正确 允许的 程序执行到断点 但当我执
  • Linux shell 命令逐块读取/打印文件

    是否有一个标准的 Linux 命令可以用来逐块读取文件 例如 我有一个大小为 6kB 的文件 我想读取 打印第一个 1kB 然后是第二个 1kB 看来猫 头 尾在这种情况下不起作用 非常感谢 你可以这样做read n在循环中 while r
  • typeof() 表达式内的副作用

    在 GNUC C 中 您可以使用typeof expression 并且使用内部带有副作用的表达式是合法的 例如 您可以使用以下 C 代码 int x 0 typeof x y 在这种情况下 副作用被忽略 并且 x 之后仍然为零 这是有道理
  • 当我通过 shell 脚本创建 .txt 文件时,为什么文件名末尾出现问号? [复制]

    这个问题在这里已经有答案了 我正在编写一个 shell 脚本 我应该在其中创建 1 个文本文件 当我这样做时 文件名末尾出现一个问号 是什么原因 我正在 bash 脚本中尝试以下方法 1 grep ERROR a1 gt text txt
  • 如何使用sprof?

    请举例说明 从邮件中找到here http sources redhat com ml libc alpha 2003 07 msg00029 html and here http sourceware org ml binutils 20
  • 如何使用 tmuxinator 在 tmux 中拆分水平窗格内的两个垂直窗格

    目前我的 tmuxinator yml 文件中有这个 windows editor layout main horizontal panes vim server rails s 这给了我两个窗口 一个用于编辑器 另一个用于服务器 在编辑器
  • bash双括号问题

    我对 bash 脚本非常陌生 在使用双括号时遇到了问题 我似乎无法让它们在 Ubuntu Server 11 10 中工作 我的下面的脚本位于 if test sh 中 bin bash if 14 14 then echo FOO fi
  • 有关 Linux 内存类型的问题

    关于Linux内存我有以下问题 我知道活动内存是最常访问的内存部分 但是有人可以解释一下 linux 如何考虑将内存位置用于活动内存或非活动内存 主动存储器由哪些部分组成 磁盘 文件缓存是否被视为活动内存的一部分 有什么区别Buffers

随机推荐

  • recyclerview 中的刷新失去了焦点

    伙计们 我正在开发android TV应用程序 所以我水平和垂直地使用了recyclerview 并且我使用了一种方法通过使用adapter notifyDataSetChanged 来刷新垂直recyclerview的适配器 但我遇到了一
  • UNION ALL 和 NOT IN 在一起

    SQL Server 我有 3 个简单的表 Fname Lname 和 Exceptions 每列有一列 称为 Name 我希望我的最终结果看起来像 Fname 中的每个人 LName 中的每个人 例外中的每个人 FName Name A
  • 向上移动/移动数组中的对象,然后将第一个元素移动到最后一个索引[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在 Unity3D 中构建游戏 并尝试通过启用和禁用游戏对象来重用它们 而不是实例化和销毁它们 我的 GameObject 数组中有 1
  • SimpleXMLElement 和警告:非法偏移类型

    警告 非法偏移类型 我有来自 xml 输出的这个 var var dump key 它给我 object SimpleXMLElement 11 1 0 gt string 5 Cairo 现在我想让 Cairo 作为关键来获得它的值 例如
  • 如何从命令行捕获标准输出?

    我尝试在命令行中运行 process start 命令 并尝试将输出获取到字符串或一些有用的位置 输出将由几行组成 如 DIR 命令 我读过如何做 但它对我不起作用 它运行但随后进入循环并且不会停止 见下文 有任何想法吗 ProcessSt
  • 当输入分辨率为 1200x1600 时,通过 C-API 进行 ffmpeg 解码会导致伪影。难道我做错了什么?

    使用 C API 和 FFmpeg 5 1 我已经能够在 Android 上使用 libx264 对 h264 视频进行编码 现在我想在 Linux 上的 C 应用程序中重播它们 这些视频可以在浏览器或我尝试过的其他播放器 例如 ffmpe
  • 如何处理 SVM 中的数据不平衡问题?

    如果我在较大的训练集上训练 SVM 并且类变量为 True 或 False 那么与训练集中的 False 值数量相比 True 值很少会影响训练模型 结果吗 它们应该相等吗 如果我的训练集 True 和 False 的分布不相等 我该如何解
  • 我可以在电子邮件通讯中使用“单击打印”按钮吗?

    我想知道是否可以在电子邮件通讯中使用 单击打印 按钮 与window print 方法类似 但我不确定电子邮件是否可以包含javascript 我不这么认为 如果是的话 也不建议这样做 我不确定您是否先尝试用谷歌搜索您的问题 但请检查一下t
  • Meteor 设备检测 android 还是 ios?

    我有一个为 ios 和 android 设备部署的流星应用程序 我希望某些代码仅在 ios 设备上运行 而不是在 android 上运行 我知道我可以使用流星设备检测包来检测设备 例如 Meteor Device isPhone 但有没有什
  • SQL Server 机器学习服务 r 版本 3.5

    根据这个link https learn microsoft com en us sql advanced analytics install upgrade r and python view sql server ver15 SQL S
  • Rails 4:在生产中的控制台中显示 SQL [重复]

    这个问题在这里已经有答案了 升级到rails 4后 当我在生产服务器上的rails控制台中执行命令时 不再显示执行的SQL 如何在不影响性能的情况下再次启用该功能 ActiveRecord Base logger Logger new ST
  • java.lang.NoSuchMethodError:com.google.common.base.CharMatcher.ascii()

    我在 glassfish 服务器上收到此错误 java lang NoSuchMethodError com google common base CharMatcher ascii Lcom google common base Char
  • 将表达式的结果分配给原语

    K Sierra 在她的书 SCJP 学习指南 中提到 我们知道文字整数始终是 int 但更重要的是 涉及任何 int 大小或更小的表达式的结果始终是 int 我已经开始尝试 我对以下结果有点困惑 byte a 1 correct byte
  • Flexbox高度百分比[重复]

    这个问题在这里已经有答案了 我有一个基本的弹性盒布局 我正在尝试应用高度百分比 目前它们都占据相同的百分比 html body height 100 margin 0 padding 0 text align center row one
  • 鼠标悬停时更改图像大小

    我目前正在尝试做到这一点 以便如果我将鼠标悬停在li 图像改变其大小 我设法从网站上提取了一个代码 如果我将鼠标悬停在img如下所示 div class profiles ul li class portraitsLeft align le
  • Android 中的 YouTube 播放器崩溃并给出 java.lang.IllegalStateException: android.os.DeadObjectException

    我正在做一个项目 我在用YouTubeAndroidPlayerAPI and Webview在我的活动中 当我尝试使用其 id 运行视频时 它会运行 问题是 但如果视频 id 为空 那么我不会按照代码中的说明运行或初始化视频 然后它会给出
  • NSDocument 保存一个完整的文件夹?

    如果这个论点已经被涵盖 我很抱歉 但经过一些研究 我发现没有任何精确的内容 我需要制作一个基于文档的应用程序 其中文档实际上不是单个文件 而是目录中的结构化文件集合 窗口将显示文件夹中包含的带有特定文件名的 pdf 并使用文件夹中其他文件的
  • 如何获取Spring Filter中的路径变量?

    我正在开发一个安全过滤器 需要根据路径变量的值进行一些检查 我试图这样做 final Map
  • C++动态分配静态维度数组的数组

    我需要创建一个包含可变数量的 char 2 的结构 即 2 个字符的静态数组 我的问题是 如何为 x 个 char 2 分配内存 我尝试了这个 假设定义了 int x char m NULL m new char x 2 delete m
  • 如何减小生成的二进制文件的大小?

    我知道有一个选项 Os 可以 优化大小 但它影响不大 甚至在某些情况下会增加大小 strip 或 s 选项 删除调试符号表 效果很好 但它只能减少一小部分尺寸 还有其他办法可以走得更远吗 除了显而易见的 Os s 将函数对齐到不会崩溃的最小