From 6dcecc64865ece5109260fd89d876c83b173e6d8 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Wed, 26 Oct 2011 16:16:52 +0000 Subject: [PATCH] Restore non-__thread cases for ARM that were used in dynamic linker. --- ChangeLog.arm | 5 +++++ sysdeps/arm/dl-machine.h | 8 +++++++- sysdeps/unix/arm/sysdep.S | 11 +++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/ChangeLog.arm b/ChangeLog.arm index ba319b8..c61cfe4 100644 --- a/ChangeLog.arm +++ b/ChangeLog.arm @@ -1,3 +1,8 @@ +2011-10-26 Joseph Myers + + * sysdeps/arm/dl-machine.h, sysdeps/unix/arm/sysdep.S: Restore + cases for use in rtld. + 2011-10-05 Andreas Schwab * sysdeps/arm/dl-machine.h (elf_machine_rel, elf_machine_rela) diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h index 5a58965..5ceeaa9 100644 --- a/sysdeps/arm/dl-machine.h +++ b/sysdeps/arm/dl-machine.h @@ -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 diff --git a/sysdeps/unix/arm/sysdep.S b/sysdeps/unix/arm/sysdep.S index dcd3ce2..2a534ba 100644 --- a/sysdeps/unix/arm/sysdep.S +++ b/sysdeps/unix/arm/sysdep.S @@ -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) -- 2.7.4