Autor Thema: Kernel mit GCJ  (Gelesen 12134 mal)

Vogtinator

  • Beiträge: 24
    • Profil anzeigen
Gespeichert
« Antwort #20 am: 13. September 2012, 12:06 »
Öhm, was? CVS braucht für jede einzelne Aktion Netzwerkzugriff, das ist lahm und behindert mich beim Arbeiten. Was den ersten Checkout angeht, hat MNemo über die Datenmenge ja schon was gesagt, aber ehrlichgesagt kommt mir da in den meisten Fällen git trotzdem sogar schneller vor.
Ist ja auch völlig egal was schneller ist, solange es funktioniert und man alte Versionen zurückspielen kann, ist alles in Ordnung.

Zitat
Ich schätze, es ist kein besonders verbreitetes Hobby, Java-Standardbibliotheken zu schreiben... ;)
Zum Glück, sonst gäb es ja tausende SDKs für jede noch so unwichtige Sache..

Zitat
Die Warnung kommt in deinem ursprünglichen Code mit dem manuell gemangelten Namen nicht (weil der Compiler dann halt nicht blickt, was du vorhast), aber wenn du Init::write_char schreiben willst, dann brauchst du auch das extern "Java" und dann kommt die Meldung.
$ gcj --version
gcj (GCC) 4.6.3 20120306 (Red Hat 4.6.3-2)

Die Definition habe ich so in gcj/javaprims.h gefunden. Wenn __java_char bei dir nicht tut, kannst du ja mal schauen, was da bei dir steht.
Den Header habe ich jetzt einfach mal inkludiert (er verweist zum Glück nicht auf andere Header :roll: ).
Da steht nämlich so in etwa:
extern "Java" {
typedef __java_char jchar;
}
An dem "extern 'Java'" (ich kann es jetzt schon nicht mehr hören  :x) scheint es wohl gelegen zu haben.
Auf jeden Fall sieht der Code jetzt schon mal viel schöner aus, so komplett ohne manuelles Mangling  :-)
Dann kommt wohl als nächster Schritt, Umwandlungsfunktionen zu basteln.
Einfach nur casten ist zu unsauber (aber funktioniert  :-D )

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 13. September 2012, 12:13 »
Da steht nämlich so in etwa:
extern "Java" {
typedef __java_char jchar;
}
An dem "extern 'Java'" (ich kann es jetzt schon nicht mehr hören  :x) scheint es wohl gelegen zu haben.
Das stand aber ziemlich genau exakt so auch in meinem Patch. Hast du dir nur einzelne Zeilen rausgepickt?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Vogtinator

  • Beiträge: 24
    • Profil anzeigen
Gespeichert
« Antwort #22 am: 13. September 2012, 12:19 »
Das stand aber ziemlich genau exakt so auch in meinem Patch. Hast du dir nur einzelne Zeilen rausgepickt?

Stimmt  :oops:
Da war ich entweder zu blind oder zu blöd  :roll:

Vogtinator

  • Beiträge: 24
    • Profil anzeigen
Gespeichert
« Antwort #23 am: 13. September 2012, 22:48 »
Ich bin jetzt schon einmal weiter gekommen, Init.java kann ich schon instanzieren und eine private Methode aufrufen.

Allerdings habe ich jetzt das Problem, dass z.B.
Console screen;nicht funktioniert. Der Konstruktor wird wahrscheinlich nicht aufgerufen.
Console* screen;

void foo() { screen = new Console(); }
funktioniert aber einwandfrei.

Mit ld --print-map und zahlreichen nm foo.o Aufrufen habe ich rausgefunden, dass es keine Section .ctors oder .dtors gibt!
Stattdessen erscheint immer, wenn ich eine solche benötige, eine Funktion "_Z41__static_initialization_and_destruction_0ii" bzw. "__static_initialization_and_destruction_0(int, int)".
Anscheinend wird diese nicht richtig gelinkt oder sonst irgendetwas anderes, das ich mir nicht erklären kann.
Sowohl mein eigenes Linkerscript als auch das von http://www.lowlevel.eu/wiki/C%2B%2B-Kernel_mit_GRUB funktionieren nicht.
Hat jemand eine Ahnung, woran das liegen könnte?
Version von ld ist: 2.22 (openSUSE 12.2).
GCC: 4.7.1 (ebenfalls openSUSE 12.2)

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 14. September 2012, 10:21 »
Wart mal, versuchst du hier, eine Java-Klasse aus C++-Code heraus auf dem Stack zu instanzieren? Das klingt leicht kriminell...

