Index: arch/arm/rtld_start.S =================================================================== RCS file: /cvsroot/src/libexec/ld.elf_so/arch/arm/rtld_start.S,v retrieving revision 1.11 diff -u -p -r1.11 rtld_start.S --- arch/arm/rtld_start.S 13 Aug 2012 02:53:25 -0000 1.11 +++ arch/arm/rtld_start.S 2 Dec 2013 21:41:30 -0000 @@ -41,16 +41,17 @@ _rtld_start: sub sp, sp, #8 /* make room for obj_main & exit proc */ mov r4, r0 /* save ps_strings */ - ldr sl, .L2 - ldr r5, .L2+4 - ldr r0, .L2+8 + ldr sl, .Lgot + ldr r5, .Ldynamic .L1: - add sl, pc, sl - ldr r5, [sl, r5] - ldr r0, [sl, r0] + add sl, pc, sl /* sl = &GOT[0] */ +.L2: + add r0, pc, r5 /* r0 = &_DYNAMIC */ + + /* The linker sets the beginning of GOT to the offset of _DYNAMIC */ + ldr r5, [sl] /* r5 = _DYNAMIC offset */ sub r1, sl, r5 /* relocbase */ - add r0, r1, r0 /* &_DYNAMIC */ bl _rtld_relocate_nonplt_self sub r1, sl, r5 /* relocbase */ @@ -66,10 +67,10 @@ _rtld_start: #else mov pc, r3 /* jump to the entry point */ #endif -.L2: +.Lgot: .word _GLOBAL_OFFSET_TABLE_ - (.L1+8) - .word _GLOBAL_OFFSET_TABLE_(GOT) - .word _DYNAMIC(GOT) +.Ldynamic: + .word _DYNAMIC - (.L2+8) .align 0 .globl _rtld_bind_start