Crosslinking i386-win32 zu arm-linux
-
- Lazarusforum e. V.
- Beiträge: 3158
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Crosslinking i386-win32 zu arm-linux
Hallo zusammen,
Bisher habe ich einen funktionsfähigen Cross-Compiler um von meinem Windows-Rechner für den Raspberry Pi zu complieren. Die damit erstellten einfachen Programme (keine externen Bibliotheken) laufen einwandfrei. Jetzt möchte ich aber Threads benutzen und dazu ist die Bibliothek pthreads notwendig.
Wenn ich die fertige Programmdatei auf dem Raspberry Pi ausführe erhalte ich nur die Ausgabe "Speicherzugriffsverletzung" (keine Free Pascal Exception). Diese Meldung tritt nur auf, wenn ein TThread erzeugt wird; andernfalls läuft das Programm durch. Laut gdb tritt sie in einer externen Bibltiothek auf. Frage: Warum? Wie kann ich lauffähige Programme erzeugen?
Meine zusätzlichen Einstellungen für den Compiler sind -Xr/usr/lib sowie -Fl<Library-Path>. Die angeforderten Bibliotheken habe ich in das entsprechende Verzeichnis auf meinem Windows-Rechner kopiert. In mehreren Fällen wurden Bibltiotheken unter /usr/lib/arm-linux-gnueabihf/ gesucht, die unter Windows nicht gefunden werden konnten. Daraufhin habe ich die entsprechenden .so-Dateien angepasst, in denen die gesuchten Bibliotheken referenziert wurden (einfache Textdateien) und den Dateipfad gelöscht.
Schlussendlich wird eine Programmdatei erzeugt; vom Linker erhalte ich keine weiteren Informationen. Trotzdem funktioniert die Programmdatei nicht.
Mir bekannte Anleitungen/Artikel:
Bisher habe ich einen funktionsfähigen Cross-Compiler um von meinem Windows-Rechner für den Raspberry Pi zu complieren. Die damit erstellten einfachen Programme (keine externen Bibliotheken) laufen einwandfrei. Jetzt möchte ich aber Threads benutzen und dazu ist die Bibliothek pthreads notwendig.
Wenn ich die fertige Programmdatei auf dem Raspberry Pi ausführe erhalte ich nur die Ausgabe "Speicherzugriffsverletzung" (keine Free Pascal Exception). Diese Meldung tritt nur auf, wenn ein TThread erzeugt wird; andernfalls läuft das Programm durch. Laut gdb tritt sie in einer externen Bibltiothek auf. Frage: Warum? Wie kann ich lauffähige Programme erzeugen?
Meine zusätzlichen Einstellungen für den Compiler sind -Xr/usr/lib sowie -Fl<Library-Path>. Die angeforderten Bibliotheken habe ich in das entsprechende Verzeichnis auf meinem Windows-Rechner kopiert. In mehreren Fällen wurden Bibltiotheken unter /usr/lib/arm-linux-gnueabihf/ gesucht, die unter Windows nicht gefunden werden konnten. Daraufhin habe ich die entsprechenden .so-Dateien angepasst, in denen die gesuchten Bibliotheken referenziert wurden (einfache Textdateien) und den Dateipfad gelöscht.
Schlussendlich wird eine Programmdatei erzeugt; vom Linker erhalte ich keine weiteren Informationen. Trotzdem funktioniert die Programmdatei nicht.
Mir bekannte Anleitungen/Artikel:
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Crosslinking i386-win32 zu arm-linux
Socke hat geschrieben: Daraufhin habe ich die entsprechenden .so-Dateien angepasst, in denen die gesuchten Bibliotheken referenziert wurden (einfache Textdateien) und den Dateipfad gelöscht.
.so-Dateien sind doch keine Textdateien, sondern da steht ausführbarer Code drin, der natürlich auf die Ziel CPU passen muss ?!?!?!?!?
Welche .so-Dateien ?
Wie kann man .so" Dateien "anpassen" ?
(P.S.: ich käme nicht auf die Idee unter Windows Linux-Programme cross-zu-kompilieren. Aber eigentlich sollte das gehen )
-Michael
-
- Beiträge: 768
- Registriert: Mo 4. Mai 2009, 13:24
- OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
- CPU-Target: x86_64-linux-qt/gtk2
- Kontaktdaten:
Re: Crosslinking i386-win32 zu arm-linux
Hast du cthreads als erste Unit eingebunden?
http://wiki.lazarus.freepascal.org/Mult ... pplication
http://wiki.lazarus.freepascal.org/Mult ... pplication
-
- Lazarusforum e. V.
- Beiträge: 3158
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Crosslinking i386-win32 zu arm-linux
mschnell hat geschrieben:.so-Dateien sind doch keine Textdateien, sondern da steht ausführbarer Code drin, der natürlich auf die Ziel CPU passen muss ?!?!?!?!?
Welche .so-Dateien ?
Wie kann man .so" Dateien "anpassen" ?
Hatte ich auch erst gedacht. Dann habe ich mich gefragt: Woher nimmt der Linker den Linux-Dateipfad? Und siehe da: zwei Textdateien mit der Endung .so. Genauen Inhalt gibt's später.
Edit: Beispiel aus einer virtuellen Maschine mangels Zugriff auf den Raspberry. Datei: /usr/lib/i386-linux-gnu/libpthread.so
Code: Alles auswählen
/* GNU ld script
Use the shared library, but some functions are only in
the static library, so try that secondarily. */
OUTPUT_FORMAT(elf32-i386)
GROUP ( /lib/i386-linux-gnu/libpthread.so.0 /usr/lib/i386-linux-gnu/libpthread_nonshared.a )
Scotty hat geschrieben:Hast du cthreads als erste Unit eingebunden?
Ich hoffe für mich jetzt einfach: Ja. Ich habe nicht pthreads sondern cthreads eingebunden. Werde das aber überprüfen. Edit: Normalerweise gibt es bei Fehlen von cthreads die Meldung, dass kein Thread-Manager vorhanden sei?!
Nebenbei: Gibt es Literatur, warum cmem auf "einigen Systemen" schneller als der Standard-Memory-Manager ist?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 768
- Registriert: Mo 4. Mai 2009, 13:24
- OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
- CPU-Target: x86_64-linux-qt/gtk2
- Kontaktdaten:
Re: Crosslinking i386-win32 zu arm-linux
Socke hat geschrieben:Normalerweise gibt es bei Fehlen von cthreads die Meldung, dass kein Thread-Manager vorhanden sei?!
Eben nicht. Ich kommentiere cthreads aus und bekomme keine Fehlermeldung.
Code: Alles auswählen
program Project1;
uses
Classes;
type
TTest=class(TThread)
procedure Execute;
end;
procedure TTest.Execute;
begin
writeln('Hello World');
end;
begin
with TThread.Create(true) do
Start;
end.
Code: Alles auswählen
./project1
An unhandled exception occurred at $00000000004325E4 :
EThread : Semaphore init failed (possibly too many concurrent threads)
$00000000004325E4
$0000000000400225 line 20 of project1.lpr
Mit "uses cthreads, classes" geht es (auch wenn das writeln ziemlich sinnfrei ist).
Re: Crosslinking i386-win32 zu arm-linux
Ich würde Marco van de Voort fragen. Der schaut hier zwar manchmal auch rein, aber auf der Mailing List ist er wohl eher erreichbar:
http://lists.freepascal.org/mailman/listinfo/fpc-devel
http://lists.freepascal.org/mailman/listinfo/fpc-devel
-
- Lazarusforum e. V.
- Beiträge: 3158
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Crosslinking i386-win32 zu arm-linux
Scotty hat geschrieben:Eben nicht. Ich kommentiere cthreads aus und bekomme keine Fehlermeldung.
Wobei du hier eine Exception erhältst. Das ist bei mir nicht der Fall:
Code: Alles auswählen
pi@raspberrypi /tmp $ ./project1
Speicherzugriffsfehler
Im gdb erhalte ich die folgende Ausgabe:
Code: Alles auswählen
Reading symbols from /tmp/project1...done.
(gdb) run
Starting program: /tmp/project1
Program received signal SIGSEGV, Segmentation fault.
0xb6fdb2d4 in ?? () from /lib/ld-linux.so.3
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein