MONO crosscompile mit Freetz

Leider ist mein x86 mono leider auf dem stand 4.0. Irgendwie muss man die Assemblies doch erzeugen können?

Mit mkbundle kann man auch cross-compile(n), hier ist mein Skript:
Code:
#!/bin/bash

TOOLCHAIN=  PFAD ZUR TOOLCHAIN
export PATH="$TOOLCHAIN/target/bin:$PATH" 
export PKG_CONFIG_PATH="$TOOLCHAIN/target/lib/pkgconfig"
export CFLAGS="-march=24kc -Os -pipe -Wa,--trap -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64"
export CXXFLAGS="-march=24kc -Os -pipe -Wa,--trap -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64"
export CC="mips-linux-gcc -static"
export AS="mips-linux-as -EB -O1 -no-mdebug -mabi=32 -mno-shared -call_nonpic"

mkbundle --deps $1 $TOOLCHAIN/target/usr/lib/mono/4.5/mscorlib.dll
 
Hier die Logfiles von STRACE:

Einmal:

Console.WriteLine("Hello World!");
-> Danach kehrt das Programm nicht mehr zurück und muss über eine 2te Session gekillt werden

und

TimeSpan ts = TimeSpan.FromMilliseconds(1000);
-> Hier wird eine Exception geworfen. Programm kehrt aber ordnungsgemäß in die Shell zurück.

Anhang anzeigen Archive.zip


Die Assemblies sind platformunabhängig und können auf jeder beliebigen Platform erstellt werden und auch zwischen den Platformen kopiert werden. Sie befinden sich nach dem Kompilieren (ohne Crosscompiler) im Ordner lib/mono
 
Das HelloWorld erzeugt einen zweiten Thread, aus welchem Grund auch immer. Dieser Thread tut nichts erkennbares, außer dass er nachher hängt. Vermutlich wartet er auf ein Signal vom ersten Thread. Der erste Thread wird beendet, weil er __fpcmp_parts_f nicht findet.

Bei dem anderen Problem mit TimeSpan bringt das strace nichts, da muss man die Stelle finden, wo das überprüft wird. Vermutlich auch ein Problem mit der Parameter Übergabe.
 
Hier der Code von HelloWorld für obiges Tracefile. Keine Ahnung warum hier ein 2ter Thread erzeugt wird....


Code:
 class Program
    {
        static void Main(string[] args)
        {

         
            Console.WriteLine("Hello World!");
                   }
    }

Seht ihr noch eine reelle Chance Mono hinzubekommen? Insbesondere die Probleme bei den Basisdatentypen?
 
Die Probleme mit den Basistypen lassen sich vermutlich relativ einfach lösen, sobald man sie erst mal alle gefunden hat. Das Problem mit TimeSpan gehört vermutlich auch dazu. Ist TimeSpan in C# geschrieben oder in C als Bestandteil von Mono? Wenn es in C# geschrieben ist, sollte sich die Parameter Konstellation in einem einfachen Testprogramm nachstellen lassen.

Was mir noch aufgefallen ist in den strace Dateien:
Code:
futex(0x7fda5a04, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, NULL, 2aaaf2c4) = -1 ENOSYS (Function not implemented)
Die man page dazu schreibt nichts von diesen Optionen. Die Frage ist, wofür ist dieser Aufruf, und ist es von Bedeutung, dass er nicht unterstützt wird?
 
Vielleicht kann neolithos das beantworten?
 
Morgen,
Ich versuche gerade die mono runtime direkt auf der box auszuführen. Leider kann er das Symbol pthread_getattr_np nicht auflösen. Scheinbar stimmt irgendwas mit uclib nicht. Wie kann man sowas mal untersuchen ldd nimmt ja leider keine Parameter an?

Auch das auswählen der neueren uclib im freetz hat nichts gebracht, da er beim Linken die clock nanosleep Funktion nicht findet. Lohnt es sich die toolchain selbst zu erstellen? Zur Zeit lädt er Sie ja nur runter?

Die Basiselemente der Runtime sind ca 20mb. Passen also locker ins Image.

Der Fehler bei dem TimeSpan wird wahrscheinlich auch etwas mit dem atomaren Befehlen zu tun haben, es gab noch einige Stellen, die seltsam aussahen.

