about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2012-05-02 21:01:55 -0400
committerRich Felker <dalias@aerifal.cx>2012-05-02 21:01:55 -0400
commit83023d1b50297cd2aa0fe4cbd2a0539462bb7c48 (patch)
tree899f0e3f0a7e759bdec1a0a657a4780179d8c9f3
parentc9dea48f84cd772ac250c091356dd6ef956ea3f6 (diff)
downloadmusl-83023d1b50297cd2aa0fe4cbd2a0539462bb7c48.tar.gz
musl-83023d1b50297cd2aa0fe4cbd2a0539462bb7c48.tar.xz
musl-83023d1b50297cd2aa0fe4cbd2a0539462bb7c48.zip
PIE support for i386
-rw-r--r--Makefile2
-rw-r--r--crt/Scrt1.c0
-rw-r--r--crt/i386/Scrt1.s24
3 files changed, 25 insertions, 1 deletions
diff --git a/Makefile b/Makefile
index 2265fce4..1b9e2436 100644
--- a/Makefile
+++ b/Makefile
@@ -39,7 +39,7 @@ ALL_INCLUDES = $(sort $(wildcard include/*.h include/*/*.h) $(GENH))
 
 EMPTY_LIB_NAMES = m rt pthread crypt util xnet resolv dl
 EMPTY_LIBS = $(EMPTY_LIB_NAMES:%=lib/lib%.a)
-CRT_LIBS = lib/crt1.o lib/crti.o lib/crtn.o
+CRT_LIBS = lib/crt1.o lib/Scrt1.o lib/crti.o lib/crtn.o
 STATIC_LIBS = lib/libc.a
 SHARED_LIBS = lib/libc.so
 TOOL_LIBS = lib/musl-gcc.specs
diff --git a/crt/Scrt1.c b/crt/Scrt1.c
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/crt/Scrt1.c
diff --git a/crt/i386/Scrt1.s b/crt/i386/Scrt1.s
new file mode 100644
index 00000000..b0fbe104
--- /dev/null
+++ b/crt/i386/Scrt1.s
@@ -0,0 +1,24 @@
+.weak _init
+.weak _fini
+.text
+.global _start
+_start:
+	xorl %ebp,%ebp
+	popl %ecx
+	movl %esp,%eax
+	andl $-16,%esp
+	pushl %esp
+	pushl %esp
+	pushl %edx
+	call 1f
+1:	addl $_GLOBAL_OFFSET_TABLE_,(%esp)
+	pop %ebx
+	call 1f
+1:	addl $[_fini-.],(%esp)
+	call 1f
+1:	addl $[_init-.],(%esp)
+	pushl %eax
+	pushl %ecx
+	pushl main@GOT(%ebx)
+	call __libc_start_main@plt
+1:	jmp 1b