Library Crashes

Ihr habt ein Problem mit C++ oder anderen Sprachen ? Dann seit Ihr in diesem Forum genau richtig! Hier können alle Fragen gestellt werden, die mit Programmierung (MorphOS, Linux, BeOS, BSD,...) zu tun haben.

Moderatoren: analogkid, roschmyr

Thore
Blue Morpho
Blue Morpho
Beiträge: 2632
Registriert: 30 Jul 2006, 18:09
Wohnort: Reutlingen
Kontaktdaten:

Library Crashes

Beitragvon Thore » 25 Dez 2010, 18:47

Hallo Programmierer

Ich habe ein paar Objektdateien (.o) und möchte diese zu einer shared lib binden.
Hab aus dem SDK die Skeletton Sourcen umgeschrieben und in die Func Table die Funktionen aus den Objektdateien eingebunden.
Compilieren klappt auch, jedoch wenn ich die Lib teste crasht sie.
Das LogTool zeigt Fehler an (rot) und irgendwas mit Exception 7.

Weiß jemand was ich falsch mach?
http://www.disk-doktor.de

Benutzeravatar
geit
Seniormember
Seniormember
Beiträge: 857
Registriert: 30 Mär 2006, 12:17
Wohnort: 48477 Hörstel
Kontaktdaten:

Re: Library Crashes

Beitragvon geit » 25 Dez 2010, 19:04

Thore hat geschrieben:Hallo Programmierer

Ich habe ein paar Objektdateien (.o) und möchte diese zu einer shared lib binden.
Hab aus dem SDK die Skeletton Sourcen umgeschrieben und in die Func Table die Funktionen aus den Objektdateien eingebunden.
Compilieren klappt auch, jedoch wenn ich die Lib teste crasht sie.
Das LogTool zeigt Fehler an (rot) und irgendwas mit Exception 7.

Weiß jemand was ich falsch mach?


Ist natürlich so schwer zu sagen ohne den Quellkode zu sehen.

Meistens knallt es, wenn man vergessen hat die Libaries zu öffnen, die die Module benötigen.

Geit

Benutzeravatar
Kronos
Moderator
Moderator
Beiträge: 731
Registriert: 07 Sep 2003, 01:10
Wohnort: Hagen

Beitragvon Kronos » 25 Dez 2010, 19:40

Hab zwar noch keine eigene Lib gebaut (mmm obwohl genaugenommen ist meine PanelUhr ja eine MUI-Klasse und damit auch Library :shock: ), aber AFAIR ist vieles was man in normalen Programmen ohne viel nachdenken nutzt ein absolutes nogo in einer Library (printf()&Co galten zumindest unter 68k noch als Problem).

Also am besten stückweise rantasten. Skeletton compilieren und testen und dann immer ein bissle mehr von deinem Code einfügen....
!! Bin Wichtig !!

Thore
Blue Morpho
Blue Morpho
Beiträge: 2632
Registriert: 30 Jul 2006, 18:09
Wohnort: Reutlingen
Kontaktdaten:

Beitragvon Thore » 25 Dez 2010, 22:34

Das ist ein Versuch, eine gcc Link Lib zu einer MorphOS Shared Lib umzuwandeln.
Ich habe das .a File mit ar entpackt und die Objekte einfach in den Libheader eingelinkt (da Linklibs glaube ich nicht reentrant sind??)
Als FuncTable hab ich einfach die Funktionen genommen.

Linke ich die Lib als .a und rufe da die Funktion auf, klappts.
Rufe ich sie als Shared Lib auf, klappts nicht, dann gibts Fehler und er zeigt auf Hunks die womöglich ins leere laufen?
http://www.disk-doktor.de

Benutzeravatar
Thomas
Mitglied
Mitglied
Beiträge: 52
Registriert: 11 Sep 2003, 11:03
Kontaktdaten:

Beitragvon Thomas » 28 Dez 2010, 01:05

Als FuncTable hab ich einfach die Funktionen genommen.


So funktioniert das nicht. Eine Library unter MorphOs ist im Prinzip das gleiche, wie eine 68k-Library. D.h. die Function Table muß erstmal auf 68k-Code zeigen. Dafür gibt es eine spezielle struct EmulLibEntry, in die eine magische Konstante (TRAP_LIB) und die Adresse der Funktion eingetragen wird. Die Adresse der struct EmulLibEntry kommt dann in die Function Table.

Die Funktion, die in der struct EmulLibEntry steht, muß sich dann die Argumente aus den 68k-Registern holen.

Um deine .o-Funktionen aufrufen zu können, brauchst du also für jede Funktion eine struct EmulLibEntry und eine Stub-Funktion, die die Argumente aus den 68k-Registern holt und dann die eigentliche Funktion aufruft.

Die struct EmulLibEntry und die dazugehörigen Konstanten sind in emul/emulinterface.h beschrieben.

Gruß Thomas

Benutzeravatar
Kronos
Moderator
Moderator
Beiträge: 731
Registriert: 07 Sep 2003, 01:10
Wohnort: Hagen

Beitragvon Kronos » 28 Dez 2010, 09:37

@thomas

Das ist so nur richtig wenn die Library auch von 68k-SW genutzt werden können.

In den aktuellen Beispielen findet man zumindest nichts mehr in der Art.

Und wenn die gehen, sollte eben auch Thore library gehen (ausser natürlich er hat da noch fehlende Abhängigkeiten, uninitialisierte Variablen und sonstwas).
!! Bin Wichtig !!

Thore
Blue Morpho
Blue Morpho
Beiträge: 2632
Registriert: 30 Jul 2006, 18:09
Wohnort: Reutlingen
Kontaktdaten:

Beitragvon Thore » 28 Dez 2010, 10:44

Da fällt mir ein, ich link die Lib wie ein executable binary. Denn mit dem ld hats erst nicht geklappt. Könnte das die Ursache sein?
Oder kann man Libs auch "normal" kompilieren.
Öffnen kann er die Lib auch, nur beim Aufruf einer Funktion gibt es den Fehler.
Übrigens teste ich es gerade mit einer Funktion ohne Parameter und ohne Rückgabewert. Ein Gating von Register wär, abgesehen von der Rücksprungadresse (und der LibBase??), sowieso nicht drin.
http://www.disk-doktor.de

Benutzeravatar
Kronos
Moderator
Moderator
Beiträge: 731
Registriert: 07 Sep 2003, 01:10
Wohnort: Hagen

Beitragvon Kronos » 28 Dez 2010, 11:03

öhm wie wo was ?

Du hattest doch geschrieben das du mit dem Skeleton-Beispiel angefangen bist ? Oder wars newskeleton ?

Da bin ich doch wie selbstverständlich davon ausgegangen das zumindest das Makefile davon angepasst und weiterverwendet hättest.

Und wie gesagt, wenns nicht geht und keine Ahnung warum, alles auf 0, skeleton probieren und stückweise erweitern.

Sonst wird das nie was (weil du und wir alle nur am raten sind).
!! Bin Wichtig !!

Thore
Blue Morpho
Blue Morpho
Beiträge: 2632
Registriert: 30 Jul 2006, 18:09
Wohnort: Reutlingen
Kontaktdaten:

Beitragvon Thore » 28 Dez 2010, 15:23

> Da bin ich doch wie selbstverständlich davon ausgegangen das zumindest das Makefile davon angepasst und weiterverwendet hättest.

Ja das ging nicht weil ich erst die Link Lib eingebunden hatte und da hat ers nicht gerafft. Jetzt mit den Objekten muss ich das mal ausprobieren.
Ob Erfolg oder Misserfolg geb ich dann noch bescheid.
http://www.disk-doktor.de

Thore
Blue Morpho
Blue Morpho
Beiträge: 2632
Registriert: 30 Jul 2006, 18:09
Wohnort: Reutlingen
Kontaktdaten:

Beitragvon Thore » 28 Dez 2010, 20:12

Ich gebs langsam auf.
Die Skeletton Demos gehen, aber wenn ich meine Objekte verwenden will gehts nicht:

libfunctable.o(.data+0x4): undefined reference to `LIB_Open'
libfunctable.o(.data+0x8): undefined reference to `LIB_Close'
libfunctable.o(.data+0xc): undefined reference to `LIB_Expunge'
libfunctable.o(.data+0x10): undefined reference to `LIB_Reserved'
und einige meiner Funktionen. Andere Funktionen hingegen werden gefunden.
http://www.disk-doktor.de

Benutzeravatar
Kronos
Moderator
Moderator
Beiträge: 731
Registriert: 07 Sep 2003, 01:10
Wohnort: Hagen

Beitragvon Kronos » 28 Dez 2010, 22:05

Also die Funktionen sind in lib.c (zumindest bei newskeleton) und selbstverständlich muss du die mit einlinken, bzw durch eigene ersetzen.

Sonst wüsst die exec.library ja gar nicht wie und wo sie deine Library laden, öffnen, schliessen und bei Bedarf entfernen sollte.
!! Bin Wichtig !!

Thore
Blue Morpho
Blue Morpho
Beiträge: 2632
Registriert: 30 Jul 2006, 18:09
Wohnort: Reutlingen
Kontaktdaten:

Beitragvon Thore » 28 Dez 2010, 22:11

Natürlich link ich die mit ein, ganz dumm bin ich nicht.
Die Lib.o ist sogar das erste Objekt.
Deshalb verwunderts mich ja auch.
http://www.disk-doktor.de

