gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:26:02 27 4
gpt4 key购买 nike

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

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

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

最佳答案

除了明显的 (-Os -s),将函数对齐到不会崩溃的最小可能值(我不知道 ARM 对齐要求)可能会挤出每个函数几个字节.
-Os 应该 已经禁用对齐功能,但这可能仍然默认为 4 或 8 这样的值。到 1 对于 ARM 是可能的,这可能会节省一些字节。

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

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

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

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

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

避免像魔鬼一样的非平凡构造函数静态局部变量(POD 类型没问题)。 Gcc 将初始化 non-trivial-constructor static locals threadsafe 除非你用 -fno-threadsafe-statics 编译,它链接到很多额外的代码(即使你不根本不使用线程)。

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

关于linux - 如何减小生成的二进制文件的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6771905/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com