problems with m68k-aout, newlib startup
Mon Nov 29 11:14:00 GMT 1999


i have installed gcc as cross compiler for an mc68332 embedded system. 
but i failed with this initialization stuff. i also wonder about this
__main, __do_global_ctors() function and the __INIT_SECTION__ in
the linker script.

i hope that someone can help me with this stuff.

host:     SuSE linux 6.1
target:   mct zwerg332 embedded system (motorola mc68332)
software: binutils-2.9.1, gcc-2.8.1, newlib-1.8.1
output:   a.out format

i modified the crt0.S file which comes with newlib.
small programs work. but global and static variables are
uninitialized. also library function like sprintf() don't

in crt0.S the bss is cleared. but i did not find where other global and
static variables are initialized.

what's about the function __do_global_ctors(). is that
the place where this stuff should be done?

i also found an __INIT_SECTION__ in the linker script.
if i am right the linker should place some
initialization code there. but he doesn't. is this
a problem with the a.out format? btw. what
should this code do?

thx for any answer
franz hollerer

Usually we don't have kangaroos.
 * crt0.S -- startup file for m68k-coff
 * Copyright (c) 1995, 1996, 1998 Cygnus Support
 * The authors hereby grant permission to use, copy, modify, distribute,
 * and license this software and its documentation for any purpose, provided
 * that existing copyright notices are retained in all copies and that this
 * notice is included verbatim in any distributions. No written agreement,
 * license, or royalty fee is required for any of the authorized uses.
 * Modifications to this software may be copyrighted by their authors
 * and need not follow the licensing terms described here, provided that
 * the new terms are clearly indicated on the first page of each file where
 * they apply.

 * <--todo: atexit braucht close(), fstat(), isatty(), lseek(),
 *          read(), sbrk(), write().
 * daher vorerst auskommentiert.

#include "asm.h"

	.title "crt0.S for m68k-coff"
#define STACKSIZE	0x4000

 * Define an empty environment.
        .align 2
SYM (environ):
        .long 0

 	.align	2

 * These symbols are defined in C code, so they need to always be
 * named with SYM because of the difference between object file formats.

/* These are defined in C code. */
	.extern SYM (main)
	.extern SYM (exit)
	.extern SYM (hardware_init_hook)
	.extern SYM (software_init_hook)
	.extern SYM (atexit)
	.extern SYM(__do_global_dtors)

 * These values are set in the linker script, so they must be
 * explicitly named here without SYM.
	.extern __stack
	.extern __bss_start
	.extern _end

 * set things up so the application will run. This *must* be called start.
	.global SYM (start)
	.global SYM (_exit)

SYM (start):
	 * put any hardware init code here

	/* See if user supplied their own stack (__stack != 0).  If not, then
	 * default to using the value of %sp as set by the ROM monitor.
	movel	IMM(__stack), a0
	cmpl	IMM(0), a0
	jbeq    1f
	movel	a0, sp
	/* set up initial stack frame */
	link	a6, IMM(-8)
 * zero out the bss section.
	movel	IMM(__bss_start), d1
	movel	IMM(_end), d0
	cmpl	d0, d1
	jbeq	3f
	movl	d1, a0
	subl	d1, d0
	subql	IMM(1), d0
	clrb	(a0)+
#ifndef __mcf5200__
	dbra	d0, 2b
	clrw	d0
	subql	IMM(1), d0
	jbcc	2b
	subql	IMM(1), d0
	jmi	2b

 * initialize target specific stuff. Only execute these
 * functions it they exist.
	lea	SYM (hardware_init_hook), a0
	cmpl	IMM(0),a0
	jbeq	4f
	jsr     (a0)

	lea	SYM (software_init_hook), a0
	cmpl	IMM(0),a0
	jbeq	5f
	jsr     (a0)
 * call the main routine from the application to get it going.
 * main (argc, argv, environ)
 * we pass argv as a pointer to NULL.

#ifdef ADD_DTORS
	/* put __do_global_dtors in the atexit list so the destructors get run */
	movel	IMM (SYM(__do_global_dtors)),(sp)
/*	jsr	SYM (atexit) <--fh */
	movel	IMM (__FINI_SECTION__),(sp)
/*	jsr	SYM (atexit) <--fh */

        pea     0
        pea     SYM (environ)
        pea     sp@(4)
        pea     0
	jsr	SYM (main)
	movel	d0, sp@-

 * drop down into exit incase the user doesn't. This should drop
 * control back to the ROM monitor, if there is one. This calls the
 * exit() from the C library so the C++ tables get cleaned up right.
        jsr     SYM (exit)

 * drop down into _exit
 * the exit function of the newlib C library calls _exit.
SYM (_exit):
        trap    #7      /* nico monitor detects TRAP7 as exit */

More information about the Newlib mailing list