Zur Zeit hängt ich aber an Elementaren dingen :(
 
Ich könnte die Binaries bereitstellen - sind allerdings ein paar MB? Bin mir aber nicht 100%ig sicher, ob das Kompilat korrekt ist. Wie gesagt beim Verlassen der Main Methode komm es zur Fehlermeldung mono: can't resolve symbol '__fpcmp_parts_f'

Wahrscheinlich ist irgendwas noch falsch parametrisiert...
 
Hast Du schon mal versucht, ein Freetz Makefile dafür zu erstellen?
__fpcmp_parts_f ist in der libm von Freetz enthalten, aber nicht in der von AVM. Hast Du Freetz auf der Box? Wenn nicht, sorge wenigstens dafür, dass hie Libraries da sind und vom Mono Programm verwendet werden.
 
Die Libs scheinen unterschiedlich zu sein, das scheint auch das Problem bei mir zu sein. Ich schau gerade was man da machen kann.
 
Warum fehlt die Funktion pthread_getattr_np in libpthread.a? Die sollte doch da sein?

Im profile FB 7390 ist sie vorhanden, in FB 7490 nicht?

Btw. das selbe bei clock_nanosleep?

Was soll das?
 
Zuletzt bearbeitet:
@RalfFriedl:
Danke für Deinen Hinweis! Ich habe ein original AVM Image auf meiner Box. Nachdem ich den lib Ordner auf die Box kopiert habe und die LD_Library Variable neu gesetzt hatte, ist die Fehlermeldung weg! libm alleine reichte aber nicht aus. Ich musste den kompletten lib Ordner kopieren. Bei mir der Ordner: "./freetz/packages/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/root/lib"


Ich hätte nun ein vollständiges MONO auf der Box. Jetzt muss "nur" noch das Problem mit den atomaren Datentypen gelöst werden...
 
Kann das das selbe Problem wie bei mir sein?
 
Da bin ich mir nicht sicher. So tief bin ich nicht drin im Linux Kernel... Aber ein Test ist schnell gemacht. Kopiere einfach den Lib Ordner wie beschrieben auf die Box. Anschließend auf der Box ein "export LD_LIBRARY_PATH=/var/media/ftp/lib" (Pfad anpassen) und dann nochmal testen.
 
Dann meint der Loader das er mit R_MIPS_TLS_TPREL32 0x2f nix anfangen kann.
Die uCLibc scheint nix zu enthalten?
 
Wenn Ihr hier schon im Freetz Bereich schreibt, dann macht doch auch ein Freetz Image auf die Box, dann sind die benötigten Libraries und auch der passende dynamische Linker schon mal drin.
 
Das hab ich ja, aber wenn ich das Profile 7490 auswähle erhalte ich seltsame Bibliotheken. Die sind wesentlich kleiner, wie die aus dem Profile 7390?

@edit: Der Unterschied beim loader ist immerhin 10k. Was kann man da anders machen?
 
Zuletzt bearbeitet:
bist Du schon weiter gekommen?
So wie es aussieht bist Du der Einzige, der das KnowHow dazu hat, einen Patch für Mono bereitzustellen! Jeder die C# kennt wird mir zustimmen, dass das eine tolle Bereicherung für die Box wäre... (Aus wen bei Dir Mono nicht läuft komplett auf der Box läuft, was spricht dagegen fürs Erste mit mkbundle testen?)
 
Zuletzt bearbeitet:
Es ist aufwendig, da ich nicht direkt zwischen Linux und Box kopiere, sondern immer einen kleinen Umweg gehen muss. Des weiteren muss ich ja jedes mal das Bundle erstellen. So ein Durchlauf braucht dann schon mal 1 bis 3 min. Das nervt ein bisschen.

Ich hab mal gesucht, ob man einfach die ld-uClibc austauschen kann, aber es mangelt ein wenig an Suchergebnissen. Desweiteren verstehe ich nicht warum die neue Box wiederum eine ältere Bibliothek hat als der Vorgänger, und dazu finde ich irgendwie keine Links. Vielleicht hat jemand ein paar knackige Suchworte, dass ich das gute Stück nicht zum Briefbeschwerer mache.
 
Zuletzt bearbeitet:
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.