Ansonsten, irgendwo muss diese __static_initialization_and_destruction_0() ja referenziert werden?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #25 am: 14. September 2012, 12:46 »
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 ;)
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #26 am: 14. September 2012, 13:58 »
Wart mal, versuchst du hier, eine Java-Klasse aus C++-Code heraus auf dem Stack zu instanzieren? Das klingt leicht kriminell...
Die Symptome deuten eher nicht darauf hin. Es geht wohl eher um eine globale Instanze.

Evtl. hilft die ja der zweite treffer von Google weiter: g++ __static_initialization_and_destruction_0(int, int) - what is it
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #27 am: 14. September 2012, 14:31 »
Ja, gut, von mir aus auch globale Instanzen. Das haben normale Java-Klassen aber genausowenig. ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Vogtinator

  • Beiträge: 24
    • Profil anzeigen
Gespeichert
« Antwort #28 am: 14. September 2012, 14:36 »
Zitat
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).

Zitat
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.

Zitat
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:
Zitat
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.  :x
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.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #29 am: 14. September 2012, 15:06 »
Zitat
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.  :x
Stimmt, da war was. Aber ich bekomme bei mir jetzt .init_array und .fini_array sections. Und keine__static_initialization_and_destruction_0(int, int).

Ich nutze g++ 4.7, mit etwa "-c -O3 -flto -funsigned-bitfields -fno-stack-protector -fno-builtin -std=c++0x -fno-exceptions"
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Vogtinator

  • Beiträge: 24
    • Profil anzeigen
Gespeichert
« Antwort #30 am: 14. September 2012, 18:29 »
Zitat
Ich nutze g++ 4.7, mit etwa "-c -O3 -flto -funsigned-bitfields -fno-stack-protector -fno-builtin -std=c++0x -fno-exceptions"
Endlich gehts..
Ich weiß zwar nicht, woran das lag, aber mit deinen Parametern funktionierts endlich und ich habe eine Section .init_array, in der die static_iniirgendwas aufgerufen wird!
Hab ich einfach im Linkerscript eingesetzt und - es geht!
DANKE, DANKE, DANKE!  :-D

DesL

  • Beiträge: 23
    • Profil anzeigen
Gespeichert
« Antwort #31 am: 14. September 2012, 18:54 »
Wenn dir der Constructor eines globalen C++-Objects nicht aufgerufen wird, iterierst du vermutlich nicht durch die Constructor Liste zu begin... siehe: http://www.lowlevel.eu/wiki/C%2B%2B#globale.2Fstatische_Objekte

Kannst du den Quellcode auch mal woanders hochladen? Die RWTH-Firewall sperrt dyndns.biz oder was du da hast....

Vogtinator

  • Beiträge: 24
    • Profil anzeigen
Gespeichert
« Antwort #32 am: 14. September 2012, 19:37 »
Ja, hier, auf Dropbox:
http://dl.dropbox.com/u/105478372/gcj-kernel.zip

Zitat
Wenn dir der Constructor eines globalen C++-Objects nicht aufgerufen wird, iterierst du vermutlich nicht durch die Constructor Liste zu begin... siehe: http://www.lowlevel.eu/wiki/C%2B%2B#globale.2Fstatische_Objekte
Doch, tu ich.
Funktioniert ja.

Zitat
Die RWTH-Firewall sperrt dyndns.biz oder was du da hast....
Kenne ich irgendwoher, unsere Firewall in der Schule hatte auch dyndns gesperrt, sogar die IPs (entweder Cache oder reverse DNS).
Aber jetzt ist das anders, jetzt darf ich das Netzwerk dort (mit-) verwalten ;-)


Vogtinator

  • Beiträge: 24
    • Profil anzeigen
Gespeichert
« Antwort #33 am: 21. September 2012, 23:04 »
Strings funktionieren auch schon, kann aber noch ein bisschen dauern, bis man die auch benutzen kann.
Die ganzen Funktionen müssen ja ersteinmal implementiert werden.

 

Einloggen