[PATCH 02/11] alpha: set DF_TEXTREL rather than DT_TEXTREL in info->flags

Matt Turner <[email protected]>
Newsgroups gmane.comp.gnu.binutils
Message-ID <[email protected]>
elf64_alpha_calc_dynrel_sizes ORs DT_TEXTREL (22) into info->flags where
it means DF_TEXTREL (4). The value happens to include the DF_TEXTREL
bit, so DT_TEXTREL still appeared, but DT_FLAGS also gained DF_SYMBOLIC
and DF_STATIC_TLS: a shared library with a text relocation against a
global symbol was treated by the dynamic linker as if linked with
-Bsymbolic, and dlopen of it could fail for lack of static TLS.

The stray DF_STATIC_TLS also fed back into the link:
elf64_alpha_relax_sec reads info->flags to decide that a general dynamic
TLS reference may as well be relaxed to initial exec, so such a library
was relaxed differently too.

Present since commit fcfbdf319ee in 2001, which introduced both this and
the correct DF_TEXTREL a few lines above it.
---
 bfd/elf64-alpha.c               |  2 +-
 ld/testsuite/ld-alpha/textrel.d |  9 +++++++++
 ld/testsuite/ld-alpha/textrel.s | 13 +++++++++++++
 3 files changed, 23 insertions(+), 1 deletion(-)
 create mode 100644 ld/testsuite/ld-alpha/textrel.d
 create mode 100644 ld/testsuite/ld-alpha/textrel.s

diff --git ./bfd/elf64-alpha.c ./bfd/elf64-alpha.c
index 4fc1a542704..a97acdc41de 100644
--- ./bfd/elf64-alpha.c
+++ ./bfd/elf64-alpha.c
@@ -2667,7 +2667,7 @@ elf64_alpha_calc_dynrel_sizes (struct alpha_elf_link_hash_entry *h,
 	    entries * sizeof (Elf64_External_Rela) * relent->count;
 	  if ((sec->flags & SEC_READONLY) != 0)
 	    {
-	      info->flags |= DT_TEXTREL;
+	      info->flags |= DF_TEXTREL;
 	      info->callbacks->minfo
 		(_("%pB: dynamic relocation against `%pT' in "
 		   "read-only section `%pA'\n"),
diff --git ./ld/testsuite/ld-alpha/textrel.d ./ld/testsuite/ld-alpha/textrel.d
new file mode 100644
index 00000000000..e319ab203d3
--- /dev/null
+++ ./ld/testsuite/ld-alpha/textrel.d
@@ -0,0 +1,9 @@
+#source: textrel.s
+#ld: -shared -melf64alpha -z notext
+#readelf: -d
+
+# Only DT_TEXTREL, with no DT_FLAGS carrying the SYMBOLIC and STATIC_TLS
+# bits of the value of DT_TEXTREL.
+#...
+ +0x0+16 +\(TEXTREL\) +0x0
+ +0x0+0 +\(NULL\) +0x0
diff --git ./ld/testsuite/ld-alpha/textrel.s ./ld/testsuite/ld-alpha/textrel.s
new file mode 100644
index 00000000000..bbd0675363d
--- /dev/null
+++ ./ld/testsuite/ld-alpha/textrel.s
@@ -0,0 +1,13 @@
+	.text
+	.globl	_start
+_start:
+	ret
+
+	.data
+	.globl	var
+var:
+	.quad	0
+
+	# A dynamic relocation against a global symbol in a read-only section.
+	.section .rodata,"a",@progbits
+	.quad	var
-- 
2.54.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.