FreePascal und uClibc

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
DD50
Beiträge: 27
Registriert: Do 13. Sep 2012, 12:48

FreePascal und uClibc

Beitrag von DD50 »

Hi,
ich müsste gegen die uClibc ( http://www.uclibc.org/" onclick="window.open(this.href);return false; ) linken. Kann FreePascal das? Wenn ja wie? Da ich noch "neu" in der sache bin, blicke ich da noch so richtig durch. Also einen switch habe ich nicht gefunden. Und google schmeisst auch nix vernünftiges raus.

Im moment gehe ich hin und linke alle lib ins programm. Daruch wird es natürlich mehr als doppelt so gross.

Vielen dank im voraus

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: FreePascal und uClibc

Beitrag von corpsman »

Also wenn ich dich Richtig verstehe funktionierts bei dir schon, und du bindest alles in etwa ein wie

Code: Alles auswählen

procedure Showm(Value: PChar); external{$IFDEF Win32} 'libdemo.dll'{$ELSE} 'libdemo.so'{$ENDIF}; {cdecl; -- Mus zum einbinden von C Libs rein !!}
Wenn dem so ist, dann hilft dir das Dynamische Linken, da kannst du nur die dazu linken die du brauchst.

Code: Alles auswählen

Uses
  dynlibs;
 
type
  TShowm = procedure(Value: PChar);
var
  tmpString: string; 
  lib: TLibHandle = 0;
  Showm: TShowm = nil;
..
 
 
initialization
  tmpString := IncludeTrailingBackslash(ExtractFilePath(Paramstr(0))) + {$IFDEF Win32} 'libdemo.dll'{$ELSE} 'libdemo.so'{$ENDIF};
  lib := LoadLibrary(tmpString);
  if lib = 0 then
    raise exception.create('Error could not init Library');
  Showm := TShowm(GetProcAddress(lib, 'Showm'));
  if not assigned(Showm) then
    raise exception.create('Error could not load Method in Library');
 
finalization
 
  if Lib <> 0 then
    UnloadLibrary(lib);
{$ENDIF}
--
Just try it

DD50
Beiträge: 27
Registriert: Do 13. Sep 2012, 12:48

Re: FreePascal und uClibc

Beitrag von DD50 »

Erstmal danke für diene mühe. Aber das meine ich nicht. Ich schreibe etwas, das auf einem Zielsystem läuft, wo es nur die uclibc gibt. Ich möchte aus platzgründen nicht alle libs einlinken, so wie ich es im moment mache. Und dynamisch linken geht nicht, weil es die grosse lib nicht auf dem zielsystem gibt.

Es ging mir nun erstmal darum ob ich mein programm dort überhaupt ans laufen bekomme. Im moment klappt das halt nur wenn ich Statisch linke. Deswegen die frage, ob freepascal auch gegen die uclibc linken kann. Oder ob es eine andere möglickeit gibt die uclibc zu nehmen.

Ich habe schon versucht fpc auf einem Buildroot mit uclibc zu erstellen. Bin aber kläglich gescheitert.

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

Re: FreePascal und uClibc

Beitrag von theo »

Was willst du erreichen?
Auf welchem System gibt es keine libc.so bzw. glibc.so?
Warum willst du die direkt anzapfen?
Wozu uClibc? Ist eine libuclibc.so auf dem Zielsystem vorhanden?
Was ist falsch an Corpsman's Vorschlag?

DD50
Beiträge: 27
Registriert: Do 13. Sep 2012, 12:48

Re: FreePascal und uClibc

Beitrag von DD50 »

theo hat geschrieben:1: Was willst du erreichen?
2: Auf welchem System gibt es keine libc.so bzw. glibc.so?
3: Warum willst du die direkt anzapfen?
4: Wozu uClibc?
5: Eine libuclibc.so auf dem Zielsystem vorhanden?
6: Was ist falsch an Corpsman's Vorschlag?
Hi, ich habs mal durchnummeriert. Dann ist das antworten einfacher.

1. Ein kleines programm schreiben.
2. Router (libc.so -> libuClibc-0.9.28.so)
3. Keine ahnung, macht wohl pascal. Aber welche unit das macht weiss ich nicht.
4. Damit ist die RouterSoft gebaut
5. Nein.
6. Ist Dynamisch so wie ich das verstanden habe. Da die libs nicht da sind wird es nicht gehen.

Hier noch die ldd ausgabe:
linux-gate.so.1 => (0xb77cc000)
libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb77a8000)
libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb77a4000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7648000)
/lib/ld-linux.so.2 (0xb77cd000)

Oder könnte man vielleicht in dem Buildroot nur linken? Wenn ja wie?

Gruss

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

Re: FreePascal und uClibc

Beitrag von theo »

5 und 2 widersprechen sich imho. Die libuClibc-0.9.28.so ist also doch da. Dann kannst du auch dynamisch linken.
Für so ein Zeug würde ich die FPC Entwickler fragen: http://lists.freepascal.org/mailman/listinfo/fpc-devel/" onclick="window.open(this.href);return false;

DD50
Beiträge: 27
Registriert: Do 13. Sep 2012, 12:48

Re: FreePascal und uClibc

Beitrag von DD50 »

Ich habe nun Free Pascal in einer Buildroot umgebung laufen. Nun linkt er "richtig". Problem ist aber das ich ein Segmentation fault bekomme. Hat jemand ne idee??? Muss ich bei fpc noch einen bestimmten parameter übergeben?

Danke im voraus

:~# ldd test1
libpthread.so.0 => /lib/libpthread.so.0 (0xb77d0000)
libdl.so.0 => /lib/libdl.so.0 (0xb77cd000)
libc.so.0 => /lib/libc.so.0 (0xb7783000)
ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0xb77e6000)

Code: Alles auswählen

program test1;
 
{$mode objfpc}{$H+}
{$DEFINE UseCThreads}
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes,Crt
  { you can add units after this };
 
begin
  WriteLn('Test');
end.

DD50
Beiträge: 27
Registriert: Do 13. Sep 2012, 12:48

Re: FreePascal und uClibc

Beitrag von DD50 »

Um das thema abzuschliessen (hätte ich fast vergessen). Ich hatte eine lib vergessen. Das muss wie folgt aussehen.....

Code: Alles auswählen

# ldd test1
	libpthread.so.0 => /lib/libpthread.so.0 (0xb7736000)
	libdl.so.0 => /lib/libdl.so.0 (0xb7732000)
	libc.so.0 => /lib/libc.so.0 (0xb76fe000)
	librpc.so.0 => /lib/librpc.so.0 (0xb76ee000)
	ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0xb774a000)

Antworten