2009-12-13 5 views
1

Si j'ai deux fichiers objets définissant à la fois un symbole (fonction) "foobar".Liaison de deux fichiers objet avec un symbole commun

Est-il possible de dire à l'éditeur de liens d'obéir à l'ordre des fichiers obj que je donne dans l'appel de ligne de commande et de toujours prendre le symbole du premier fichier et jamais le dernier? AFAIK le pragma "weak" fonctionne uniquement sur les bibliothèques partagées mais pas sur les fichiers objet. Veuillez répondre pour toutes les combinaisons compilateur/éditeur de liens/système d'exploitation C/C++ que vous connaissez parce que je suis flexibel et que j'utilise beaucoup de compiles (sun studio, intel, msvc, gcc, acc).

Répondre

2

Je crois que vous devrez créer une bibliothèque statique à partir du deuxième fichier objet, puis lier le premier fichier objet, puis la bibliothèque. Si un symbole est résolu par un fichier objet, l'éditeur de liens ne recherchera pas les bibliothèques.

Vous pouvez également placer les deux fichiers objet dans séparer les bibliothèques statiques, puis l'ordre des liens sera déterminé par leur occurrence dans la ligne de commande.

La création d'une bibliothèque statique à partir d'un fichier objet varie en fonction de la chaîne d'outils. Dans GCC, utilisez l'utilitaire ar et MSVC lib.exe (ou utilisez l'assistant de projet de bibliothèque statique).

+0

Y aura-t toute erreur signalée, le même symbole est défini dans '1.o' et '2.o' (les deux sont dans' libsome.a'), et j'essaye de lier statiquement contre cette bibliothèque? –

+0

@dmak_k: Je n'en ai aucune idée. Pourquoi ferais-tu une telle chose? Deux choses pourraient arriver 1) L'éditeur de liens pourrait trouver les deux définitions et signaler une erreur; 2) Il pourrait résoudre le symbole avec le premier trouvé, dans ce cas, cela dépend de l'ordre dans lequel les fichiers d'objets sont apparus dans la bibliothèque. Dans la plupart des cas, vous voudriez (1) arriver, puisque (2) est ambigu et conduirait à trouver des bogues difficiles à trouver. Vous pourriez bien sûr l'essayer. – Clifford

2

Il existe un danger ici, le mot-clé ici est appelé Code dépendant de l'interposition.

Permettez-moi de vous donner un exemple:

Supposons que vous avez écrit une routine personnalisée appelée malloc. Et vous reliez dans les bibliothèques standard, ce qui se passera est-ce, les fonctions qui nécessitent l'utilisation de malloc (la fonction standard) utilisera votre version personnalisée et le résultat final est le code peut devenir instable comme l'effet secondaire non intentionnel et quelque chose apparaîtra 'cassé'.

C'est juste quelque chose à garder à l'esprit. Comme dans votre cas, vous pourriez «écraser» (j'utilise des guillemets pour souligner) l'autre fonction, mais alors comment sauriez-vous quelle foobar est utilisée? Cela pourrait conduire à un deuil de débogage lorsque vous essayez de savoir quel est foobar appelé.

Espérons que cela aide, Cordialement, Tom.

0

Vous pouvez le faire en tant que fichier .a ... Ensuite, le compilateur obtient le symbole et ne lit d'enfant plus tard

Questions connexes