Compilation GCC + Assemblage NASM, foirage au linkage LD

Compilation GCC + Assemblage NASM, foirage au linkage LD - Programmation

Marsh Posté le 26-02-2002 à 20:25:06    

Voici mes fichiers :
 
Test.c :  
 
void MyFunction();
 
void main()
{
 MyFunction();
}
 
Try.asm :  
global _MyFunction
 
_MyFunction:
 push eax
 pop ebx
 ret
 
 
Je compile les deux et j'obtiens deux fichiers au format COFF.
Lorsque je les linke, j'obtiens le message d'erreur suivant :
 
test.obj(.text+0x11):test.c: undefined reference to `_MyFunction'
 
C'est pas normal ca! Quelqu'un peut m'expliquer?

Reply

Marsh Posté le 26-02-2002 à 20:25:06   

Reply

Marsh Posté le 26-02-2002 à 20:26:20    

plutôt qq chose comme
 
extern void MyFunction();

Reply

Marsh Posté le 26-02-2002 à 20:31:16    

Non, non c'est la meme chose. A ma connaissance y'a jamais vraiment eu de différence entre une fonction déclarée extern ou pas. Et le linker vient de me le confirmer...
D'autres suggestions?  :hello:

Reply

Marsh Posté le 26-02-2002 à 21:40:27    

Je viens de constater un résultat intéressant :  
 
Voici mes fichiers cette fois :
 
File1.cpp
void Function1();
 
int main()
{
 int a;
 a = 10;
 
 Function1();
 
 return 0;
}
 
File2.cpp
void Function1()
{
 int a = 3;
 a = a * 3;
}
 
A la compilation, j'obtiens :
undefined reference to '___gxx_personality_v0'
 
Mais ce qui est curieux c'est que quand je change dans File2.Cpp Function1 en Function2, j'obtiens EN PLUS le message :
undefined reference to `__Z9Function1v'
 
La question que je pose donc est, qu'est-ce que c'est donc que ce __gxx_personality_v0?

Reply

Marsh Posté le 27-02-2002 à 00:15:41    

Pfff ... LD, il m'a bien fait chier moi aussi. Mais pas longtemps, je l'ai vite gerclé (GCC for Win32). Le même code compilait impec sous Linux et me sortait des erreurs hallucinogène comme toi sous Windows, quand il plantait pas lamentablement ...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 27-02-2002 à 00:17:28    

Apparement t'es pas le seul ...
http://www.google.com/search?q=__g [...] Google&lr=


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 27-02-2002 à 00:20:47    

Re moi :D
Ca vient apparement du C++ ... Essai ce code avec l'extension .c pour en être sûr ...
http://gcc.gnu.org/cgi-bin/gnatswe [...] tabase=gcc
 
__gxx_personality_v0 is defined in a library, like fopen and strcmp and cout
 and malloc and....  If you link your program in addition to just compiling
 it, the external symbols will be resolved.  Since you are writing C++,
 we recommend you use g++ (or c++) to do the linking step, rather than gcc


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 27-02-2002 à 09:21:27    

Ace17 a écrit a écrit :

Je viens de constater un résultat intéressant :  
 
Voici mes fichiers cette fois :
 
File1.cpp
void Function1();
 
int main()
{
 int a;
 a = 10;
 
 Function1();
 
 return 0;
}
 
File2.cpp
void Function1()
{
 int a = 3;
 a = a * 3;
}
 
A la compilation, j'obtiens :
undefined reference to '___gxx_personality_v0'
 
Mais ce qui est curieux c'est que quand je change dans File2.Cpp Function1 en Function2, j'obtiens EN PLUS le message :
undefined reference to `__Z9Function1v'
 
La question que je pose donc est, qu'est-ce que c'est donc que ce __gxx_personality_v0?  




Quand on linke du C++ on utilise le compilo qui lui appelle le linker... si tu choisis d'appeler directement le linker ne t'etonnes pas s'il manque des fct ou des libs...
 
De plus pour gerer la surcharge le C++ decore les nons de fonctions, ces decoration indiquent les types des arguments de la fonction...  Ils ne sont pas standardises et chaque compilo est libre d'utiliser les siens, il n'y a donc aucune chance de pouvoir linker des .o venant de plusieurs compilo differents...
 
pour linker de l'asm et de C++ il faut alors utiliser le C
extern "C" ....
pour indiquer de ne pas decorer le nom de la fct...

Reply

Marsh Posté le 27-02-2002 à 13:50:46    

Oui mais moi je veux faire du C++!  ;)  
J'aime pas certains trucs dans la syntaxe du C. Mais j'ai trouvé comment faire, pour ceux qui seraient intéressés voici la procédure (trouvée par tatonnement, mais ca marche):
 
gpp -w -fno-rtti -c -nostdlib -fno-builtin -fno-exceptions main.cpp
 
gpp -w -fno-rtti -c -nostdlib -fno-builtin -fno-exceptions file1.cpp
 
gpp -w -fno-rtti -c -nostdlib -fno-builtin -fno-exceptions file2.cpp
 
ld -nostdlib -fno-builtin -fno-exceptions --oformat binary -Ttext 0x00100000 main.o file1.o file2.o

Reply

Marsh Posté le 27-02-2002 à 15:11:59    

Ace17 a écrit a écrit :

Oui mais moi je veux faire du C++!  ;)  
...



 
ben utilise g++
et linke avec g++
et tu n'aurra plus de Pb...
 
et tes fct en asm tu ajoutes
extern 'C' devant...

Reply

Marsh Posté le 27-02-2002 à 15:11:59   

Reply

Marsh Posté le 27-02-2002 à 15:23:31    

Ouais ouais merci!  :)  
Mais j'avais trouvé, mon dernier message était juste pour cloturer le topic en donnant la solution, puisqu'apparament gt pas le seul a avoir eu ce probleme

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed