ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > Aztec-C & kleine Executables / Linken von amiga.lib | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
17.11.2006, 17:14 Uhr uho Posts: 114 Nutzer |
Schon von Anfang an habe ich mich gefragt: Warum zum Teufel muß ein "Hallo, Welt!" in Aztec-C 5648 Bytes groß sein ?? In Assembler sind es nur 108 Bytes... Irgendwo habe ich dann mal gelesen, daß man printf() durch Amiga-Funktionen (z.B. PutStr() - leider weit weniger mächtig) ersetzen solle. Damit kommt man auf etwa 1944 Bytes - obwohl das Objektfile nur 260 Bytes klein ist. Außerdem könne man noch main() durch _main() ersetzen und könne dann statt der c.lib die amiga.lib linken. Aber genau das geht nicht. Normal schreibe ich: "ln Test -lc", um die c.lib zu linken (.lib wird automatisch ergänzt) Bei math. Funktionen dann: "ln Test -lm -lc" (m.lib+c.lib linken). Dabei kommt es dann schon auf die Reihenfolge an :-/ Versuche ich aber: "ln Test -lamiga", kommen ca. 50 Fehlermeldungen (Aussschnitt): Aztec C68K Linker 5.2a Sep 4 1991 12:07:03 (17)Undefined symbol: _exit. (17)Undefined symbol: .begin. (17)Undefined symbol: _AmigaGuideBase. ... (17)Undefined symbol: _WorkbenchBase. (17)Undefined symbol: _stdin. (17)Undefined symbol: _stdout. Base: 000000 Code: 007b90 Data: 000034 Udata: 000004 Total: 007bc8 Offensichtlich nicht definierte Symbole. Naheliegend wäre also eine Kombination - ähnlich wie bei math.lib: "ln -lamiga -lc". Das führt aber zu ca. 1875 (!!) Fehlern: Aztec C68K Linker 5.2a Sep 4 1991 12:07:03 file: <Prg:lib/libs/c.lib>(fgetc) User symbol <_fgetc> overrides library symbol. file: <Prg:lib/libs/c.lib>(fprintf) User symbol <_fprintf> overrides library symbol. file: <Prg:lib/libs/c.lib>(getchar) User symbol <_getchar> overrides library symbol. ... (17)Undefined symbol: _WorkbenchBase. (17)Undefined symbol: _stdin. (17)Undefined symbol: _stdout. Base: 000000 Code: 008230 Data: 000048 Udata: 00005c Total: 0082d4 Bleibt noch (weniger logisch): "ln -lc -lamiga". Das sieht dann so aus (ca. 50 Fehler): Aztec C68K Linker 5.2a Sep 4 1991 12:07:03 file: <Prg:lib/libs/amiga.lib>( ç) _PutStr multiply defined file: <Prg:lib/libs/amiga.lib>( ç) _CloseLibrary multiply defined file: <Prg:lib/libs/amiga.lib>( ç) _OpenLibrary multiply defined (17)Undefined symbol: _AmigaGuideBase. ... (17)Undefined symbol: _WorkbenchBase. (17)Undefined symbol: _stdin. (17)Undefined symbol: _stdout. Base: 000000 Code: 008268 Data: 000040 Udata: 00005c Total: 008304 Lange Rede, kurzer sind: Trotz Studiums des ca. 1500seitigen englisch- sprachigen Handbuches bekomme ich die amiga.lib nicht gelinkt. Und wenn ich mich recht erinnere, waren die Tests auch mit den meisten anderen mitgelieferten Libraries (small.lib...) ähnlich erfolglos. Bei anderen Compilern muß das aber gehen. IMHO kamen die auf ca. 300 Bytes... Das das Problem nun schon mehr als ein Jahrzehnt ungelöst ist, hoffe ich auf Eure profunden Kenntnisse ! Gruß uho Guckst Du hier: misc/sci/Wator1_27.lha gfx/misc/HideIt_1.21.lha [ - Antworten - Zitieren - Direktlink - ] |
17.11.2006, 18:53 Uhr thomas Posts: 7718 Nutzer |
@uho: Ich habe mal meine alten Aztec-Disketten herausgekramt. An viel kann ich mich nicht erinnern von damals. Leider finde ich das Handbuchg nicht mehr, deshalb mußte ich mich durch meine alten Sourcen wühlen und ein bißchen Trial-And-Error machen. Außerdem ist mein Aztec noch auf dem Stand von Kick 1.3. Ich kann dir nur dringenst empfehlen, auf einen moderneren Compiler umzusteigen, z.B. VBCC. Jedenfalls habe ich das hier hinbekommen: code:#include <functions.h> #include <pragmas.h> struct Library *DOSBase; struct Library *SysBase; #asm .begin: jmp _start #endasm #pragma regcall(start(d0,a0)) int start (unsigned long arglen,char *argstr) { SysBase = *((struct Library **)4); if (DOSBase = OpenLibrary ("dos.library",0)) { if (arglen > 0 && argstr[arglen-1] == 'n') arglen --; Write (Output(),"Your input: <",13); Write (Output(),argstr,arglen); Write (Output(),">n",2); CloseLibrary (DOSBase); } return (0); } Das kompilierte Programm ist 300 Bytes groß und braucht weder c.lib noch amiga.lib. Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Antworten - Zitieren - Direktlink - ] |
08.08.2012, 13:48 Uhr uho Posts: 114 Nutzer |
@thomas: Heureka ! Nach "nur" fast 20 Jahren weiß ich nun, wie man die amiga.lib mit Aztec-C benutzt. Nachdem die "normale" Linkprozedur an o.g. Fehlermeldungen scheiterte, in Büchern und Zeitschriften über die Jahre keinerlei Hinweise zu finden waren und auch hier im Forum niemand helfen konnte, wurde tatsächlich in einem uralten Kickstart-Magazin ganz am Rande der "Trick" erwähnt. Ich hatte ja schon vorher Includes verändert und so eingige Funktionen (z.B. GT_GetGadgetAttrsA() ) verfügbar (und so Projekte wie Wator erst möglich) gemacht. Das wäre diesmal nicht gegangen, denn der Code (und nicht nur die Definition für den Compiler) für die diesmal benötigten Funktionen - ArgArrayInit(), ArgInt(), ArgString() und ArgArrayDone() - befindet sich nur in der amiga.lib. Achja, das "Geheimnis" lautet: ln Programmname.o -lc [-lm] +l amiga.lib Der (sonst nie benötigte) Schalter "+l" läßt den Linker "ein normales Objektfile als Library behandeln". Evtl. hätte ich dies beim Programmieren einer eigenen Library in Erwägung gezogen - niemals jedoch bei der amiga.lib . Konsequenterweise wird auch im Handbuch weder erwähnt, wie die amiga.lib zu linken ist, noch, daß sie - trotz identischer Endung - einen anderen internen Aufbau als alle anderen .lib-Files hat... Ein kleiner Abschnitt im Handbuch oder ein Tip in einem der vielen durchgearbeiteten Quellcodes hätte mir hunderte Stunden Rätselraten sparen können... Zu beachten ist, daß "+l" ein Ein-/Ausschalter ist - also alle nachfolgenden Objektfiles bis zum Ende der Zeile oder dem nächsten "+l" "wie Libraries" verwendet werden, daß zwischen "+l" und dem File ein Leerzeichen stehen muß - unlogischerweise und im Gegensatz zu "-l" - und daß ".lib" hier - ebenfalls anders als bei "-l" - _nicht_ ergänzt wird. Das Linken dauert nun ca. viermal so lange - aber nach so langer Zeit sind die paar Sekunden nun auch noch drin B-) . Gruß uho [ - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > Aztec-C & kleine Executables / Linken von amiga.lib | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |