Распакованный Linaro GCC 6.2-2016.11 Инструментарий содержит почти 3,4 ГБ дискового пространства, и я хочу уменьшить его. Моя цель - armv7-a + vfpv3 + hard_float, поэтому я уже удалил вещи, которые мне не нужны (например, ld.gold
, библиотеки для Thumb
, v8-a
, v7ve
и т. Д.), Но он по-прежнему занимает почти 1 ГБ.Правильное использование инструмента для стрижки
Поэтому я хочу использовать инструмент strip
для удаления избыточной информации из своих двоичных файлов.
Мой главный вопрос: как использовать полоса безопасность, правильно и эффективно в этом случае?
В целом мы имеем различные бинарные файлы набора инструментов, к которым можно применить strip
: *.exe
, *.a
, *.o
.
Как я могу судить я могу применить strip -s
(удалить все символы) только *.exe
файлы (i.g. рычажного EABI-gcc.exe). Я прав?
Можно ли применять strip
к библиотекам (i.g. 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'
Как я понимаю, наличие unres olved символ в объектном файле заставляет компоновщик разрешать его. Что произойдет, если я удалю этот символ из объектного файла перед связыванием?
Правильно ли и безопасно удалять символы из объектных файлов, прежде чем связывать их вместе? Если да, какие символы можно удалить?
В реальном проекте, если применить к strip -s
ToolChain библиотеки (libgcc.a, libc.a, libm.a, librdimon.a и т.д.) он так же производит много "undefined reference to..."
сообщений во время этап связывания.
Но если мы используем опцию --strip-debug
, компоновщик создает сообщения для библиотек, таких как skipping incompatible libgcc.a when searching for -lgcc
. Если мы вернем библиотеки, это будет успешным.
Что означает skipping incompatible...
сообщение означает в этом случае?
Благодарим за помощь.