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
![sad :-(](https://forum.lowlevel.eu/Smileys/classic/sad.gif)
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
![huh :?](https://forum.lowlevel.eu/Smileys/classic/huh.gif)
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.
![angry :x](https://forum.lowlevel.eu/Smileys/classic/angry.gif)
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.