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

amiga-news.de Forum > Programmierung > Startup Code in C [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

03.05.2003, 00:06 Uhr

Saint
Posts: 68
Nutzer
Hi!

Ich hoffe ihr könnt mir wieder einmal weiterhelfen :-)

Ich arbeite momentan an einem kleinen Programm, und wollte nun probieren einen anderen Startup Code als den von GCC zu linken, einfach um mal zu sehen, was man da an Platz sparen kann.

Leider habe ich von Startup Code keine besonders große Ahnung, deswegen war Krashan so freundlich mir seinen zu schicken. Aber leider stürzt ein damit erzeugtes Programm sofort mit einer Exception ab.

Unten ist der Code wie er ihn mir geschickt hat. Meine Frage nun: Was muß im Startup Code alles geschehen? Wo liegt in diesem der Fehler?

Als Compiler benutze ich GCC 2.95.3.
Ich hoffe ihr könnt mir helfen, und bitte keine Sprüche wie "lern das erstmal genau" oder rtfm, das hilft mir nämlich nicht weiter beim lernen.

Thx.

/* $Id: startup.c 1.11 1999/05/09 19:36:21 Krashan Exp Krashan $*/
#define __NOLIBBASE__
#include <proto/dos.h>
#include <proto/exec.h>

long Main(long);

struct Library *SysBase, *DOSBase;
__saveds long _main (void)
{
long ret_value, wb;
struct Process *process;
struct Message *wbmessage = NULL;

SysBase = *(struct Library**)4;
if (DOSBase = (struct Library*)OpenLibrary ("dos.library", 37))
{
process = (struct Process*)FindTask (NULL);
if (process->pr_CLI) wb = FALSE;
else
{
WaitPort (&process->pr_MsgPort);
wbmessage = GetMsg (&process->pr_MsgPort);
wb = TRUE;
}
ret_value = Main (wb);
CloseLibrary (DOSBase);
if (wbmessage)
{
Forbid ();
ReplyMsg (wbmessage);
}
return (ret_value);
}
return (10);
}

[ - Antworten - Zitieren - Direktlink - ]

03.05.2003, 12:26 Uhr

SRuppert
Posts: 7
Nutzer
Hi,

also der startup code sieht ganz gut aus. Die Frage ist wie du das Programm übersetzt ixemul? libnix? Ausserdem kommt es drauf an was in deinem Programm noch benutzt wird: Intution, Gfx...? Wenn du einen eigenen startup code verwendest dann musst du auch alle benötigten libraries selbst öffnen und schliessen...

Hope this helps a little bit!

Ciao,
Stefan

[ - Antworten - Zitieren - Direktlink - ]

03.05.2003, 12:59 Uhr

Saint
Posts: 68
Nutzer
Mein programm übersetze ich mit -nostartfiles -noixemul, aber dieser Startup Code stürzt auch ab wenn Main() noch gar nicht aufgerufen ist (z.b. wenn ich den Aufruf

ret_value = Main (wb);

einfach durch

ret_value = 0;

ersetze. Der Fehler muß also irgendwo vorher liegen.

Das ich in meinem Programm alles selbst öffne und schließe ist schon klar, ich bin zwar Anfänger aber ein bißchen kann ich auch schon ;-)

[ - Antworten - Zitieren - Direktlink - ]

03.05.2003, 13:53 Uhr

SRuppert
Posts: 7
Nutzer
Ist schon länger her, dass ich mich mit startup code rumgeschagen habe auf dem Amiga. Also noch zwei Dinge.

1. Wie sieht genau dein Linker aufruf aus?

startup.o muss als aller erstes eingebunden werden! Also
etwa : gcc -nostartupfiles -noixemul startup.o app.o -o app

Wenn das nicht hilft, dann noch evtl:

2. Die Variablen "struct Library *SysBase, *DOSBase;" unterhalb
der _main() Funktion definieren.

Also:

extern struct Library *SysBase, *DOSBase;
long _main()
{
}
struct Library *SysBase, *DOSBase;

Ciao, Stefan

[ - Antworten - Zitieren - Direktlink - ]

03.05.2003, 14:10 Uhr

