GCC Уменьшение бинарного раздувания - странный побочный эффект - PullRequest
5 голосов
/ 07 сентября 2010

Странность

Я скомпилировал буферы протокола Google, не используя никаких дополнительных параметров для компиляции «раздувания», и скомпилировал следующую команду ./configure CXXFLAGS="-ffunction-sections -fdata-sections". ду-ч показывает:

120K ./bloat/bin
124K ./bloat/include/google/protobuf/io
8.0K ./bloat/include/google/protobuf/compiler/java
12K ./bloat/include/google/protobuf/compiler/python
8.0K ./bloat/include/google/protobuf/compiler/cpp
128K ./bloat/include/google/protobuf/compiler
52K ./bloat/include/google/protobuf/stubs
848K ./bloat/include/google/protobuf
852K ./bloat/include/google
856K ./bloat/include
12K ./bloat/lib/pkgconfig
37M ./bloat/lib
38M ./bloat
20K ./unbloat/bin
124K ./unbloat/include/google/protobuf/io
8.0K ./unbloat/include/google/protobuf/compiler/java
12K ./unbloat/include/google/protobuf/compiler/python
8.0K ./unbloat/include/google/protobuf/compiler/cpp
128K ./unbloat/include/google/protobuf/compiler
52K ./unbloat/include/google/protobuf/stubs
848K ./unbloat/include/google/protobuf
852K ./unbloat/include/google
856K ./unbloat/include
12K ./unbloat/lib/pkgconfig
15M ./unbloat/lib
16M ./unbloat
53M .

Drill Down:

 ls -gGh bloat/lib/
    total 37M
    -rw-r--r-- 1  13M 2010-09-07 13:57 libprotobuf.a
    -rwxr-xr-x 1  986 2010-09-07 13:57 libprotobuf.la
    -rw-r--r-- 1 1.6M 2010-09-07 13:57 libprotobuf-lite.a
    -rwxr-xr-x 1 1021 2010-09-07 13:57 libprotobuf-lite.la
    lrwxrwxrwx 1   25 2010-09-07 13:57 libprotobuf-lite.so -> libprotobuf-lite.so.6.0.0
    lrwxrwxrwx 1   25 2010-09-07 13:57 libprotobuf-lite.so.6 -> libprotobuf-lite.so.6.0.0
    -rwxr-xr-x 1 771K 2010-09-07 13:57 libprotobuf-lite.so.6.0.0
    lrwxrwxrwx 1   20 2010-09-07 13:57 libprotobuf.so -> libprotobuf.so.6.0.0
    lrwxrwxrwx 1   20 2010-09-07 13:57 libprotobuf.so.6 -> libprotobuf.so.6.0.0
    -rwxr-xr-x 1 5.5M 2010-09-07 13:57 libprotobuf.so.6.0.0
    -rw-r--r-- 1  12M 2010-09-07 13:57 libprotoc.a
    -rwxr-xr-x 1 1.1K 2010-09-07 13:57 libprotoc.la
    lrwxrwxrwx 1   18 2010-09-07 13:57 libprotoc.so -> libprotoc.so.6.0.0
    lrwxrwxrwx 1   18 2010-09-07 13:57 libprotoc.so.6 -> libprotoc.so.6.0.0
    -rwxr-xr-x 1 4.6M 2010-09-07 13:57 libprotoc.so.6.0.0
    drwxr-xr-x 2 4.0K 2010-09-07 13:57 pkgconfig
    ls -gGh unbloat/lib/
    total 15M
    -rw-r--r-- 1 5.8M 2010-09-07 14:03 libprotobuf.a
    -rwxr-xr-x 1  988 2010-09-07 14:03 libprotobuf.la
    -rw-r--r-- 1 764K 2010-09-07 14:03 libprotobuf-lite.a
    -rwxr-xr-x 1 1023 2010-09-07 14:03 libprotobuf-lite.la
    lrwxrwxrwx 1   25 2010-09-07 14:03 libprotobuf-lite.so -> libprotobuf-lite.so.6.0.0
    lrwxrwxrwx 1   25 2010-09-07 14:03 libprotobuf-lite.so.6 -> libprotobuf-lite.so.6.0.0
    -rwxr-xr-x 1 393K 2010-09-07 14:03 libprotobuf-lite.so.6.0.0
    lrwxrwxrwx 1   20 2010-09-07 14:03 libprotobuf.so -> libprotobuf.so.6.0.0
    lrwxrwxrwx 1   20 2010-09-07 14:03 libprotobuf.so.6 -> libprotobuf.so.6.0.0
    -rwxr-xr-x 1 2.7M 2010-09-07 14:03 libprotobuf.so.6.0.0
    -rw-r--r-- 1 3.7M 2010-09-07 14:04 libprotoc.a
    -rwxr-xr-x 1 1.1K 2010-09-07 14:04 libprotoc.la
    lrwxrwxrwx 1   18 2010-09-07 14:04 libprotoc.so -> libprotoc.so.6.0.0
    lrwxrwxrwx 1   18 2010-09-07 14:04 libprotoc.so.6 -> libprotoc.so.6.0.0
    -rwxr-xr-x 1 1.3M 2010-09-07 14:04 libprotoc.so.6.0.0
    drwxr-xr-x 2 4.0K 2010-09-07 14:03 pkgconfig

Вопрос

Я не изменял сценарии сборки для выполнения «--gc-sections» во время компоновки, поэтому не должна ли сборка unbloat быть такой же, если не больше? Что вызвало уменьшение в размере?

Фон

В данный момент я компилирую низкоуровневую библиотеку с помощью gcc, и библиотека имеет огромные 2,5 МБ свободного пространства и 970 КБ разделенного. Это неприемлемо, и мне нужно удалить мертвый код - я зависю от OpenSSL, буферов протокола и 3 библиотек из Boost, и я буду статически связывать последние 2 в мою библиотеку. Две статически связанные библиотеки должны быть скомпилированы с помощью "-ffunction-section -fdata-section", чтобы я мог удалить мертвый код.

Смежный вопрос

Мой следующий вопрос о том, как указать корень, используемый для устранения мертвого кода.

Ответы [ 2 ]

1 голос
/ 19 сентября 2010

Боюсь, что усиление не имеет ничего общего с -ffunction-sections -fdata-sections: когда вы указали CXXFLAGS="-ffunction-sections -fdata-sections" в командной строке configure, вы перезаписали флаги по умолчанию, которые были -O2 -g -DNDEBUG.Как следствие, ваш код был скомпилирован без оптимизации.

Вам следует повторить тест с CXXFLAGS="-ffunction-sections -fdata-sections -O2 -g -DNDEBUG", и вы получите ожидаемые (т. Е. Идентичные) результаты.

1 голос
/ 19 сентября 2010

Компиляция с -ffunction-sections приводит к тому, что каждая функция выводится в отдельный раздел, и каждый объектный файл становится больше (вместо раздела .text теперь у вас есть .text.foo, .text.bar и т. Д.).).То же самое для -fdata-sections.Таким образом, вы получите именно то, что ожидали.

Но вы не должны заботиться о том, насколько велика ваша область сборки. должен *1011* заботиться о том, насколько велик ваш конечный исполняемый файл (или разделяемая библиотека).

С указанными вами флагами исполняемый файл «раздувать» может все же быть больше (но, вероятно,ненамного).Теперь добавьте -Wl,--gc-sections, и ваш «раздувной» исполняемый файл станет заметно меньше.

...