problems with m68k-aout, newlib startup
hollerer@gmx.net
hollerer@gmx.net
Mon Nov 29 11:14:00 GMT 1999
hi,
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
work.
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
--
Austria
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.
*/
.data
.align 2
SYM (environ):
.long 0
.align 2
.text
/*
* 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
1:
/* 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
2:
clrb (a0)+
#ifndef __mcf5200__
dbra d0, 2b
clrw d0
subql IMM(1), d0
jbcc 2b
#else
subql IMM(1), d0
jmi 2b
#endif
3:
/*
* 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)
4:
lea SYM (software_init_hook), a0
cmpl IMM(0),a0
jbeq 5f
jsr (a0)
5:
/*
* 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 */
#endif
movel IMM (__FINI_SECTION__),(sp)
/* jsr SYM (atexit) <--fh */
jsr __INIT_SECTION__
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