Zusammenspiel FPC-GCC unter ARM

Antworten
ToThol
Beiträge: 3
Registriert: Di 14. Jan 2014, 22:32

Zusammenspiel FPC-GCC unter ARM

Beitrag von ToThol »

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

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: Zusammenspiel FPC-GCC unter ARM

Beitrag von Socke »

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

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: Zusammenspiel FPC-GCC unter ARM

Beitrag von mschnell »

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 Mi 15. Jan 2014, 14:22, insgesamt 4-mal geändert.

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: Zusammenspiel FPC-GCC unter ARM

Beitrag von Scotty »

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.

ToThol
Beiträge: 3
Registriert: Di 14. Jan 2014, 22:32

Re: Zusammenspiel FPC-GCC unter ARM

Beitrag von ToThol »

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: Di 14. Jan 2014, 22:32

Re: Zusammenspiel FPC-GCC unter ARM

Beitrag von ToThol »

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

Antworten