aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSzabolcs Nagy <nsz@port70.net>2015-07-24 10:05:07 +0100
committerSzabolcs Nagy <nsz@port70.net>2015-07-24 10:05:07 +0100
commit3bcea719ddd6ce399d7bccb492c40af77d216e42 (patch)
tree11cb6c22b54b144e4b01e99c754ee0e7805c26c1
parent0910702c4d2cf9e8302b35c9519548726e1ac489 (diff)
downloadglibc-3bcea719ddd6ce399d7bccb492c40af77d216e42.zip
glibc-3bcea719ddd6ce399d7bccb492c40af77d216e42.tar.gz
glibc-3bcea719ddd6ce399d7bccb492c40af77d216e42.tar.bz2
[ARM][BZ #17711] Fix extern protected data handling
Fixes elf/tst-protected1a and elf/tst-protected1b tests. Depends on a gcc patch that makes protected visibility data non-local: https://gcc.gnu.org/ml/gcc-patches/2015-07/msg01871.html and on a binutils patch so R_*_GLOB_DAT relocs are used for it: https://sourceware.org/ml/binutils/2015-07/msg00247.html
-rw-r--r--ChangeLog3
-rw-r--r--sysdeps/arm/dl-machine.h10
-rw-r--r--sysdeps/arm/dl-sysdep.h2
3 files changed, 12 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index ecce7f3..6f6016d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,9 @@
* sysdeps/aarch64/dl-sysdep.h (DL_EXTERN_PROTECTED_DATA): Define.
* sysdeps/aarch64/dl-machine.h (elf_machine_type_class): Handle
ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA.
+ * sysdeps/arm/dl-sysdep.h (DL_EXTERN_PROTECTED_DATA): Define.
+ * sysdeps/arm/dl-machine.h (elf_machine_type_class): Handle
+ ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA.
2015-07-24 Siddhesh Poyarekar <siddhesh@redhat.com>
diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h
index f901538..6fb20bd 100644
--- a/sysdeps/arm/dl-machine.h
+++ b/sysdeps/arm/dl-machine.h
@@ -224,18 +224,22 @@ _dl_start_user:\n\
TLS variable, so undefined references should not be allowed to
define the value.
ELF_RTYPE_CLASS_COPY iff TYPE should not be allowed to resolve to one
- of the main executable's symbols, as for a COPY reloc. */
+ of the main executable's symbols, as for a COPY reloc.
+ ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA iff TYPE describes relocation against
+ protected data whose address may be external due to copy relocation. */
#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))
+ | (((type) == R_ARM_COPY) * ELF_RTYPE_CLASS_COPY) \
+ | (((type) == R_ARM_GLOB_DAT) * ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA))
#else
#define elf_machine_type_class(type) \
((((type) == R_ARM_JUMP_SLOT) * ELF_RTYPE_CLASS_PLT) \
- | (((type) == R_ARM_COPY) * ELF_RTYPE_CLASS_COPY))
+ | (((type) == R_ARM_COPY) * ELF_RTYPE_CLASS_COPY) \
+ | (((type) == R_ARM_GLOB_DAT) * ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA))
#endif
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
diff --git a/sysdeps/arm/dl-sysdep.h b/sysdeps/arm/dl-sysdep.h
index e5657dd..463ce59 100644
--- a/sysdeps/arm/dl-sysdep.h
+++ b/sysdeps/arm/dl-sysdep.h
@@ -21,3 +21,5 @@
/* _dl_argv cannot be attribute_relro, because _dl_start_user
might write into it after _dl_start returns. */
#define DL_ARGV_NOT_RELRO 1
+
+#define DL_EXTERN_PROTECTED_DATA