Question

Dans l'exemple suivant, le programme doit imprimer "foo appelé":

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

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

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

Si le programme est compilé comme ceci, cela fonctionne:

gcc -o test main.c foo.c

Cependant, si foo.c est compilé dans une bibliothèque statique, le programme n’imprime rien.

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

Pourquoi cela se produit-il?

Était-ce utile?

La solution

L'éditeur de liens n'inclut pas le code dans foo.a dans le programme final car rien dans main.o ne le mentionne. Si main.c est réécrit comme suit, le programme fonctionnera:

//main.c

void foo();

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

En outre, lors de la compilation avec une bibliothèque statique, l'ordre des arguments de gcc (ou de l'éditeur de liens) est important: la bibliothèque doit se trouver après les objets qui la référencent.

gcc -o test main.o foo.a

Autres conseils

Comme il a été dit, les symboles non référencés de l'archive ne sont pas rendus au binaire de sortie, car l'éditeur de liens les supprime par défaut.

Pour remplacer ce comportement lors de la liaison avec une bibliothèque statique, vous pouvez utiliser les options - archive entière / - no-whole-archive , comme ceci :

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

Cela peut donner lieu à une augmentation du binaire, car tous les symboles de foo.a seront inclus par l'éditeur de liens vers la sortie, mais cela est parfois justifié.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top