Zusammenspiel FPC-GCC unter ARM

Zusammenspiel FPC-GCC unter ARM

Beitragvon ToThol » 14. Jan 2014, 23:25 Zusammenspiel FPC-GCC unter ARM

Hallo zusammen!

Ich beginne gerade, mich auf der Raspberry-Plattform (ARM) umzutun und versuche mich im Zusammenspiel von gcc und fpc. Dabei bleibe ich schon am Anfang mit einer (Linker-)Meldung "undefined reference to `__aeabi_idivmod'" hängen (FPC-Programm ruft C-Object, in dem ein '%' ausgeführt wird). Wenn ich das laienhaft verstehe, bindet FPC das EABI nicht richtig ein?!?
Welchen Fehler mache ich, kann mir jemand einen Hinweis geben (Beispiel anbei)?
Code: Alles auswählen
extern int cfun(int i,int j);
int cfun2(int i, int j) {
   return i % j; // ohne '%'-Operator klappt's...
}
Code: Alles auswählen
unit pfun;
{$link cfun.o}
interface
function cfun(par1,par2: Integer): Integer;   cdecl; external;
implementation
end.
Code: Alles auswählen
program main;
uses pfun;
begin
   writeln('cfun(41,3) -> ', cfun(41,3));
end.
Code: Alles auswählen
gcc -c cfun.c -o cfun.o
fpc pfun.pas
fpc main.pas
Liefert:
Target OS: Linux for ARMHF
Compiling main.pas
Assembling main
Linking main
/usr/bin/ld: warning: link.res contains output sections; did you forget -T?
cfun.o: In function `cfun':
cfun.c:(.text+0x20): undefined reference to `__aeabi_idivmod'
main.pas(4,26) Error: Error while linking
main.pas(4,26) Fatal: There were 1 errors compiling module, stopping
Fatal: Compilation aborted[/code]

Danke
Grüße von ToThol
ToThol
 
Beiträge: 3
Registriert: 14. Jan 2014, 22:32

Beitragvon Socke » 15. Jan 2014, 11:25 Re: Zusammenspiel FPC-GCC unter ARM

Ggf. solltest du dem GCC ebenfalls mitteilen, dass du für ARMHF übersetzt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Socke
Lazarusforum e. V.
 
Beiträge: 2683
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon mschnell » 15. Jan 2014, 12:04 Re: Zusammenspiel FPC-GCC unter ARM

ToThol hat geschrieben:(FPC-Programm ruft C-Object, in dem ein '%' ausgeführt wird).


1) Was heißt "ein '%' ausgeführt" ? Wenn modulo nicht klappt, werden auch andere Library-Funktionen nicht gehen.
Die Fehlermeldung deutet an, dass der Linker die C-Library (vermutlich eine *.a - Datei), die die Modulo-Funktion ( __aeabi_idivmod ) enthält, nicht kennt. Die notwendigen C-Libraries musst Du beim Kompilieren/Linken im Library Suchpfad angeben.

2) Was genau meinst Du mit "C-Objekt" ?

In C gibt es keine Objekte. Die gibt es nur in C++.

Und C++ "Units" kann man nicht mit fpc zusammen-linken, weil die Objekt-Strukturen nicht kompatibel sind.
Wenn C++ Objekte mit fpc verwenden will, muss man denen zunächst (in der C-Quelle) ein "flaches" (also "C" statt "C++") Interface geben und dieses dann von den fpc-Units aufrufen.

-Michael
Zuletzt geändert von mschnell am 15. Jan 2014, 14:22, insgesamt 4-mal geändert.
mschnell
 
Beiträge: 3394
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

Beitragvon Scotty » 15. Jan 2014, 13:37 Re: Zusammenspiel FPC-GCC unter ARM

Ich kannte die Möglichkeit für {$link cfun.o} bisher noch nicht und habe das gestern Abend ausprobiert. Auf dem x86_64 klappt es nur dann, wenn ich die Funktion identisch zum export benenne, also "int cfun(int i, int j)". Dann kommt 41 mod 3 = 2 raus (% ist mod). Es war gestern etwas zu spät, um gcc zum Crosskompilieren zu bewegen (ich habe bei mir einen fpc-Crosskompiler laufen), aber wieso sollte es nicht klappen? Vielleicht liegt wegen falschem ABI oder der Version? Für mein Sheeva benutze ich (ppcrossarm) "-Xd -Fd -Fl/libarm -CaEABI -CfSOFT -CpARMV5". Vielleicht hilft dir die Überlegung.
Scotty
 
Beiträge: 770
Registriert: 4. Mai 2009, 12:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4 | 
CPU-Target: x86_64-linux-qt/gtk2
Nach oben

Beitragvon ToThol » 15. Jan 2014, 23:20 Re: Zusammenspiel FPC-GCC unter ARM

Socke hat geschrieben:Ggf. solltest du dem GCC ebenfalls mitteilen, dass du für ARMHF übersetzt.
gcc auf dem Raspberry sollte eigentlich für ARMHF übersetzen?!? 'readelf -h *.o' vermeldet "übereinstimmung".
mschnell hat geschrieben:2) Was genau meinst Du mit "C-Objekt" ?
Sorry, ich war unpräzise. Du hast recht, ich meinte: "FPC ruft C-Funktion auf". Und der //-Kommentar mit % war nur der Hinweis, dass das Problem erst dann auftritt, wenn der Linker (low-level-)Funktionen einbinden will...
Scotty hat geschrieben:Für mein Sheeva benutze ich (ppcrossarm) "-Xd -Fd -Fl/libarm -CaEABI -CfSOFT -CpARMV5". Vielleicht hilft dir die Überlegung.
Hilft leider nicht (bislang nicht, kann aber auch an dem Überlegenden liegen...)
Grüße von ToThol
ToThol
 
Beiträge: 3
Registriert: 14. Jan 2014, 22:32

Beitragvon ToThol » 25. Jan 2014, 08:57 Re: Zusammenspiel FPC-GCC unter ARM

Danke für die Infos, mit
Code: Alles auswählen
unit pfun;
{$link cfun.o}
{$linklib GL}
interface
function cfun(par1,par2: Integer): Integer;   cdecl; external;
implementation
end.
klappt es...
Grüße von ToThol
ToThol
 
Beiträge: 3
Registriert: 14. Jan 2014, 22:32

• Themenende •

Zurück zu Linux



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried