This is the mail archive of the
newlib@sourceware.cygnus.com
mailing list for the newlib project.
problems with m68k-aout, newlib startup
- To: newlib <newlib at sourceware dot cygnus dot com>
- Subject: problems with m68k-aout, newlib startup
- From: hollerer at gmx dot net
- Date: Mon, 29 Nov 1999 20:12:02 +0100
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 */
/*
* linker script for the mct zwerg332 board
* 24.11.99 fh
* derived from .../newlib-1.8.1/libgloss/m68k/bcc.ld
*/
STARTUP(crt0.o)
OUTPUT_ARCH(m68k)
/* Uncomment this if you want srecords. This is needed for a.out
* if you plan to use GDB.
OUTPUT_FORMAT(srec)
*/
SEARCH_DIR(.)
GROUP(-lmct -lc -lgcc)
__DYNAMIC = 0;
/*
* Setup the memory map.
* stack grows down from high memory.
*
* The memory map look like this:
* +--------------------+ <- low memory
* | .text |
* | _etext |
* | ctor list | the ctor and dtor lists are for
* | dtor list | C++ support
* +--------------------+
* | .data | initialized data goes here
* | _edata |
* +--------------------+
* | .bss |
* | __bss_start | start of bss, cleared by crt0
* | _end | start of heap, used by sbrk()
* +--------------------+
* . .
* . .
* . .
* | __stack | top of stack
* +--------------------+
*/
MEMORY
{
ram (rwx) : ORIGIN = 0x2020, LENGTH = 512M-0x2020
}
/*
* allocate the stack to be at the top of memory, since the stack
* grows down
*/
PROVIDE (__stack = 0); /* nico gibt stack vor */
/*
* Initalize some symbols to be zero so we can reference them in the
* crt0 without core dumping. These functions are all optional, but
* we do this so we can have our crt0 always use them if they exist.
* This is so BSPs work better when using the crt0 installed with gcc.
* We have to initalize them twice, so we cover a.out (which prepends
* an underscore) and coff object file formats.
*/
PROVIDE (hardware_init_hook = 0);
PROVIDE (_hardware_init_hook = 0);
PROVIDE (software_init_hook = 0);
PROVIDE (_software_init_hook = 0);
/*
* stick everything in ram (of course)
*/
SECTIONS
{
.text :
{
*(.text)
. = ALIGN(0x4);
__CTOR_LIST__ = .;
___CTOR_LIST__ = .;
LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
*(.ctors)
LONG(0)
__CTOR_END__ = .;
__DTOR_LIST__ = .;
___DTOR_LIST__ = .;
LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
*(.dtors)
LONG(0)
__DTOR_END__ = .;
*(.rodata)
*(.gcc_except_table)
__INIT_SECTION__ = . ;
LONG (0x4e560000) /* linkw %fp,#0 */
*(.init)
SHORT (0x4e5e) /* unlk %fp */
SHORT (0x4e75) /* rts */
__FINI_SECTION__ = . ;
LONG (0x4e560000) /* linkw %fp,#0 */
*(.fini)
SHORT (0x4e5e) /* unlk %fp */
SHORT (0x4e75) /* rts */
_etext = .;
*(.lit)
} > ram
.data :
{
*(.shdata)
*(.data)
_edata = .;
} > ram
.bss :
{
. = ALIGN(0x4);
__bss_start = . ;
*(.shbss)
*(.bss)
*(COMMON)
_end = ALIGN (0x8);
__end = _end;
} > ram
.stab 0 (NOLOAD) :
{
*(.stab)
}
.stabstr 0 (NOLOAD) :
{
*(.stabstr)
}
}