diff options
| -rw-r--r-- | extra/Configs/defconfigs/arc/defconfig | 2 | ||||
| -rw-r--r-- | ldso/ldso/arc/dl-startup.h | 7 | ||||
| -rw-r--r-- | ldso/ldso/arc/dl-sysdep.h | 10 | 
3 files changed, 18 insertions, 1 deletions
diff --git a/extra/Configs/defconfigs/arc/defconfig b/extra/Configs/defconfigs/arc/defconfig index 840c59f0e..db4308f22 100644 --- a/extra/Configs/defconfigs/arc/defconfig +++ b/extra/Configs/defconfigs/arc/defconfig @@ -6,7 +6,7 @@ KERNEL_HEADERS="%KERNEL_HEADERS%"  # LDSO_CACHE_SUPPORT is not set  LDSO_RUNPATH=y  # LDSO_SAFE_RUNPATH is not set -UCLIBC_HAS_THREADS_NATIVE=y +LINUXTHREADS_OLD=y  PTHREADS_DEBUG_SUPPORT=y  UCLIBC_HAS_OBSTACK=y  UCLIBC_SUSV2_LEGACY=y diff --git a/ldso/ldso/arc/dl-startup.h b/ldso/ldso/arc/dl-startup.h index 8e26ae8d9..ef89b5317 100644 --- a/ldso/ldso/arc/dl-startup.h +++ b/ldso/ldso/arc/dl-startup.h @@ -33,9 +33,16 @@ __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 __UCLIBC_HAS_THREADS_NATIVE__      "   ld      r12, [pcl, _dl_skip_args@pcl]                   \n"      "   add     r2, pcl, _dl_fini@pcl       ; finalizer         \n" +#else +    "   add     r12, pcl, _dl_skip_args-.+(.&2)                 \n" +    "   ld      r12, [r12]                                      \n" +    "   add     r2, pcl, _dl_fini-.+(.&2)   ; finalizer         \n" +#endif      "   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 d71e16b32..08b3bade8 100644 --- a/ldso/ldso/arc/dl-sysdep.h +++ b/ldso/ldso/arc/dl-sysdep.h @@ -127,6 +127,7 @@ 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)  { +#ifdef __UCLIBC_HAS_THREADS_NATIVE__      /* 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 @@ -144,6 +145,15 @@ static __always_inline Elf32_Addr elf_machine_load_address(void)          "sub %0, %0, %1                ;delta"                    "\n"          : "=&r" (addr), "=r"(tmp)      ); +#else +	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" +         : "=&r" (addr), "=r"(tmp) +     ); +#endif  	return addr;  }  | 
