0

解压后的Linaro GCC 6.2-2016.11工具链占用了将近 3.4 GB 的磁盘空间,我想让它更小。我的目标是armv7-a+vfpv3+hard_float,所以我已经删除了我不需要的东西(例如、、等ld.gold的库),但它仍然占用将近 1 GB。Thumbv8-av7ve

所以我想使用strip工具从其二进制文件中删除冗余信息。

我的主要问题是在这种情况下如何正确有效地使用安全带

一般来说,我们在工具链中有不同的二进制文件,我们可以应用它们strip*.exe, *.a, *.o.

我可以判断我只能将strip -s(删除所有符号)应用于*.exe文件(ig arm-eabi-gcc.exe)。我对吗?

是否可以应用于strip图书馆(ig libgcc.a)? 据我了解(见上面的例子)库中的符号可能需要进一步处理。

如果是,我应该--strip-debug改用(仅删除调试符号)?

下面的示例说明了这些问题并揭示了更多信息。

假设我们有三个文件:

// main.c:
#include "libgcc_test.h"
int main(void)
{
    do_something();
    return 0;
}

// libgcc_test.c:
void do_something(void)
{
    return;
}

// libgcc_test.h:
void do_something(void);

一般来说,我们只是单独编译每个文件以获得可以链接在一起的目标文件:

$ ./arm-eabi-gcc.exe main.c -c
$ ./arm-eabi-gcc.exe libgcc_test.c -c

通过分析目标文件,我们可以看到do_something符号在 libgcc_test.o 中定义,而在main.o未定义,正如预期的那样:

$ ./arm-eabi-nm.exe main.o
         U do_something
00000000 T main

$ ./arm-eabi-nm.exe libgcc_test.o
00000000 T do_something

如果我们同时应用strip -s这两个文件或只应用到main.o并尝试链接它们,它会起作用:

$ ./arm-eabi-nm.exe main.o
arm-eabi-nm.exe: main.o: no symbols
$ ./arm-eabi-nm.exe libgcc_test.o
arm-eabi-nm.exe: libgcc_test.o: no symbols
$ ./arm-eabi-ld.exe libgcc_test.o main.o -o main
arm-eabi-ld.exe: warning: cannot find entry symbol _start; defaulting to 00008000

但是如果我们strip -s只适用于libgcc_test.o,链接器会产生错误信息:

$ ./arm-eabi-strip.exe -s libgcc_test.o
$ ./arm-eabi-ld.exe libgcc_test.o main.o -o main
arm-eabi-ld.exe: warning: cannot find entry symbol _start; defaulting to 00008000
main.o: In function `main':
main.c:(.text+0x8): undefined reference to `do_something' 

据我了解,目标文件中存在未解析的符号会强制链接器解析它。如果我在链接之前从目标文件中删除此符号会发生什么?

在将它们链接在一起之前从目标文件中删除符号是否正确且安全?如果是,哪些符号可以删除?

在实际项目中,如果我们应用于strip -s工具链库(libgcc.alibc.alibm.alibrdimon.a"undefined reference to..."等),它同样会在链接阶段产生大量消息。

但是如果我们使用--strip-debug选项,链接器会为像skipping incompatible libgcc.a when searching for -lgcc. 如果我们还原库,则链接成功。

skipping incompatible...在这种情况下,消息是什么意思?

谢谢你的帮助。

4

1 回答 1

2

只是总结一下我是如何做到的。也许它对某人有用。

我只是删除了不必要的库/可执行文件并仅应用于strip -s文件*.exe

之后,所有工具链似乎都是~230 MB

于 2017-01-15T18:56:55.207 回答