Wart mal, versuchst du hier, eine Java-Klasse aus C++-Code heraus auf dem Stack zu instanzieren? Das klingt leicht kriminell...
Nein, eine ganz normale C++ Klasse.
Zur dunklen Seite bin ich nicht übergetreten, auch wenn es garantiert ohne weiteres möglich ist, aus C++ heraus ein Java-Objekt zu instanzieren (frag mich nur nicht wie, ich werds bald herausfinden).
Falls du dir nicht sicher bist, ob die Funktionen referenziert werden, lass gjc und ld mal Testweise mit -flto laufen.
Wenn du in der Binary das Dingen dann noch immer findest, übersiehst du nur die Referenz
Danke für den Tipp, das Symbol ist immer noch drin
Aber es werden mit einem "objump -D main.o | grep Z41 -B10" nur die Funktion selbst und eine andere, die "_GLOBAL__sub_I_screen" (die vermutlich den Konstruktor von Console für "Console screen" aufruft), ausgegeben
Die funktionen referenzieren sich also nur gegenseitig, also muss eine davon manuell aufgerufen werden.
Ich habe aber keine Ahnung, warum die beiden dann beim Linken nicht rausgekürzt werden.
"start_ctors" und "end_ctors" haben auch immer die exakt gleiche Adresse im kernel.
Außer einer neuen Funktion, "__gnu_lto_v1" bewirkt der Parameter "-flto" irgendwie nix.
Evtl. hilft die ja der zweite treffer von Google weiter: g++ __static_initialization_and_destruction_0(int, int) - what is it
Dadrin ist mir sofort das folgene ins Auge gesprungen:
g++ does have a -fno-use-cxa-atexit command line option but I don't think that'll help. It looks like it just causes atexit() to be used instead of cxa_atexit(). Perhaps the better question to ask is why g++ generates __static_initialization_and_destruction_0() to begin with instead of placing constructor and destructor calls in the .ctors and .dtors ELF sections. Presumably there's a good reason for it.
Auf Deutsch: Anscheinend bringt -fno-use-cxa-atexit nix mehr, denn g++ hat aus einem wahrscheinlich "guten Grund" darauf verzichtet, die Sections .ctors und .dtors zu verwenden.
Was jetzt?
Ich denke ich muss die __static_initialization_and_destruction_0(int, int) Manuell aufrufen, aber
1. Mit welchen Parametern?
2. Das Symbol heißt dann doch in jeder Objekt-Datei mit statischen/globalen C++-Variablen gleich, das gibt doch Kollisionen!
Das einzige (halbwegs brauchbare) im Netz was ich sonst noch so gefunden habe, ist
http://gcc.gnu.org/ml/gcc/2003-11/msg01211.html,
aber in dem Thread gehts nur um eine
fehlende Funktion.
Ich bin mit meinem Latein am Ende..
Soll ich es mal mit einer älteren gcc-Version ausprobieren?
Ich hab noch die 4.5.1 (opensuse 11.4) auf meinem Server.