2010-11-15 7 views
8

Estoy dividiendo parte del código en mi proyecto en una biblioteca separada para ser reutilizado en otra aplicación. Esta nueva biblioteca tiene varias funciones definidas pero no implementadas, y tanto mi proyecto actual como la otra aplicación implementarán sus propias versiones de estas funciones.¿Cómo puedo obligar a GCC a compilar funciones que no se utilizan?

Implementé estas funciones en mi proyecto original, pero no se llaman en ningún lugar dentro de él. Solo son llamados por esta nueva biblioteca. Como resultado, el compilador los optimiza y obtengo fallas de enlace. Cuando agrego una llamada ficticia a estas funciones, las fallas de enlace desaparecen.

¿Hay alguna manera de decirle a GCC que compile estas funciones aunque no las llame?

Estoy compilando con gcc 4.2.2 usando -O2 en SuSE linux (x86-64_linux_2.6.5_ImageSLES9SP3-3).

+0

¿Ha intentado utilizar -O0? –

+0

@jcomeau: ¿Pero qué pasa si los quiere optimizados? – Cascabel

+0

si funciona sin optimización, entonces lo que hay que hacer es averiguar qué optimizaciones específicas desactivar; posiblemente -fno-en-línea-pequeñas-funciones sería una, pero nunca he profundizado en cómo gcc hace su magia –

Respuesta

2

Al ser un pragmático, yo sólo hay que poner:

// Hopefully not a name collision :-) 
void *xyzzy_plugh_zorkmid_3141592653589_2718281828459[] = { 
    &functionToForceIn, 
    &anotherFunction 
}; 

a nivel de archivo de uno de los archivos de origen (o incluso un archivo de marca nueva fuente, algo a lo largo de las líneas de forcedCompiledFunctions.c, por lo que es obvio para qué es). .

Debido a que este no es estática, el compilador no será capaz de correr el riesgo de que no lo necesitará en otros lugares, por lo que debería compilar en

2

Su pregunta carece de algunos detalles, pero voy a darle un tiro ...

GCC general, elimina funciones en muy pocos casos:

  • si son d eclared estática
  • En algunos casos (como cuando se utiliza -fno-implementar-inline) si se declaran en línea
  • cualquier otro que se perdió

sugiere emplear 'nm' para ver qué símbolos se exportaron realmente en los archivos .o resultantes para verificar que este es realmente el problema, y ​​luego ver sobre cualquier palabra clave "estática" perdida. No necesariamente en este orden ...

EDIT:

Por cierto, con las opciones -Wall o -Wunused funciones GCC advertir acerca de las funciones no utilizadas, que luego serán los principales objetivos para la eliminación de la hora de optimizar. Cuidado con los

advertencia: ‘XXX’ definido pero no se utiliza

en sus registros de compilación.

+1

"Cualquier otra que eché de menos" - Pax resopla de la risa :-) – paxdiablo

Cuestiones relacionadas