Question

Je l'ai déclaré une fonction externe avec un attribut de GCC faible dans un fichier .c:

extern int weakFunction( ) __attribute__ ((weak));

fichier objet Compilé a weakFunction défini comme un symbole faible. Sortie nm:

1791:         w weakFunction

J'appelle la fonction faible définie comme suit:

if (weakFunction != NULL)
{
    weakFunction();
}

Quand je relie le programme en définissant les fichiers objet en tant que paramètres GCC (gcc main.o weakf.o -o main.exe) symboles faibles excellent travail. Si je quitte le weakf.o de liaison, l'adresse de fonction est NULL dans main.c et la fonction ne sera pas appelée.

Le problème est, quand weakf.o est à l'intérieur d'une bibliothèque statique, pour une raison quelconque l'éditeur de liens ne trouve pas la fonction et l'adresse de la fonction finit toujours par être NULL. Bibliothèque statique est créé avec ar: ar rcs weaklibrary weakf.o

Tout le monde a eu des problèmes similaires?

Était-ce utile?

La solution

Bien que je ne sais pas le fonctionnement exact des symboles faibles, il semble que vous obtenez ce que vous demandez: si personne d'autre force le weakFunction () être présent, main () ne sera pas non plus. Pour moi, cela est logique: si vous essayez de code d'écriture qui fonctionne avec des installations présentes X ainsi que sans elle, vous ne voulez pas votre code à la force X à inclure dans votre construction à tout prix. On dirait que est censé demander « faible » si quelque chose est présent, de ne pas demander que quelque chose est présent. Peut-être que vous pouvez forcer l'inclusion des symboles faibles avec « -u weakFunction » comme option éditeur de liens dans votre cas.

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