2016-12-26 30 views
-1

Распакованный 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... сообщение означает в этом случае?

Благодарим за помощь.

ответ

0

Просто подведем итоги, как я это сделал. Может быть, это будет полезно для кого-то.

Я только что удалил ненужные библиотеки/исполняемые файлы и применил strip -s к *.exe файлам.

После этого все инструментальные средства оказались ~ 230 МБ.