Changeset View
Changeset View
Standalone View
Standalone View
libexec/rtld-elf/powerpc64/rtld_start.S
Show All 32 Lines | |||||
.extern _GLOBAL_OFFSET_TABLE_ | .extern _GLOBAL_OFFSET_TABLE_ | ||||
.extern _DYNAMIC | .extern _DYNAMIC | ||||
_ENTRY(_rtld_start) | _ENTRY(_rtld_start) | ||||
stdu %r1,-144(%r1) /* 16-byte aligned stack for reg saves + | stdu %r1,-144(%r1) /* 16-byte aligned stack for reg saves + | ||||
exit_proc & obj _rtld args + | exit_proc & obj _rtld args + | ||||
backchain & lrsave stack frame */ | backchain & lrsave stack frame */ | ||||
std %r3,96(%r1) /* argc */ | |||||
/* Save and restore only initial argv, because _rtld will modify | |||||
* argv and envp if invoked explicitly, making it necessary to | |||||
* load the (possibly) adjusted values from the stack. | |||||
*/ | |||||
std %r4,104(%r1) /* argv */ | std %r4,104(%r1) /* argv */ | ||||
std %r5,112(%r1) /* envp */ | |||||
/* std %r6,120(%r1) *//* obj (always 0) */ | /* std %r6,120(%r1) *//* obj (always 0) */ | ||||
/* std %r7,128(%r1) *//* cleanup (always 0) */ | /* std %r7,128(%r1) *//* cleanup (always 0) */ | ||||
std %r8,136(%r1) /* ps_strings */ | std %r8,136(%r1) /* ps_strings */ | ||||
/* | /* | ||||
* Perform initial relocation of ld-elf.so. Not as easy as it | * Perform initial relocation of ld-elf.so. Not as easy as it | ||||
* sounds. | * sounds. | ||||
* - perform small forward branch to put PC into link reg | * - perform small forward branch to put PC into link reg | ||||
Show All 37 Lines | |||||
#else | #else | ||||
mr %r12,%r3 | mr %r12,%r3 | ||||
#endif | #endif | ||||
mtlr %r3 | mtlr %r3 | ||||
/* | /* | ||||
* Restore args, with new obj/exit proc | * Restore args, with new obj/exit proc | ||||
*/ | */ | ||||
ld %r3,96(%r1) /* argc */ | |||||
ld %r4,104(%r1) /* argv */ | ld %r4,104(%r1) /* argv */ | ||||
ld %r5,112(%r1) /* envp */ | ld %r3,-8(%r4) /* argc */ | ||||
/* envp = argv + argc + 1 */ | |||||
addi %r5,%r3,1 | |||||
sldi %r5,%r5,3 /* x8 */ | |||||
add %r5,%r4,%r5 | |||||
ld %r6,120(%r1) /* obj */ | ld %r6,120(%r1) /* obj */ | ||||
ld %r7,128(%r1) /* exit proc */ | ld %r7,128(%r1) /* exit proc */ | ||||
ld %r8,136(%r1) /* ps_strings */ | ld %r8,136(%r1) /* ps_strings */ | ||||
blrl /* _start(argc, argv, envp, obj, cleanup, ps_strings) */ | blrl /* _start(argc, argv, envp, obj, cleanup, ps_strings) */ | ||||
li %r0,1 /* _exit() */ | li %r0,1 /* _exit() */ | ||||
sc | sc | ||||
▲ Show 20 Lines • Show All 64 Lines • Show Last 20 Lines |