Saint
Posts: 68
Nutzer
Ok, jetzt wirds noch seltsamer: Der selbe startup Code läuft absolut problemlos, wenn ich ihn für MorphOS compilliere. Läuft mein Programm halt ppc-nativ, ist eh für Ambient gedacht gewesen ;-)

[ - Antworten - Zitieren - Direktlink - ]

03.05.2003, 16:07 Uhr

tokai
Posts: 1071
Nutzer
Irgendwie schaut der Startup-Code seltsam aus. :)

Probier mal dieses Code-Schnippsel (funktioniert ohne Probleme unter 68k/SASc und MOS)

code:
/*
 *   Copyright ©2002 Christian Rosentreter <karibu@gmx.net>
 *   All rights reserved.
 *
 *   module:      startup.c
 *   description: initializes libraries and get arguments
 *
 *   :ts=4
 */
    

extern LONG __saveds initapp(void);

static BOOL          InitLibraries(void);
static void          CloseLibraries(void);     

struct ExecBase      *SysBase        = NULL; 
struct DosLibrary    *DOSBase        = NULL;
struct IntuitionBase *IntuitionBase  = NULL;
struct GfxBase       *GfxBase        = NULL;

#define AUTOCON "CON:0/25/640/150/Output/auto/close/wait"


LONG __saveds initapp(void)
{
    struct Process   *proc;
    struct WBStartup *WBMsg = NULL;
    BOOL             prCLI;
    LONG             rc;
 
    SysBase = *(struct ExecBase **)4; 
    proc    = (struct Process *)FindTask(NULL);

    if ( !(prCLI = proc->pr_CLI ? TRUE : FALSE) )
    {
        WaitPort(&proc->pr_MsgPort);
        WBMsg = (struct WBStartup *)GetMsg(&proc->pr_MsgPort);
    }

    if ( DOSBase = (struct DosLibrary *)OpenLibrary("dos.library",0L) )
    {
        BPTR CLIout;
        
        if ( CLIout = ( prCLI ? Output() : Open(AUTOCON,MODE_OLDFILE) ) )
        {
            SelectOutput(CLIout);

            if ( InitLibraries() )
            {
                    rc = Main();
            }
            else
            {
                rc = RETURN_FAIL;

            } /* InitLibraries() */
        
            CloseLibraries(); 

            if (!prCLI) { Close(CLIout); }
        }
        else
        {
            rc = RETURN_FAIL;
        
        } /* CLIout */
             
        CloseLibrary((struct Library*)DOSBase);
    }
    else
    {
        proc->pr_Result2 = ERROR_INVALID_RESIDENT_LIBRARY;
        rc = RETURN_FAIL;
    
    } /* DOSBase */
 

    if (WBMsg)
    {
        Forbid();
        ReplyMsg(&WBMsg->sm_Message);
    }

    return rc;
}

static BOOL InitLibraries(void)
{
    if ( !( IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",OSLIBVERSION) ))
    {
        /* error output here... */
        return FALSE;
    }

    if ( !( GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",OSLIBVERSION) ))
    {
        /* ...and here. e.g. a localized message :)  */
        return FALSE;
    }

    return TRUE;
}

static void CloseLibraries(void)
{
    if (GfxBase)       { CloseLibrary((struct Library *)GfxBase); }
    if (IntuitionBase) { CloseLibrary((struct Library *)IntuitionBase); }
}


Wenn du den kompletten Code brauchst, kann ich dir den per mail zumailen. Das hier ist nur das Allernötigste. :D

btw: die dos.library mit Version 0 oeffnen. Wenn dein Programm eine höhere OS-Version benötigt, kann das z.B.: beim Öffnen der Intuilib abgefangen werden. :)
--
years flow as water, lake reflects flowers and moon

[ - Antworten - Zitieren - Direktlink - ]

04.05.2003, 06:08 Uhr

Uri]CoM[
Posts:
[Ex-Mitglied]
Wenn du nur zum Spaß am Startupcode herumfummelst ist das in Ordnung.
Ansonsten Zeitverschwendung. Lies dir mal die Anleitung für Libnix durch, da steht beschrieben wie Mann schlanke Programme compiliert.

[ - Ändern - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Startup Code in C [ - Suche - Neue Beiträge - Registrieren - Login - ]


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