1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
/*
* This file is subject to the terms and conditions of the LGPL V2.1
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
* Copyright (C) 2018 Kalray Inc.
*/
/* Startup code compliant to the ELF KVX ABI */
#include <libc-symbols.h>
#include <features.h>
.type main,@function
.type __uClibc_main,@function
/*
* When we enter this piece of code, the program stack has been
* layed out by the kernel like this:
* argc argument counter (integer)
* argv[0] program name (pointer)
* argv[1...N] program args (pointers)
* argv[argc-1] end of args (integer)
* NULL
* env[0...N] environment variables (pointers)
* NULL
*
* Moreover, when using dynamic loader, $r0 contains the rtld_fini
* address
*
* And we need to call the following function:
* __uClibc_main (int (*main) (int, char **, char **), int argc,
* char **argv, void (*init) (void), void (*fini) (void),
* void (*rtld_fini) (void), void *stack_end)
*/
.text
.globl _start
.type _start,@function
.align 8
C_SYMBOL_NAME(_start):
/* Load argc from stack */
ld $r1 = 0[$sp]
/* Load argv addr from stack */
addd $r2 = $sp, 0x8
#ifdef __PIC__
pcrel $r7 = @gotaddr()
#endif
;;
/* $r0 contains rtld_fini when run by dynamic loader */
copyd $r5 = $r0
/* prepare __uClibc_main arg */
#ifndef __PIC__
make $r3 = _init
make $r4 = _fini
#endif
;;
/* Align stack to 32-byte boundary */
andd $sp = $sp, -32
make $r8 = 0
make $fp = 0
/* prepare __uClibc_main arg */
#ifdef __PIC__
ld $r3 = @got(_init)[$r7]
#endif
;;
/* Setup stack_end for __uClibc_main */
copyd $r6 = $sp
/* Clear compute status */
set $cs = $r8
#ifdef __PIC__
ld $r4 = @got(_fini)[$r7]
#endif
;;
#ifdef __PIC__
ld $r0 = @got(main)[$r7]
#else
make $r0 = main
#endif
goto __uClibc_main
;;
/* We should never return ! */
errop
;;
|