我正在生成一个在 ARM 处理器上运行的十六进制文件,我希望将其保持在 32K 以下。它目前比这个大得多,我想知道是否有人可以提供一些关于缩小它的最佳方法的建议?
这是我到目前为止所做的
- 因此,我对其运行“size”以确定十六进制文件有多大。
- 然后再次“大小”以查看链接以创建十六进制文件的每个目标文件有多大。看来大部分大小来自外部库。
- 然后我使用“readelf”来查看哪些函数占用了最多的内存。
- 我搜索了代码,看看是否可以消除对这些函数的调用。
这就是我陷入困境的地方,有一些函数我不直接调用(例如 _vfprintf),并且我找不到调用它的函数,因此我可以删除调用(因为我认为我不需要它)。
那么接下来的步骤是什么?
对答案的回应:
- 正如我所看到的,正在调用的函数占用了大量内存。然而我找不到它的名字。
- 我想省略这些函数(如果可能的话),但我找不到调用它们的函数!我猜可以从任意数量的库函数中调用。
- 我认为链接器正在按预期工作,它只包含相关的库文件。您如何知道是否仅包含相关功能?你可以为此设置一个标志或其他东西吗?
- 我正在使用海湾合作委员会
一般清单:
- 确保禁用编译器和链接器调试选项
- 在打开所有大小选项的情况下编译和链接(gcc 中的 -O)
- Run
strip
在可执行文件上
- 生成映射文件并检查函数大小。您可以让链接器生成映射文件(
-M
使用 ld 时),或者您可以在最终的可执行文件上使用 objdump(请注意,这仅适用于未剥离的可执行文件!)这实际上不会解决问题,但它会让您知道最严重的问题。
- Use
nm
研究从每个目标文件调用的符号。这应该有助于查找谁在调用您不想调用的函数。
最初的问题是一个关于仅包含相关功能的子问题。gcc
将包括使用的每个目标文件中的所有函数。换句话说,如果您有一个包含 10 个函数的目标文件,则所有 10 个函数都将包含在您的可执行文件中,即使实际调用了其中一个 1。
标准库(例如 libc)会将函数分割成许多单独的目标文件,然后将其存档。然后将可执行文件链接到存档。
通过分成许多目标文件,链接器能够仅包含实际调用的函数。 (这假设您是静态链接)
您没有理由不能使用同样的技巧。当然,您可能会争辩说,如果不调用这些函数,您可能可以自己删除它们。
如果您静态链接其他库,您也可以在它们上运行上面列出的工具,以确保它们遵循类似的规则。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)