diff options
| -rw-r--r-- | Makefile | 4 | ||||
| -rw-r--r-- | arch/arm/crt_arch.h | 9 | ||||
| -rw-r--r-- | arch/i386/crt_arch.h | 13 | ||||
| -rw-r--r-- | arch/microblaze/crt_arch.h | 11 | ||||
| -rw-r--r-- | arch/mips/crt_arch.h | 21 | ||||
| -rw-r--r-- | arch/powerpc/crt_arch.h | 12 | ||||
| -rw-r--r-- | arch/x86_64/crt_arch.h | 9 | ||||
| -rw-r--r-- | crt/Scrt1.c | 1 | ||||
| -rw-r--r-- | crt/crt1.c | 16 | 
9 files changed, 96 insertions, 0 deletions
@@ -80,6 +80,10 @@ include/bits/alltypes.h: include/bits/alltypes.h.in include/alltypes.h.in tools/  src/ldso/dynlink.lo: arch/$(ARCH)/reloc.h +crt/crt1.o crt/Scrt1.o: $(wildcard arch/$(ARCH)/crt_arch.h) + +crt/Scrt1.o: CFLAGS += -fPIC +  OPTIMIZE_SRCS = $(wildcard $(OPTIMIZE_GLOBS:%=src/%))  $(OPTIMIZE_SRCS:%.c=%.o) $(OPTIMIZE_SRCS:%.c=%.lo): CFLAGS += -O3 diff --git a/arch/arm/crt_arch.h b/arch/arm/crt_arch.h new file mode 100644 index 00000000..979fb081 --- /dev/null +++ b/arch/arm/crt_arch.h @@ -0,0 +1,9 @@ +__asm__("\ +.global _start \n\ +_start: \n\ +	mov fp, #0 \n\ +	mov lr, #0 \n\ +	mov a1, sp \n\ +	and sp, sp, #-16 \n\ +	bl __cstart \n\ +"); diff --git a/arch/i386/crt_arch.h b/arch/i386/crt_arch.h new file mode 100644 index 00000000..ae694f99 --- /dev/null +++ b/arch/i386/crt_arch.h @@ -0,0 +1,13 @@ +__asm__("\ +.text \n\ +.global _start \n\ +_start: \n\ +	xor %ebp,%ebp \n\ +	mov %esp,%eax \n\ +	and $-16,%esp \n\ +	push %eax \n\ +	push %eax \n\ +	push %eax \n\ +	push %eax \n\ +	call __cstart \n\ +"); diff --git a/arch/microblaze/crt_arch.h b/arch/microblaze/crt_arch.h new file mode 100644 index 00000000..8917c695 --- /dev/null +++ b/arch/microblaze/crt_arch.h @@ -0,0 +1,11 @@ +__asm__("\ +.global _start \n\ +.align  2 \n\ +_start: \n\ +	add r19, r0, r0 \n\ +	ori r5, r1, 0 \n\ +	andi r1, r1, -8 \n\ +	addik r1, r1, -8 \n\ +	bri __cstart \n\ +	nop \n\ +"); diff --git a/arch/mips/crt_arch.h b/arch/mips/crt_arch.h new file mode 100644 index 00000000..d4ae52d1 --- /dev/null +++ b/arch/mips/crt_arch.h @@ -0,0 +1,21 @@ +__asm__("\n\ +.set push\n\ +.set noreorder\n\ +.global __start\n\ +.global _start\n\ +.type   __start, @function\n\ +.type   _start, @function\n\ +__start:\n\ +_start:\n\ +	bal 1f \n\ +	move $fp, $0 \n\ +2:	.gpword 2b \n\ +1:	lw $gp, 0($ra) \n\ +	subu $gp, $ra, $gp \n\ +	move $4, $sp \n\ +	subu $sp, $sp, 16 \n\ +	and $sp, $sp, -8 \n\ +	lw $25, %call16(__cstart)($gp) \n\ +	jalr $25 \n\ +	nop \n\ +.set pop"); diff --git a/arch/powerpc/crt_arch.h b/arch/powerpc/crt_arch.h new file mode 100644 index 00000000..8cc53d98 --- /dev/null +++ b/arch/powerpc/crt_arch.h @@ -0,0 +1,12 @@ +__asm__("\ +.global _start \n\ +.type   _start, %function \n\ +_start: \n\ +	mr 3, 1 \n\ +	clrrwi 1, 1, 4 \n\ +	li 0, 0 \n\ +	stwu 1, -16(1) \n\ +	mtlr 0 \n\ +	stw 0, 0(1) \n\ +	bl __cstart \n\ +");         diff --git a/arch/x86_64/crt_arch.h b/arch/x86_64/crt_arch.h new file mode 100644 index 00000000..db692950 --- /dev/null +++ b/arch/x86_64/crt_arch.h @@ -0,0 +1,9 @@ +__asm__("\ +.text \n\ +.global _start \n\ +_start: \n\ +	xor %rbp,%rbp \n\ +	mov %rsp,%rdi \n\ +	andq $-16,%rsp \n\ +	call __cstart \n\ +"); diff --git a/crt/Scrt1.c b/crt/Scrt1.c index e69de29b..822f10bb 100644 --- a/crt/Scrt1.c +++ b/crt/Scrt1.c @@ -0,0 +1 @@ +#include "crt1.c" @@ -0,0 +1,16 @@ +#include <features.h> + +#include "crt_arch.h" + +int main(); +void _init() __attribute__((weak)); +void _fini() __attribute__((weak)); +_Noreturn int __libc_start_main(int (*)(), int, char **, +	void (*)(), void(*)(), void(*)()); + +void __cstart(long *p) +{ +	int argc = p[0]; +	char **argv = (void *)(p+1); +	__libc_start_main(main, argc, argv, _init, _fini, 0); +}  | 
