2011-03-15 11 views
16

Estoy implementando un pequeño programa compilado con gcc, 4.3.2-1.1 (Debian). Este programa se implementará en plantillas de máquinas virtuales que van desde Debain 5 hasta Fedora, Ubuntu, Slackware, Arch y otros.¿Cómo incluyo solo los símbolos usados ​​al vincular estáticamente con gcc?

El programa depende de algunos símbolos de las bibliotecas de Xen que solo están disponibles en un árbol inestable. Por lo tanto, la instalación de las bibliotecas de Xen a través de los gestores de paquetes respectivos en las plantillas de máquinas virtuales no resolvería mi problema inmediato.

Hasta que empaque mi propia versión de estas bibliotecas, necesito vincular estáticamente el archivo ejecutable.

¿Gcc 4.3-x, de forma predeterminada solo incluye símbolos que en realidad son utilizados cuando se está vinculando estáticamente, o hay otro indicador de optimización que deba pasar al vinculador? Sé que vincular estáticamente es malo, lo estoy haciendo solo como un trabajo temporal.

Respuesta

15

Este problema está relacionado no solo con gcc, sino también con ld (1).

Por defecto, gcc no elimina el código muerto, se puede comprobar esto mediante la compilación/vinculación ejecutable, y luego ejecutar

objdump -d a.out

que le muestra todas las funciones en el ejecutable.

Simple "Google" da link.

Por lo tanto, para eliminar las funciones no utilizadas, se necesita:

  • compilar con “-fdata secciones” para mantener los datos en las secciones de datos separadas y “-ffunction secciones” para mantener las funciones en secciones separadas, por lo que (datos y funciones) pueden descartarse si no se utilizan.
  • Enlace con "--gc-sections" para eliminar las secciones no utilizadas.
+0

Gracias. A veces es frustrante solo averiguar qué buscar. Buscando alrededor usando 'símbolos' en la consulta produjo todo lo que _no estaba buscando :) –

+1

este método funciona ... Pero tenga cuidado como documento https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html advierte: '-funciones -función, -fdata-secciones' ... Solo use estas opciones cuando haya beneficios significativos al hacerlo. Cuando especifica estas opciones, el ensamblador y el enlazador crean objetos más grandes y archivos ejecutables y también son más lentos. No puede usar gprof en todos los sistemas si especifica esta opción, y puede tener problemas con la depuración si especifica tanto esta opción como -g. – EDkan

Cuestiones relacionadas