diff options
author | Kurt Miller <kurt@cvs.openbsd.org> | 2014-12-22 21:58:26 +0000 |
---|---|---|
committer | Kurt Miller <kurt@cvs.openbsd.org> | 2014-12-22 21:58:26 +0000 |
commit | a7011e75e0665f391f1e7671cff112ad01656ab4 (patch) | |
tree | b7e0918beea856252d873d31725f304aa84effb3 /lib/csu/i386 | |
parent | 2aeb75c0a97e4ba4b8eeb48b9e0cf45a21b6c8f1 (diff) |
Self-relocation code for i386.
Diffstat (limited to 'lib/csu/i386')
-rw-r--r-- | lib/csu/i386/md_init.h | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/lib/csu/i386/md_init.h b/lib/csu/i386/md_init.h index 584af51599d..11a84c367f1 100644 --- a/lib/csu/i386/md_init.h +++ b/lib/csu/i386/md_init.h @@ -1,4 +1,4 @@ -/* $OpenBSD: md_init.h,v 1.4 2013/12/03 06:21:41 guenther Exp $ */ +/* $OpenBSD: md_init.h,v 1.5 2014/12/22 21:58:25 kurt Exp $ */ /*- * Copyright (c) 2001 Ross Harvey @@ -84,3 +84,52 @@ " xorl %ebp,%ebp # mark deepest stack frame\n" \ " call ___start \n" \ " .previous") + +#define MD_RCRT0_START \ + __asm( \ + ".text \n" \ + " .align 4 \n" \ + " .globl __start \n" \ + " .globl _start \n" \ + "_start: \n" \ + "__start: \n" \ + " movl %esp,%eax # save SP for dl_boot_bind \n" \ + " subl $16*4,%esp # allocate dl_data \n" \ + " pushl $0 # push 0 for dynamicp (unused on i386) \n" \ + " movl %esp,%ebx \n" \ + " pushl %ebx # push dl_data for dl_boot_bind \n" \ + " \n" \ + " mov %eax, %esi # save stack for ___start \n" \ + " pushl %eax # push saved SP for dl_boot_bind \n" \ + " \n" \ + " call _dl_boot_bind@PLT # _dl_boot_bind(sp,dl_data,0) \n" \ + " addl $3*4,%esp # pop args \n" \ + " \n" \ + " movl %esi,%ebp \n" \ + " andl $~15,%esp # align stack\n" \ + " pushl $0 # cleanup\n" \ + " movl 0(%ebp),%eax # argc \n" \ + " leal 8(%ebp,%eax,4),%ecx #envp \n" \ + " leal 4(%ebp),%edx # argv \n" \ + " pushl %ecx \n" \ + " pushl %edx \n" \ + " pushl %eax \n" \ + " xorl %ebp,%ebp # mark deepest stack frame\n" \ + " call ___start # ___start(argc,argv,envp,0) \n" \ + " \n" \ + ".text \n" \ + " .align 4 \n" \ + " .globl _dl_printf \n" \ + " .type _dl_printf,@function \n" \ + "_dl_printf: \n" \ + " ret \n" \ + " \n" \ + ".text \n" \ + " .align 4 \n" \ + " .globl _dl_exit \n" \ + " .type _dl_exit,@function \n" \ + "_dl_exit: \n" \ + " mov $1, %eax \n" \ + " int $0x80 \n" \ + " ret \n" \ + " .previous") |