amiga-news 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.
.