This is the mail archive of the
libc-ports@sources.redhat.com
mailing list for the libc-ports project.
Re: Removing non-TLS support
- From: "Joseph S. Myers" <joseph at codesourcery dot com>
- To: libc-ports at sourceware dot org
- Date: Wed, 26 Oct 2011 16:22:40 +0000 (UTC)
- Subject: Re: Removing non-TLS support
- References: <Pine.LNX.4.64.1109111116000.24245@digraph.polyomino.org.uk>
My removing of non-USE___THREAD cases for ARM removed too much, since
USE___THREAD was 0 in the dynamlic linker although 1 elsewhere; I've
applied this fix to restore wrongly removed code. (The first change
probably isn't needed, although it makes things closer to how they were
before, but the second one definitely is.)
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 <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)
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)
--
Joseph S. Myers
joseph@codesourcery.com