amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Portierung Unix->AmigaOS [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

23.07.2002, 20:07 Uhr

p-OS
Posts: 131
Nutzer
Hallo,

ich versuche momentan , ein Programm von Unix nach AmigaOS zu portieren.
Das ganze wurde in (ANSI) C geschrieben. Ich verwende vbcc. Nachdem ich bisher noch nix mit C gemacht hab, und auch mit Portierung noch keine Erfahrung hab, werd ich wohl den einen oder anderen Tip gut gebrauchen können.

Das erste Problem:
Ich linke das Programm mit libpth.a, libpthread.a, (link libraries aus dem geek gadgets project), ixemul.lib und amiga.lib. Beim linken bekomm ich folgende Meldung:

Problem 1:
error21: libpth.a (pth_string.o) (.text+x5e2): Undefined reference to ___umoddi3 (3 mal Unterstrich am Anfang).
In der ixemul.lib gibt es eine Funktion __umoddi3 (2 mal Unterstrich). Wie kann ich dafür sorgen, daß alle Aufrufe von ___umoddi3 auf __umoddi3 umgeleitet werden ? Ich kann ja schlecht den Aufruf in der libpthread.a umbenenen, ist ja schließlcih schon kompiliert; vielleicht durch eine selbstdefinierte Referenz in einer der Programmteile, die mit den libs gelinkt werden ?

Problem 2:
Ebenso fehlen references für _regcomp,_regexec,_regerror. In den ixemul include files (regex.h) tauchen diese auch auf, also bin ich davon ausgegangen, daß diese in der ixemul.lib auch enthalten sind. Ist aber offensichtlich nicht so, sonst hätte der linker ja nicht gemeckert.
Gibt es irgendwo (wo genau ?) eine Protierung der Posix regex.lib ? Im Aminet hab ich die regex.library entdeckt, eine shared library, die scheinbar exakt die gleichen Aufrufe beinhaltet. Obwohl ich deren Includes in meinen C-Files eingebunden hab, meldet der Linker weiterhin unknown references ? Code um Öffnen der shared library hab ich zwar noch keinen eingefügt, aber das kann dem Linker doch egal sein, oder ?



Bei dem Programm, das ich zu portieren versuche, handelt es sich um Lemick Basic, einen okjektorientierten Basic-Compiler samt VirtualMachine.


[ - Antworten - Zitieren - Direktlink - ]

24.07.2002, 08:54 Uhr

AchimStegemann
Posts: 112
Nutzer
Hi!

Zuerst mal dein Problem mit der umoddi3-Funktion.

Ich selbst kenne die libp.... libs nicht, daher weiß ich nicht, in welcher Form die obige Funktion vorliegt. Es gibt aber generell eine Möglichkeit, dem Linker ein Schnippchen zu schlagen, wenn Funktionen im Linker nicht gefunden werden können. Allerdings gege ich keine Garantie dafür, dass dann das Programm auch ordnungsgemäß läuft.

Allen Funktionen in C wird intern ein Untenstrich vorangestellt. Damit der Linker die ___umoddi3-Funktion (3x) finden kann, musst du im Hauptprogramm eben diese Funktion selbst definieren. Da ich die Parameter nicht kenne, hier nur ein mögliches Beispiel:

long __umoddi3(long parameter) // 2x Untenstrich !!
{
return _umoddi3(parameter); // 1x Untenstrich !!
}

Wichtig ist, dass bei der Funktionsdefinition bzw. dem Aufruf ein Untenstrich weniger angegeben wird, als der Linker anzeigt (aus oben genannten Grund).

Probiers aus. Mehr wie schiefgehen kanns nicht.

Zur regex.lib:
Im Aminet habe ich diese Lib noch nicht gesehen, auch bei GeekGadgets nicht. Das Problem ist, dass nicht jede Lib aus dem Unix-Bereich auf dem Amiga lauffähig ist bzw für den Amiga schon portiert wurde. Aufgrund der unterschiedlichen OS-Architketuren kann mal viele Libs nicht einfach 1:1 für den Amiga portieren, sondern muss etliche Anpassungen durchführen.

Im Zweifelsfall musst du die regex.lib selbst portieren... viel Spaß dabei!!


Gruß
Achim

[ - Antworten - Zitieren - Direktlink - ]

31.07.2002, 16:45 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von p-OS:
Problem 1:
error21: libpth.a (pth_string.o) (.text+x5e2): Undefined reference to ___umoddi3 (3 mal Unterstrich am Anfang).
In der ixemul.lib gibt es eine Funktion __umoddi3 (2 mal Unterstrich). Wie kann ich dafür sorgen, daß alle Aufrufe von ___umoddi3 auf __umoddi3 umgeleitet werden ?

Das kann u.U. daran liegen, dass die Funktion in einer Header-Datei als Macro definiert ist, die die andere Funktion aufruft. In dem Fall ist es nicht ratsam, eine direkte Umleitung von Hand zu machen. Besser ist es dann, die zustande Header-Datei zu finden und mit einzubinden.
Zitat:
Problem 2:
Ebenso fehlen references für _regcomp,_regexec,_regerror. In den ixemul include files (regex.h) tauchen diese auch auf, also bin ich davon ausgegangen, daß diese in der ixemul.lib auch enthalten sind.

Die ixemul-Umgebung besteht aus mehr als nur der ixemul.lib. Wenn die Header fuer regexp existieren, sollte auch eine entsprechende Portierung der Bibliothek bei dem geek gadgets project existieren. Einbinden musst Du sie natuerlich trotzdem beim Uebersetzen.
Zitat:
Im Aminet hab ich die regex.library entdeckt, eine shared library, die scheinbar exakt die gleichen Aufrufe beinhaltet. Obwohl ich deren Includes in meinen C-Files eingebunden hab, meldet der Linker weiterhin unknown references ? Code um Öffnen der shared library hab ich zwar noch keinen eingefügt, aber das kann dem Linker doch egal sein, oder ?
Shared libraries auf dem Amiga sind etwas voellig anderes, als link libraries. Diese funktionieren nur wenn
a) gegen eine link library mit den Aufrufen der Shared library gelinkt wird, oder
b) ein Header-Files mit Inline-Assembler Anweisungen eingebunden wird. Diese muessen in einer angepassten Version fuer den verwendeten Compiler vorliegen.

