LIBC=$(TOPDIR)libc.a
ASFLAGS=$(CFLAGS)
-CRT0=crt0.S
+TARGET_MACHINE_TYPE=$(shell $(CC) -dumpmachine)
+
+ifeq ($(TARGET_MACHINE_TYPE),arm-pic-elf)
+ CRT0=crt0pic.S
+else
+ CRT0=crt0.S
+endif
+
CRT0_OBJ=$(patsubst %.S,%.o, $(CRT0))
SSRC=longjmp.S setjmp.S
ar-target: $(OBJS) $(CRT0_OBJ)
$(AR) $(ARFLAGS) $(LIBC) $(OBJS)
- cp $(CRT0_OBJ) $(TOPDIR)$(CRT0_OBJ)
+ cp $(CRT0_OBJ) $(TOPDIR)crt0.o
$(CRT0_OBJ): %.o : %.S
$(CC) $(CFLAGS) -c $< -o $@
--- /dev/null
+.text\r
+ .align 2\r
+ .global __environ\r
+ .global _start\r
+ .global exit\r
+ .global main\r
+ .global __libc_init\r
+ .global __init_stdio\r
+ .global __stdio_close_all\r
+ .global _void_void_null_func\r
+\r
+ .type _start,%function\r
+ .type exit,%function\r
+ .type main,%function\r
+ .type __libc_init,%function\r
+ .type __init_stdio,%function\r
+ .type __stdio_close_all,%function\r
+ .type _void_void_null_func,%function\r
+\r
+\r
+\r
+@ r0 = argc\r
+@ r1 = argv\r
+@ r2 = envp\r
+@ sl = data segment\r
+\r
+.text\r
+_start:\r
+ @ adjust the data segment base pointer\r
+ ldr r3,=__data_start\r
+ sub sl,sl,r3\r
+ mov r9,sl\r
+\r
+ ldr r3, .L3\r
+ str r2,[r9,r3]\r
+ ldr r0,[sp, #0]\r
+ ldr r1,[sp, #4]\r
+ ldr r2,[sp, #8]\r
+ \r
+ /* Tell libc to initialize whatever it needs */\r
+ bl __libc_init \r
+ bl __init_stdio\r
+ bl main\r
+/* ldr r0,=0 */\r
+ bl exit\r
+\r
+_void_void_null_func:\r
+ nop\r
+\r
+.weak __libc_init\r
+__libc_init = _void_void_null_func\r
+\r
+.weak __init_stdio\r
+__init_stdio = _void_void_null_func\r
+\r
+.weak __stdio_close_all\r
+__stdio_close_all = _void_void_null_func\r
+\r
+.align 2\r
+.L3:\r
+ .word environ\r
+\r
+\r
+.data\r
+ .align 2\r
+ .global __environ\r
+ \r
+__environ: \r
+ .long 0\r
+\r
+.weak environ\r
+environ = __environ\r
+\r
+\r