Benutzeravatar
Kronos
Moderator
Moderator
Beiträge: 731
Registriert: 07 Sep 2003, 01:10
Wohnort: Hagen

Beitragvon Kronos » 28 Dez 2010, 22:14

Da du ja offentsichtlich keine nennenswerte Erfahrung mit Librarys hast würde ich dann doch vorschlagen das du erst einmal ein paar Trockenübungen machst.

Sprich skeleton-Beispiel um ein paar triviale Funktionen erweitern, kucken obs geht, obs auch noch geht wenn die Lib mehrmal geöffnet und geschlossen wird und auch wenn 2 Tasks sie gleichzeitig nutzen.

Erst wenn du da denn Überblick hast macht es Sinn sich mit grösseren Projekten zu befassen. Zumal es ja ihr wohl um fremden Code geht den du wohl auch nicht bis ins letzte Detail kennst.


Erinnert mich an meine 1ten MUI-Versuche (so um 2003) da hab ich auch erst viel rumgefuscht bis ich glaubte die Basics verstanden zu haben, und erst danach bin ich an die grossen Sachen gegangen (die 1te SteamDraw-MUI-Version). Heute weiss ich das ich damal eigentlich gar nichts wusste :roll:
!! Bin Wichtig !!

Thore
Blue Morpho
Blue Morpho
Beiträge: 2632
Registriert: 30 Jul 2006, 18:09
Wohnort: Reutlingen
Kontaktdaten:

Beitragvon Thore » 28 Dez 2010, 22:20

> Da du ja offentsichtlich keine nennenswerte Erfahrung mit Librarys

Naja so ganz stimmt das nicht. Hab auf dem 68k öfters Libs gemacht, in Assembler jedoch, und das war sehr einfach da.
Mit dem gcc hat sich die Sache wesentlich verkompliziert.

Ich denk bei meinem Versuch sinds die Abhängigkeiten in den Objekten, die brauchen Referenzen zu anderen, dann liegts an der Reihenfolge obs geht. Dann fehlen Referenzen die seltsamerweise beim Compilieren eines executable nicht angemeckert werden.
Vll geht es einfach nicht mit meinen Objekten.
Werd das mal mit einfacheren ausprobieren.
http://www.disk-doktor.de

Benutzeravatar
Kronos
Moderator
Moderator
Beiträge: 731
Registriert: 07 Sep 2003, 01:10
Wohnort: Hagen

Beitragvon Kronos » 28 Dez 2010, 22:24

Naja, steck halt ein paar xtra-Funktionen ins Beispiel, wenn das geht versuchs mal mit den Funktionen in einer seperaten Quell-Datei (deinen Beschreibungen nach müsste es ja spätentens da hacken).
!! Bin Wichtig !!

Thore
Blue Morpho
Blue Morpho
Beiträge: 2632
Registriert: 30 Jul 2006, 18:09
Wohnort: Reutlingen
Kontaktdaten:

Beitragvon Thore » 29 Dez 2010, 22:12

Es liegt mit Sicherheit an den Abhängigkeiten zu anderen Funktionen die ich intern nicht drin hab. Schade, das wird was größeres werden.

Die References-Fehler auf LIB_xx konnte ich durch das "libnix" im gcc Aufruf wegbekommen. Hatte das in geistiger Umnachtung mal aus dem makefile entfernt... shame on me.

Oder weiß jemand wie ich die Referenz auflöse, bzw welche Lib nötig ist bei:
undefined reference to `__floatunsidf'
http://www.disk-doktor.de

Benutzeravatar
Kronos
Moderator
Moderator
Beiträge: 731
Registriert: 07 Sep 2003, 01:10
Wohnort: Hagen

Beitragvon Kronos » 29 Dez 2010, 23:14

Ein Quiky mit Fräulein Google brachte in erster Linie Hinweise auf einen Bug GCC4.x aber auch diesen netten Code-Schnipsel:

https://llvm.org/svn/llvm-project/compiler-rt/trunk/lib/floatunsidf.c

Kannst das ja mal einfach reinkopieren und probieren....
!! Bin Wichtig !!

Thore
Blue Morpho
Blue Morpho
Beiträge: 2632
Registriert: 30 Jul 2006, 18:09
Wohnort: Reutlingen
Kontaktdaten:

Beitragvon Thore » 29 Dez 2010, 23:25

Hab ich gestern schonmal, da gibts trotzdem noch nichterfüllte Constanten. Ich brauch da erstmal Zeit alles zusammenzusuchen was da noch fehlt.
Die Seite hatte ich nämlich gestern auch schon gefunden, hatte nun aber gehofft es gäbe vll schon was fertiges :)

Naja ich muss mir wohl mal die llvm Lib komplett bauen, vll gehts dann.
http://www.disk-doktor.de


Zurück zu „Code-Küche“



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste