¿Hay una manera de quitar todas las funciones de un archivo de objeto que no estoy usando?

StackOverflow https://stackoverflow.com/questions/2634007

Pregunta

Estoy tratando de ahorrar espacio en mi ejecutable y me di cuenta de que varias funciones que se añaden en mis archivos de objetos, a pesar de que nunca se llamo ellos (el código es de una biblioteca).

¿Hay una manera de decirle a gcc para eliminar estas funciones de forma automática o tengo que eliminarlos manualmente?

¿Fue útil?

Solución 4

Desde que hice esta pregunta, GCC 4.5 fue lanzado que incluye una opción para combinar todos los archivos por lo que parece que es sólo 1 archivo fuente gigantesca. El uso de esa opción, es posible quitar fácilmente las funciones no utilizadas.

aquí

Otros consejos

Si está compilando en archivos objeto (no ejecutables), a continuación, un compilador nunca retire cualquier función no static, ya que siempre es posible que va a vincular el archivo de objeto contra otro archivo de objeto que va a llamar a esa función. Así que el primer paso debe ser declarar tantas funciones como sea posible static.

En segundo lugar, la única manera para que un compilador para eliminar las funciones no utilizadas sería vincular estáticamente su ejecutable. En ese caso, existe al menos la posibilidad de que un programa puede venir y averiguar qué funciones se usan y cuáles no se utilizan.

El problema es, no creo que gcc realmente hace este tipo de optimización-módulo de cruz. Su mejor apuesta es la bandera -Os para optimizar el tamaño del código, pero incluso entonces, si usted tiene un archivo objeto abc.o que tiene algunas funciones que no son estáticas y no utilizados se vincula estáticamente contra algunos def.exe ejecutable, no creo gcc que irá y despojar el código para las funciones no utilizadas.

Si necesita desesperadamente verdaderamente que esto se haga, creo que podría tener que #include realidad los archivos juntos para que después del pase preprocesador, que se traduce en un único archivo .c siendo compilado. Con gcc compilar un solo archivo fuente gigante monstruoso, se pone de pie la mejor oportunidad de funciones no utilizadas siendo eliminado.

¿Usted ha mirado en llamar gcc con -OS (Optimizar para el tamaño.) No estoy seguro de si se despoja de código no alcanzados, pero sería bastante simple de prueba. También podría, después de conseguir su vuelta ejecutable, 'tira' la misma. Estoy seguro de que hay un arg gcc de línea de comandos para hacer la misma cosa - es que --dead_strip

Además de -Os para optimizar el tamaño, esta enlace puede ser de ayuda.

IIRC enlazador por defecto hace lo que quiere ins algunos casos específicos. El corto de él es que los archivos de la biblioteca contienen un montón de archivos de objetos y archivos sólo se hace referencia están vinculados. Si usted puede encontrar la manera de llegar a GCC que emiten cada función en su propio archivo de objeto y luego construir esto en una biblioteca que debe recibir lo que está buscando.

Yo sólo sabe de uno compilador que realmente puede hacer esto: aquí (vistazo a la bandera -lib)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top