* fix by Carsten Bager

git-svn-id: trunk@8211 -
This commit is contained in:
florian 2007-08-02 07:44:32 +00:00
parent 9713d5cb21
commit ea61793ca2

View File

@ -20,58 +20,58 @@
/* This is the canonical entry point, usually the first thing in the text /* This is the canonical entry point, usually the first thing in the text
segment. segment.
Note that the code in the .init section has already been run. Note that the code in the .init section has already been run.
This includes _init and _libc_init This includes _init and _libc_init
At this entry point, most registers' values are unspecified, except: At this entry point, most registers' values are unspecified, except:
a1 Contains a function pointer to be registered with `atexit'. a1 Contains a function pointer to be registered with `atexit'.
This is how the dynamic linker arranges to have DT_FINI This is how the dynamic linker arranges to have DT_FINI
functions called for shared libraries that have been loaded functions called for shared libraries that have been loaded
before this code runs. before this code runs.
sp The stack contains the arguments and environment: sp The stack contains the arguments and environment:
0(sp) argc 0(sp) argc
4(sp) argv[0] 4(sp) argv[0]
... ...
(4*argc)(sp) NULL (4*argc)(sp) NULL
(4*(argc+1))(sp) envp[0] (4*(argc+1))(sp) envp[0]
... ...
NULL NULL
*/ */
.text .text
.globl _start .globl _start
.type _start,#function .type _start,#function
_start: _start:
/* Clear the frame pointer since this is the outermost frame. */ /* Clear the frame pointer since this is the outermost frame. */
mov fp, #0 mov fp, #0
ldmia sp!, {a2} ldmia sp!, {a2}
/* Pop argc off the stack and save a pointer to argv */ /* Pop argc off the stack and save a pointer to argv */
ldr ip,=operatingsystem_parameter_argc ldr ip,=operatingsystem_parameter_argc
ldr a3,=operatingsystem_parameter_argv ldr a3,=operatingsystem_parameter_argv
str a2,[ip] str a2,[ip]
/* calc envp */ /* calc envp */
add a4,a2,#1 add a4,a2,#1
add a4,sp,a4,LSL #2 add a4,sp,a4,LSL #2
ldr ip,=operatingsystem_parameter_envp ldr ip,=operatingsystem_parameter_envp
str sp,[a3] str sp,[a3]
str a4,[ip] str a4,[ip]
/* Save initial stackpointer */ /* Save initial stackpointer */
ldr ip,=__stkptr ldr ip,=__stkptr
str sp,[ip] str sp,[ip]
/* Fetch address of fini */ /* Fetch address of fini */
ldr ip, =_fini ldr ip, =_fini
/* argc already loaded to a2*/ /* argc already loaded to a2*/
/* load argv /* load argv */
mov a3, sp mov a3, sp
/* Push stack limit */ /* Push stack limit */
@ -95,21 +95,21 @@ _start:
/* should never get here....*/ /* should never get here....*/
bl abort bl abort
.globl _haltproc .globl _haltproc
.type _haltproc,#function .type _haltproc,#function
_haltproc: _haltproc:
ldr r0,=operatingsystem_result ldr r0,=operatingsystem_result
ldrb r0,[r0] ldrb r0,[r0]
swi 0x900001 swi 0x900001
b _haltproc b _haltproc
/* Define a symbol for the first piece of initialized data. */ /* Define a symbol for the first piece of initialized data. */
.data .data
.globl __data_start .globl __data_start
__data_start: __data_start:
.long 0 .long 0
.weak data_start .weak data_start
data_start = __data_start data_start = __data_start
.bss .bss
.comm __stkptr,4 .comm __stkptr,4
@ -118,9 +118,9 @@ __data_start:
.comm operatingsystem_parameter_argc,4 .comm operatingsystem_parameter_argc,4
.comm operatingsystem_parameter_argv,4 .comm operatingsystem_parameter_argv,4
.section ".comment" .section ".comment"
.byte 0 .byte 0
.ascii "generated by FPC http://www.freepascal.org\0" .ascii "generated by FPC http://www.freepascal.org\0"
/* We need this stuff to make gdb behave itself, otherwise /* We need this stuff to make gdb behave itself, otherwise
gdb will chokes with SIGILL when trying to debug apps. gdb will chokes with SIGILL when trying to debug apps.