mfg
--

Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

03.08.2002, 23:32 Uhr

p-OS
Posts: 131
Nutzer
Hallo,

erstmal danke für eure Hinweise.

@Achim:

1. umoddi/udivdi: Dein Vorschlag hat funktioniert.


@Holger:

1. Du hast recht, ixemul besteht tatsächlich aus mehr als der ixemul.lib. Hab halt einfach die im Paket von vbcc enthaltene lib automatisch mitgelinkt, indem ich dem Compiler Frontend die +ixemul option mitgegeben habe. Jetzt hab ich mir mal das ixemul-sdk von GeekGadgets runtergeladen und die entsprechende lib mit gekinkt. Dachte halt bisher, daß alle Funktionen eh in der ixemul.library enthalten wären, ist aber wohl nciht so, sondern manche halt nur in Form einer link lib.
Auf alle Fälle werden jetzt alle Funktionen gefunden und ich kann vollständig kompilieren.

2. die Funktionen für die regular expressions werden nicht in einer der libs refrenziert, sondern in den vorhandenen C Quellcodes verwendet.
Daher sollte ein Anpassen durch Verwendung einer API-kompatiblen shared library grundsätzlich kein Problem sein. Vorerst hab ich den entsprechenden Code allerdings auskommentiert, so daß halt die entsprechenden Basic-Befehle , die das verwenden, vom Interpreter einfach ignoriert werden sollten.



Auch wenn ich jetzt ein lauffähiges Kompilat habe, so bekomme ich noch zur Laufzeit Probleme:
Der Parser scheint in einer Endlosschleife gefangen zu sein. Hab mit Bison und Fex Parser und Lexer neu generiert. Trotzdem noch dasselbe Problem. Evtl. liegt's an den nicht von mir verwendeten Optionen. Der ursprüngliche Autor hat mir empfohlen, dies nochmal für meine Plattform zu tun. Allerdings hat der das original YACC verwendet mit den Optionen -Cfa . Fragt sich halt, was genau die bedeuten und was ich dann bei Bison als Optionen verwenden muß ??

Ciao, Jean

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Portierung Unix->AmigaOS [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.