Compilation GCC + Assemblage NASM, foirage au linkage LD - Programmation
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?
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?
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 ...
Marsh Posté le 27-02-2002 à 00:17:28
Apparement t'es pas le seul ...
http://www.google.com/search?q=__g [...] Google&lr=
Marsh Posté le 27-02-2002 à 00:20:47
Re moi
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
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...
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
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...
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
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?