2009-02-05 9 views
3

Je reçois ces erreurs lors de la liaison, les deux messages ont à voir avec le même fichier objet.C/C++ linker CALL16 reloc à xxxxx pas contre le symbole global

CALL16 reloc at 0x5f8 not against global symbol 

et

could not read symbols: Bad value 

Le 2ème message semble être la raison pour laquelle je reçois l'erreur de CALL16, mais le fichier compile très bien.

Des conseils pour corriger cela?

Pour votre information, je suis pour une compilation croisée cible MIPS et en utilisant gcc 4.1.2

EDIT: Pas de chance jusqu'à présent:
Voici mes drapeaux utilisés: -fPIC, -Wl, - rpath, -Wl, -O1

J'ai aussi essayé ce qui suit sans succès:
-mno explicite-relocalisations
-mexplicit-relocalisations
-mlong-appels
appels -mno-long
-mxgot
-mno-xgot


Pendant ce temps, je vais revenir à la source à ce point et examiner de plus.

+0

Ajoutez un peu plus de drapeaux de compilateur que vous utilisez. Il semble que vous liez avec les mauvais fichiers ou les objets générés ont des drapeaux différents. – INS

Répondre

2

Aha! Grâce à un de mes collègues, nous avons trouvé le problème.

Voici la question était:

Il y avait une déclaration avant/prototype d'une fonction.

void FooBarIsBest(void); 

Plus tard dans le fichier de la fonction a été définie.

static void FooBarIsBest(void) 
{ 
    // do the best 
} 

Le problème ici était que dans le prototype, le mot-clé static était omis. C'était comme si une nouvelle fonction était en train d'être définie.

La référence CALL16 est utilisée par gcc pour le code relogeable. Le code d'assemblage du fichier a montré que CALL16 était utilisé sur cette fonction ... Ce qui est faux, car cette fonction est locale.

Fait intéressant, ce code utilisé pour compiler & lien juste très bien avec une ancienne version de gcc (3.2.2). Un autre leçon apprise. :)

+0

bonne prise par 'collègue' –

+0

Exactement :) Merci à Marco - il est l'homme. –

1

Essayez l'indicateur -mlong-calls dans le compilateur. Voir aussi manual pour des options MIPS plus spécifiques.