2010-09-07 12 views
5

la rarezaGCC Reducir binario Inflar - extraño efecto secundario

he recopilado protocolo de Google usando tampones no hay parámetros adicionales para un "hinchar" recopilar y compilar con el comando ./configure CXXFLAGS="-ffunction-sections -fdata-sections" siguiente. una du-h revela:

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 

La pregunta

no he alterado los scripts de creación para realizar una "--gc-sections" durante la vinculación, por lo tanto, shouldn' t la construcción desbloqueada será igual si no más grande? ¿Qué causó la reducción en el tamaño?

Antecedentes

Estoy compilando una biblioteca de bajo nivel con gcc en el momento y la biblioteca es un 2,5 MB descomunal unstriped y 970KB despojado. Esto es inaceptable, y necesito eliminar el código muerto. Depende de OpenSSL, los Buffers de Protocolo y las 3 Bibliotecas de Boost, y enlazaré estáticamente los últimos 2 en mi biblioteca. Las dos bibliotecas vinculadas estáticamente deberán compilarse con "-ffunction-sections -fdata-sections" para que elimine el código muerto.

pregunta relacionada

Mi next question es acerca de cómo especificar la raíz se utiliza para eliminar el código muerto.

+1

tuve que eliminar una publicación anterior porque tenía una publicación doble por algún motivo. Sí, 2,5 MB son geniales: he escrito bibliotecas similares y puedo bajarlas a 80-300kb (usando MSVC). La cadena de herramientas de GCC debería poder hacer lo mismo. –

+0

@Hassan Syed, creo que su sección de antecedentes causa más problemas de los que resuelve. No se relaciona con la pregunta, y parece que estás pidiendo formas de reducir el tamaño del archivo de un archivo binario. Lo eliminaría o lo pondría al final de la pregunta. – strager

+0

Bueno, el tamaño no eliminado no cuenta. Como eso contiene todo el material extra que deseas para eliminar errores y no es realmente relevante para la producción. –

Respuesta

1

Me temo que la ganancia no tiene nada que ver con -ffunction-sections -fdata-sections: cuando especificó CXXFLAGS="-ffunction-sections -fdata-sections" en la línea de comandos de configuración, sobrescribió los indicadores predeterminados que eran -O2 -g -DNDEBUG. Como consecuencia, su código fue compilado sin optimizaciones.

Debe volver a hacer la prueba con CXXFLAGS="-ffunction-sections -fdata-sections -O2 -g -DNDEBUG" y obtendrá los resultados esperados (es decir, idénticos).

+0

Él * con certeza * no obtendrá resultados idénticos, pero su teoría acerca de la falta de -O2 es algo plausible. Sin embargo, si realmente compiló sin '-g', entonces su "hinchazón" debería haber sido * mucho * menor, lo que contradice los hechos observados. –

+0

Comprobé mi "teoría" antes de publicar :) Por supuesto, el resultado no será estrictamente idéntico (porque se realizarán llamadas de sección cruzada en lugar de llamadas relativas a PC dentro del mismo módulo de objeto) pero la diferencia de tamaño será muy pequeña. En cuanto al problema "mucho más pequeño", no olvides que el código compilado con '-O0' es a menudo más grande que el código compilado con' -O2', que contrarresta un poco la ausencia de '-g'. –

+0

Esto suena como la causa más probable, gracias por la explicación. –

1

Compilar con -ffunction-sections hace que cada función que se emitirá en su propia sección, y que hace que cada fichero objeto a ser más grande (en lugar de sólo .text sección, que ahora tiene .text.foo, .text.bar, etc.). Lo mismo para -fdata-sections. Entonces, el resultado que tienes es exactamente lo que se espera.

Pero usted no debería importar cuán grande es su área de construcción. Lo que se debe preocupar por es cuán grande es su ejecutable final (o biblioteca compartida).

Con los indicadores que ha especificado, el ejecutable "inflado" puede ser aún mayor (pero probablemente no mucho). Ahora agregue -Wl,--gc-sections, y su ejecutable "hinchar" será notablemente más pequeño.

Cuestiones relacionadas