diff options
| -rw-r--r-- | ldso/ldso/arc/dl-startup.h | 9 | ||||
| -rw-r--r-- | ldso/ldso/arc/dl-sysdep.h | 17 | 
2 files changed, 14 insertions, 12 deletions
| diff --git a/ldso/ldso/arc/dl-startup.h b/ldso/ldso/arc/dl-startup.h index 016155473..8e26ae8d9 100644 --- a/ldso/ldso/arc/dl-startup.h +++ b/ldso/ldso/arc/dl-startup.h @@ -33,14 +33,9 @@ __asm__(      "   ; If ldso ran as cmd with executable file nm as arg     \n"      "   ; skip the extra args calc by dl_start()                \n"      "   ld_s    r1, [sp]       ; orig argc from aux-vec Tbl     \n" -#ifdef STAR_9000535888_FIXED -    "   ld      r12, [pcl, _dl_skip_args-.+(.&2)]               \n" -#else -    "   add     r12, pcl, _dl_skip_args-.+(.&2)                 \n" -    "   ld      r12, [r12]                                      \n" -#endif +    "   ld      r12, [pcl, _dl_skip_args@pcl]                   \n" -    "   add     r2, pcl, _dl_fini-.+(.&2)   ; finalizer         \n" +    "   add     r2, pcl, _dl_fini@pcl       ; finalizer         \n"      "   add2    sp, sp, r12    ; discard argv entries from stack\n"      "   sub_s   r1, r1, r12    ; adjusted argc, on stack        \n" diff --git a/ldso/ldso/arc/dl-sysdep.h b/ldso/ldso/arc/dl-sysdep.h index 97ce28492..af4b18064 100644 --- a/ldso/ldso/arc/dl-sysdep.h +++ b/ldso/ldso/arc/dl-sysdep.h @@ -124,14 +124,21 @@ static __always_inline Elf32_Addr elf_machine_dynamic(void)  /* Return the run-time load address of the shared object.  */  static __always_inline Elf32_Addr elf_machine_load_address(void)  { -    /* To find the loadaddr we subtract the runtime addr of any symbol -     * say _dl_start from it's build-time addr. +    /* To find the loadaddr we subtract the runtime addr of a non-local symbol +     * say _DYNAMIC from it's build-time addr. +     * N.B., gotpc loads get optimized by the linker if it finds the symbol +     * is resolved locally. +     * A more robust - and efficient - solution would be to use a symbol +     * set by the linker.  To make it actually save space, we'd have to +     * suppress the unwanted text relocation in the linked dso, though. +     * (I.e. in ldso.so.*, though it's just another dso as far as bfd/ld +     * are concerned.)       */  	Elf32_Addr addr, tmp;  	__asm__ ( -        "ld  %1, [pcl, _dl_start@gotpc] ;build addr of _dl_start   \n" -        "add %0, pcl, _dl_start-.+(.&2) ;runtime addr of _dl_start \n" -        "sub %0, %0, %1                 ;delta                     \n" +        "ld  %1, [pcl, _DYNAMIC@gotpc] ;build addr of _DYNAMIC"   "\n" +        "add %0, pcl, _DYNAMIC@pcl     ;runtime addr of _DYNAMIC" "\n" +        "sub %0, %0, %1                ;delta"                    "\n"          : "=&r" (addr), "=r"(tmp)      );  	return addr; | 
