Add support for init/fini arrays to libc (#1725)

The arrays contain the addresses of functions annotated with
constructor or destructor attributes. The support is optional,
requires FEATURE_INIT_FINI cmake option to be set. As of now, the
option is _not_ available in tools/build.py directly, only via
`--cmake-param="-DFEATURE_INIT_FINI=ON"`.

JerryScript-DCO-1.0-Signed-off-by: Akos Kiss akiss@inf.u-szeged.hu
This commit is contained in:
Akos Kiss
2017-04-13 17:18:17 +02:00
committed by GitHub
parent 950a0f10cd
commit 4b9e458f44
8 changed files with 193 additions and 31 deletions
+22 -9
View File
@@ -80,24 +80,37 @@
\
pop {r4-r12, pc};
#ifdef ENABLE_INIT_FINI
/*
* bl libc_init_array
*/
#define _INIT \
bl libc_init_array;
#else /* !ENABLE_INIT_FINI */
#define _INIT
#endif /* ENABLE_INIT_FINI */
/*
* bl libc_init_array
*
* ldr argc ([sp + 0x0]) -> r0
* add argv (sp + 0x4) -> r1
*
* bl main
*
* bl exit
*
* infinite loop
*/
#define _START \
ldr r0, [sp, #0]; \
add r1, sp, #4; \
bl main; \
\
bl exit; \
1: \
b 1b
#define _START \
_INIT; \
\
ldr r0, [sp, #0]; \
add r1, sp, #4; \
bl main; \
\
bl exit; \
1: \
b 1b;
/**
* If hard-float mode:
+28 -14
View File
@@ -92,7 +92,19 @@
pop %edi; \
ret;
#ifdef ENABLE_INIT_FINI
/*
* call libc_init_array
*/
#define _INIT \
call libc_init_array;
#else /* !ENABLE_INIT_FINI */
#define _INIT
#endif /* ENABLE_INIT_FINI */
/*
* call libc_init_array
*
* push argv (%esp + 4)
* push argc ([%esp + 0x4])
*
@@ -103,20 +115,22 @@
*
* infinite loop
*/
#define _START \
mov %esp, %eax; \
add $4, %eax; \
push %eax; \
mov 0x4 (%esp), %eax; \
push %eax; \
\
call main; \
\
push %eax; \
call exit; \
\
1: \
jmp 1b
#define _START \
_INIT; \
\
mov %esp, %eax; \
add $4, %eax; \
push %eax; \
mov 0x4 (%esp), %eax; \
push %eax; \
\
call main; \
\
push %eax; \
call exit; \
\
1: \
jmp 1b;
/*
* setjmp
+22 -8
View File
@@ -64,7 +64,19 @@
syscall; \
ret;
#ifdef ENABLE_INIT_FINI
/*
* call libc_init_array
*/
#define _INIT \
call libc_init_array;
#else /* !ENABLE_INIT_FINI */
#define _INIT
#endif /* ENABLE_INIT_FINI */
/*
* call libc_init_array
*
* mov argc ([%rsp]) -> %rdi
* mov argv (%rsp + 0x8) -> %rsi
*
@@ -76,15 +88,17 @@
* infinite loop
*/
#define _START \
mov (%rsp), %rdi; \
mov %rsp, %rsi; \
add $8, %rsi; \
callq main; \
_INIT; \
\
mov %rax, %rdi; \
callq exit; \
1: \
jmp 1b
mov (%rsp), %rdi; \
mov %rsp, %rsi; \
add $8, %rsi; \
callq main; \
\
mov %rax, %rdi; \
callq exit; \
1: \
jmp 1b;
/*
* setjmp