2009-07-29 12 views
22

En el siguiente ejemplo, el programa debe imprimir "foo llamada":¿Por qué no __tribuye __ ((constructor)) trabajo en una biblioteca estática?

// foo.c 
#include <stdio.h> 

__attribute__((constructor)) void foo() 
{ 
    printf("foo called\n"); 
} 

// main.c 
int main() 
{ 
    return 0; 
} 

Si se compila el programa como este, funciona:

gcc -o test main.c foo.c 

Sin embargo, si se compila en foo.c una biblioteca estática, el programa no imprime nada.

gcc -c main.c 
gcc -c foo.c 
as rcs foo.a foo.o 
gcc -o test foo.a main.o 

¿Por qué sucede esto?

+0

¿Por qué los votos a favor? Es algo incorrecto? –

+0

No estoy seguro (¿no era yo?) Pero tal vez alguien se ofendió por tu respuesta a tu pregunta tan rápido? – DaveR

+1

Hmm, solo quería agregar una referencia útil al sitio para un problema no obvio. La pregunta frecuente indica que contestar la propia pregunta es algo bueno (está en la primera sección en realidad). –

Respuesta

13

El enlazador no incluye el código en foo.a en el programa final porque nada en main.o lo hace referencia. Si main.c se reescribe de la siguiente manera, el programa funcionará:

//main.c 

void foo(); 

int main() 
{ 
    void (*f)() = foo; 
    return 0; 
} 

Además, al compilar con una biblioteca estática, el orden de los argumentos a gcc (o el enlazador) es significativa: la biblioteca debe venir en pos de los objetos que lo referencia.

gcc -o test main.o foo.a 
2

Como se dijo, símbolos sin referencia de archivo no lo hace a la salida binaria, porque enlazador los descarta de forma predeterminada.

Para anular este comportamiento cuando se enlaza con la biblioteca estática, --whole-archive/--no-whole-archive opciones para el enlazador se pueden usar, como este:

gcc -c main.c 
gcc -c foo.c 
ar rcs foo.a foo.o 
gcc -o test -Wl,--whole-archive foo.a -Wl,--no-whole-archive main.o 

Esto puede conducir a binario hinchado, porque se incluirán todos los símbolos de foo.a por el enlazador a la salida, pero a veces está justificado.

Cuestiones relacionadas