Bonjour,
J'ai construit un compilateur croisé linux/ppc-elf GCC de souche 4.0.1 avec support langage C, C++, JAVA.
Mon problème est le crt0.o
En effet, j'ai un crt0.o fourni par l'OS sur cible ppc et un crt0.o fourni par la newlib.
Pour tester mon compilateur croisé, j'ai écrit un HelloWorld.cpp
Quand je link mon HelloWorld.o avec le crt0.o de l'OS cible, des symboles apparaissent indefinis.
Ceux ci sont les CTOR et DTOR, constructeurs et destructeurs globaux.
Je ne peux donc compiler mon appli et pour ce faire j'utilise le crt0.o fourni par la newlib.
Pour executer HelloWorld (écrit en C), pas de problème, pour HelloWorld (écrit en C++ ou Java) j'obtient un beau segfault.
Je me suis demandé d'ou venait le probleme et en utilisant gdb, je me suis apercu que la methode cout faisait planter gdb.
Je me suis donc dis que l'initialisation des classes n'avait pas été faite, et cela m'a mis sur la piste de la fonction _start.
Mais après avoir fait des recherches sur le net, je me pose ces questions :
CRT est fourni par l'OS, mais les inits de librairies sont faits dans les lib dans la fonction _start : ok pour libc, mais comment pour libstdc++ et libjava ?
Je pense que le crt0.o de l'OS cible devrait fonctionner et c'est en apportant à l'édition de lien le "bon" _start (dans newlib et/ou libc et/ou libstdc++ et/ou libjava) que l'on aura un process qui démarre convenablement.
Autrement dit :
- on aurait un HWC avec un _start correct, apporté par la "libc" (= newlib ?)
- on aurait un HWC++ avec un _start incorrect, qui n'appelle pas les constructeurs nécessaires à C++,
- on aurait un HWjava avec un _start incorrect, qui n'appelle pas les constructeurs nécessaires à C++ et Java
J'aurai besoin d'une confirmation, et si possible j'aimerai savoir :
- quelles sont les libs (dans OS, dans gcc, dans newlib...) qui définissent le symbole _start
- quelles sont les libs (dans OS, dans gcc, dans newlib...) qui utilisent le symbole _start
et ce, de meme pour les "global_constructors" et "global_destructors".
Cordialement,
Christophe.