Какими ключами это лечить? Пример вычурный но ясно показывает проблему которая проявляется и при компиляции и линковке разных файлов. Если рекарства нет, то запостите что ли кто нибудь это в рассылку 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)