Crosslinking i386-win32 zu arm-linux

Antworten
Socke
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

Beitrag von Socke »

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:
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mschnell
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

Beitrag von mschnell »

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

Scotty
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

Beitrag von Scotty »

Hast du cthreads als erste Unit eingebunden?
http://wiki.lazarus.freepascal.org/Mult ... pplication

Socke
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

Beitrag von Socke »

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

Scotty
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

Beitrag von Scotty »

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

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Crosslinking i386-win32 zu arm-linux

Beitrag von theo »

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

Socke
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

Beitrag von Socke »

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

Antworten