LINUX.ORG.RU

gcc/g++ и мертвый код


0

1

Какими ключами это лечить? Пример вычурный но ясно показывает проблему которая проявляется и при компиляции и линковке разных файлов. Если рекарства нет, то запостите что ли кто нибудь это в рассылку gcc.gnu.org

$ cat ./test.sh 
#!/bin/bash

echo "#include <stdio.h>" > test.c

for (( i=0; i < 100000; i++ ));
do
    echo "void f${i}(){}" >> test.c
done

echo "int main(){ printf(\"hello strange world!\\n\"); return 0; }" >> test.c

time gcc test.c -o test0
time gcc test.c -o test1 -s -O666 -Wl,--gc-sections
time gcc test.c -o test2 -s -Os   -Wl,--gc-sections

$ ./test.sh 

real    0m22.312s
user    0m21.326s
sys     0m0.968s

real    1m38.326s
user    1m37.046s
sys     0m1.246s

real    1m21.860s
user    1m20.645s
sys     0m1.192s

$ ls -lh
итого 17M
7,4M test0
4,6M test1
3,2M test2
1,6M test.c
334  test.sh

$ ./test0 
hello strange world!

$ gcc -v
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.4.5-6' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --with-arch-32=i586 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.4.5 (Debian 4.4.5-6) 
★★★★

>Какими ключами это лечить?

static f$i

gcc не имеет права выкидывать функции, которые объявлены в модуле как внешние.

linuxfan
()
Ответ на: комментарий от Sylvia

>а -fdata-sections -ffunction-sections

Ок, спасибо помогло, будем юзать, что-ж оно -Os не врубается?

quest ★★★★
() автор топика
Ответ на: комментарий от anonymous

ну а что молодец, я в нее верил, я сам пробежался по gcc -v --help но с ходу вот не нашел... что там в будущем интересного ожидается? аналог llvm в gcc когда ждать?

quest ★★★★
() автор топика
Ответ на: комментарий от quest

Объяви эти фнукции статическими. Без этого gcc не имеет права их выкидывать.

Вот что получилось после того, как я заменил echo «void f$i» на echo «static void f$i»:

$ ./test.sh 

real	0m21.326s
user	0m19.185s
sys	0m0.840s

real	0m1.222s
user	0m0.964s
sys	0m0.092s

real	0m1.061s
user	0m0.912s
sys	0m0.136s

В итоге test1 и test2 весят по 6 килобайт.

linuxfan
()
Ответ на: комментарий от linuxfan

и без объявления static добавление компилятору -fdata-sections -ffunction-sections уменьшило размер до 4 кило

quest ★★★★
() автор топика
Ответ на: комментарий от quest

Ты хотя бы почитал, что эти опции делают?

           Place each function or data item into its own section in the output file if the target supports arbitrary sections.  The name of the function or the name of the data
           item determines the section's name in the output file.

А также обрати внимание, что неиспользуемый код (неиспользуемые статические функции) не попадает вы выходной файл, из-за чего время компиляции (вах!) сокращается в 30 раз.

linuxfan
()
Ответ на: комментарий от linuxfan

почитал - попадают каждая в свою секцию - линкер видимо умеет только посекционно выкидывать, соответвенно если как тут больше неиспользуемых функций то выигрыш в размере, но вероятно бжет быть и проигрыш поэтому видимо оно и не врубается по дефолту даже для -Os

quest ★★★★
() автор топика
Ответ на: комментарий от linuxfan

По дефолту эти опции не включены потому что реализованы неверно и в не которых случаях приводят к таким же результатам как и -O3 я как то немного потролил парней на канале #gcc по поводу этих опций, мне сказали раз ты такой дебил что хочешь отказаться от заведомо неиспользуемого кода то компилируй каждую функцию в отдельный объектный файл, то есть нужно делать так одна функция - один модуль трансляции.

ACR
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.