diff options
Diffstat (limited to 'sysdeps/arm')
-rw-r--r-- | sysdeps/arm/dl-machine.h | 48 |
1 files changed, 22 insertions, 26 deletions
diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h index d95cb67f90..19276abfa1 100644 --- a/sysdeps/arm/dl-machine.h +++ b/sysdeps/arm/dl-machine.h @@ -279,36 +279,32 @@ _dl_start_user: str sp, [r1] @ See if we were run as a command with the executable file @ name as an extra leading argument. - ldr r1, .L_SKIP_ARGS - ldr r1, [sl, r1] + ldr r4, .L_SKIP_ARGS + ldr r4, [sl, r4] @ get the original arg count - ldr r0, [sp] + ldr r1, [sp] @ subtract _dl_skip_args from it - sub r0, r0, r1 + sub r1, r1, r4 @ adjust the stack pointer to skip them - add sp, sp, r1, lsl #2 + add sp, sp, r4, lsl #2 + @ get the argv address + add r2, sp, #4 @ store the new argc in the new stack location - str r0, [sp] + str r1, [sp] + @ compute envp + add r3, r2, r1, lsl #2 + add r3, r3, #4 - @ now we enter a _dl_init_next loop - ldr r4, .L_MAIN_SEARCHLIST - ldr r4, [sl, r4] - ldr r4, [r4] - @ call _dl_init_next to get the address of an initalizer -0: mov r0, r4 - bl _dl_init_next(PLT) - cmp r0, #0 - beq 1f - @ call the shared-object initializer - @ during this call, the stack may get moved around - mov lr, pc - mov pc, r0 - @ go back and look for another initializer - b 0b -1: @ clear the startup flag + @ now we call _dl_init + ldr r0, .L_LOADED + ldr r0, [sl, r0] + ldr r0, [r0] + @ call _dl_init + bl _dl_init(PLT) + @ clear the startup flag ldr r2, .L_STARTUP_FLAG ldr r1, [sl, r2] - @ we know r0==0 at this point + mov r0, #0 str r0, [r1] @ load the finalizer function ldr r0, .L_FINI_PROC @@ -325,8 +321,8 @@ _dl_start_user: .word _dl_fini(GOT) .L_STACK_END: .word __libc_stack_end(GOT) -.L_MAIN_SEARCHLIST: - .word _dl_main_searchlist(GOT) +.L_LOADED: + .word _dl_loaded(GOT) .previous\n\ "); @@ -464,7 +460,7 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc, if (value & 0xfc000003) _dl_signal_error (0, map->l_name, "R_ARM_PC24 relocation out of range"); - + value = value >> 2; value = (*reloc_addr & 0xff000000) | (value & 0x00ffffff); *reloc_addr = value; |