aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/arm/dl-machine.h
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/arm/dl-machine.h')
-rw-r--r--sysdeps/arm/dl-machine.h48
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;