2010-02-07 8 views
6

Considere el ejemplo siguientela compilación de archivos de objetos no esencial con GCC

g++ a.o b.o c.o -o prog 

Si se da el caso de que c.o no aporta ningún código ejecutable para prog, ni existen dependencias en c.o en cualquiera de los otros archivos, ¿incluirá GCC los contenidos de c.o en prog?

Dicho de otra manera, aparte del tiempo de compilación, ¿qué consecuencias negativas (si las hay) pueden ser la compilación de archivos innecesarios en un ejecutable?

Gracias de antemano; ¡Aclamaciones!

+0

Puede intentar vincular con y sin la biblioteca adicional y ver si el ejecutable tiene el mismo tamaño. –

+0

No sé acerca de GCC pero MSVC incluirá el contenido de todos los archivos .obj tanto si los referencia como si no, pero incluirá solo las partes de los archivos .lib a las que hace referencia. Esperaría que GCC fuera el mismo –

+2

El paso descrito comúnmente se llama "vincular". El término "compilar" se usa normalmente para describir la producción de archivos de objetos. – MSalters

Respuesta

5

No hay consecuencias negativas, excepto que su ejecutable puede ser innecesariamente grande. Es probable que el enlazador elimine definitivamente el código que no usaste, y eso reducirá las cosas. Puede usar algún tipo de herramienta de visualización de objetos (otool, objdump, nm, etc.) en el ejecutable de salida para ver si su programa tiene símbolos adicionales en él.

estoy usando un Mac, por lo que habrá algunas diferencias si está utilizando el conjunto estándar de herramientas gcc, pero aquí es un ejemplo:

$ make 
gcc -o app main.c file2.c 
gcc -Wl,-dead_strip -o app_strip main.c file2.c 
$ ls -l app* 
-rwxr-xr-x 1 carl staff 8744 Feb 6 20:05 app 
-rwxr-xr-x 1 carl staff 8704 Feb 6 20:05 app_strip 

Creo que en el mundo gcc no sea de Apple , pasaría -Wl,--gc-sections en lugar de -Wl,-dead_strip en mi ejemplo. La diferencia de tamaño en los dos ejecutables se pueden ver se debe a la función adicional de ser despojado:

$ nm app | cut -c 20- > app.txt 
$ nm app_strip | cut -c 20- > app_strip.txt 
$ diff app.txt app_strip.txt 
8d7 
< _function2 
2

yo sólo probé con algo de código C Actualmente estoy usando - he vinculado en un objeto que contenía un método no (todavía) utilizado en cualquier otro lugar en el programa. El código se incluyó en el ejecutable resultante, se comprobó ejecutando nm contra el archivo elf y observando que el método T estaba realmente allí, incluso con -O2 y -O3 usados.

3

llvm puede eliminar el código muerto en el paso de enlace. Utiliza el enlazador especial llvm-ld.

Además, usar -fwhole o (intel) ayudará a alejar los símbolos muertos.

1

Sí, GCC incluirá todos los archivos de objeto. Con un compilador muy reciente (versión de desarrollo 4.5.0), puede usar -flto (optimización de tiempo de enlace) para realizar eso.

Cuestiones relacionadas