Restore non-__thread cases for ARM that were used in dynamic linker.
authorJoseph Myers <joseph@codesourcery.com>
Wed, 26 Oct 2011 16:16:52 +0000 (16:16 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Wed, 26 Oct 2011 16:18:21 +0000 (16:18 +0000)
ChangeLog.arm
sysdeps/arm/dl-machine.h
sysdeps/unix/arm/sysdep.S

index ba319b8..c61cfe4 100644 (file)
@@ -1,3 +1,8 @@
+2011-10-26  Joseph Myers  <joseph@codesourcery.com>
+
+       * sysdeps/arm/dl-machine.h, sysdeps/unix/arm/sysdep.S: Restore
+       cases for use in rtld.
+
 2011-10-05  Andreas Schwab  <schwab@redhat.com>
 
        * sysdeps/arm/dl-machine.h (elf_machine_rel, elf_machine_rela)
index 5a58965..5ceeaa9 100644 (file)
@@ -242,12 +242,18 @@ _dl_start_user:\n\
    define the value.
    ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
    of the main executable's symbols, as for a COPY reloc.  */
-#define elf_machine_type_class(type) \
+#ifndef RTLD_BOOTSTRAP
+# define elf_machine_type_class(type) \
   ((((type) == R_ARM_JUMP_SLOT || (type) == R_ARM_TLS_DTPMOD32         \
      || (type) == R_ARM_TLS_DTPOFF32 || (type) == R_ARM_TLS_TPOFF32    \
      || (type) == R_ARM_TLS_DESC)                                      \
     * ELF_RTYPE_CLASS_PLT)                                             \
    | (((type) == R_ARM_COPY) * ELF_RTYPE_CLASS_COPY))
+#else
+#define elf_machine_type_class(type) \
+  ((((type) == R_ARM_JUMP_SLOT) * ELF_RTYPE_CLASS_PLT) \
+   | (((type) == R_ARM_COPY) * ELF_RTYPE_CLASS_COPY))
+#endif
 
 /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
 #define ELF_MACHINE_JMP_SLOT   R_ARM_JUMP_SLOT
index dcd3ce2..2a534ba 100644 (file)
@@ -42,6 +42,7 @@ syscall_error:
        moveq r0, $EAGAIN       /* Yes; translate it to EAGAIN.  */
 #endif
 
+#ifndef IS_IN_rtld
        mov ip, lr
        cfi_register (lr, ip)
        mov r1, r0
@@ -57,6 +58,16 @@ syscall_error:
        RETINSTR (, ip)
 
 1:     .word errno(gottpoff) + (. - 2b - 8)
+#elif RTLD_PRIVATE_ERRNO
+       ldr r1, 1f
+0:     str r0, [pc, r1]
+       mvn r0, $0
+       DO_RET(r14)
+
+1:     .word C_SYMBOL_NAME(rtld_errno) - 0b - 8
+#else
+#error "Unsupported non-TLS case"
+#endif
 
 #undef __syscall_error
 END (__syscall_error)