This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[committed, PATCH] Check GOTOFF reloc against protected data on x86


R_386_GOTOFF/R_X86_64_GOTOFF64 relocation shouldn't be used against
protected data symbol on x86 since with copy relocation, address of
protected data defined in the shared library may be external.

This patch will break building shared libraries with protected data
symbols using GCCs older than GCC 5 without the bug fix for

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65248

GCC backport request should be made in the GCC bug report above.

bfd/

	PR ld/pr17709
	* elf32-i386.c (elf_i386_relocate_section): Also check R_386_GOTOFF
	against protected data symbol when building shared library.
	* elf64-x86-64.c (elf_x86_64_relocate_section): Also check
	R_X86_64_GOTOFF64 against protected data symbol when building
	shared library.

ld/testsuite/

	PR ld/pr17709
	* ld-i386/protected6.d: New file.
	* ld-i386/protected6.s: Likewise.
	* ld-x86-64/protected6.d: Likewise.
	* ld-x86-64/protected6.s: Likewise.
	* ld-x86-64/protected7.d: Likewise.
	* ld-x86-64/protected7.s: Likewise.
	* ld-x86-64/protected7a.d: Likewise.
	* ld-x86-64/protected7b.d: Likewise.
---
 bfd/ChangeLog                        |  9 +++++++++
 bfd/elf32-i386.c                     | 17 ++++++++++-------
 bfd/elf64-x86-64.c                   | 15 +++++++++------
 ld/testsuite/ChangeLog               | 12 ++++++++++++
 ld/testsuite/ld-i386/i386.exp        |  1 +
 ld/testsuite/ld-i386/protected6.d    |  3 +++
 ld/testsuite/ld-i386/protected6.s    | 14 ++++++++++++++
 ld/testsuite/ld-x86-64/protected6.d  |  3 +++
 ld/testsuite/ld-x86-64/protected6.s  | 14 ++++++++++++++
 ld/testsuite/ld-x86-64/protected7.s  | 12 ++++++++++++
 ld/testsuite/ld-x86-64/protected7a.d |  4 ++++
 ld/testsuite/ld-x86-64/protected7b.d |  6 ++++++
 ld/testsuite/ld-x86-64/x86-64.exp    |  3 +++
 13 files changed, 100 insertions(+), 13 deletions(-)
 create mode 100644 ld/testsuite/ld-i386/protected6.d
 create mode 100644 ld/testsuite/ld-i386/protected6.s
 create mode 100644 ld/testsuite/ld-x86-64/protected6.d
 create mode 100644 ld/testsuite/ld-x86-64/protected6.s
 create mode 100644 ld/testsuite/ld-x86-64/protected7.s
 create mode 100644 ld/testsuite/ld-x86-64/protected7a.d
 create mode 100644 ld/testsuite/ld-x86-64/protected7b.d

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index dd30698..ea35435 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,14 @@
 2015-04-10  H.J. Lu  <hongjiu.lu@intel.com>
 
+	PR ld/pr17709
+	* elf32-i386.c (elf_i386_relocate_section): Also check R_386_GOTOFF
+	against protected data symbol when building shared library.
+	* elf64-x86-64.c (elf_x86_64_relocate_section): Also check
+	R_X86_64_GOTOFF64 against protected data symbol when building
+	shared library.
+
+2015-04-10  H.J. Lu  <hongjiu.lu@intel.com>
+
 	PR ld/pr15228
 	PR ld/pr17709
 	* elf-bfd.h (elf_backend_data): Add extern_protected_data.
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
index 52f4d33..af16da3 100644
--- a/bfd/elf32-i386.c
+++ b/bfd/elf32-i386.c
@@ -3714,10 +3714,10 @@ elf_i386_relocate_section (bfd *output_bfd,
 	  /* Relocation is relative to the start of the global offset
 	     table.  */
 
-	  /* Check to make sure it isn't a protected function symbol
-	     for shared library since it may not be local when used
-	     as function address.  We also need to make sure that a
-	     symbol is defined locally.  */
+	  /* Check to make sure it isn't a protected function or data
+	     symbol for shared library since it may not be local when
+	     used as function address or with copy relocation.  We also
+	     need to make sure that a symbol is defined locally.  */
 	  if (info->shared && h)
 	    {
 	      if (!h->def_regular)
@@ -3748,12 +3748,15 @@ elf_i386_relocate_section (bfd *output_bfd,
 		}
 	      else if (!info->executable
 		       && !SYMBOLIC_BIND (info, h)
-		       && h->type == STT_FUNC
+		       && (h->type == STT_FUNC
+			   || h->type == STT_OBJECT)
 		       && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
 		{
 		  (*_bfd_error_handler)
-		    (_("%B: relocation R_386_GOTOFF against protected function `%s' can not be used when making a shared object"),
-		     input_bfd, h->root.root.string);
+		    (_("%B: relocation R_386_GOTOFF against protected %s `%s' can not be used when making a shared object"),
+		     input_bfd,
+		     h->type == STT_FUNC ? "function" : "data",
+		     h->root.root.string);
 		  bfd_set_error (bfd_error_bad_value);
 		  return FALSE;
 		}
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index ab72306..2b37c27 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -3955,19 +3955,22 @@ elf_x86_64_relocate_section (bfd *output_bfd,
 	  /* Relocation is relative to the start of the global offset
 	     table.  */
 
-	  /* Check to make sure it isn't a protected function symbol
-	     for shared library since it may not be local when used
-	     as function address.  */
+	  /* Check to make sure it isn't a protected function or data
+	     symbol for shared library since it may not be local when
+	     used as function address or with copy relocation.  */
 	  if (!info->executable
 	      && h
 	      && !SYMBOLIC_BIND (info, h)
 	      && h->def_regular
-	      && h->type == STT_FUNC
+	      && (h->type == STT_FUNC
+		  || h->type == STT_OBJECT)
 	      && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
 	    {
 	      (*_bfd_error_handler)
-		(_("%B: relocation R_X86_64_GOTOFF64 against protected function `%s' can not be used when making a shared object"),
-		 input_bfd, h->root.root.string);
+		(_("%B: relocation R_X86_64_GOTOFF64 against protected %s `%s' can not be used when making a shared object"),
+		 input_bfd,
+		 h->type == STT_FUNC ? "function" : "data",
+		 h->root.root.string);
 	      bfd_set_error (bfd_error_bad_value);
 	      return FALSE;
 	    }
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 170ad04..c4bc387 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,5 +1,17 @@
 2015-04-10  H.J. Lu  <hongjiu.lu@intel.com>
 
+	PR ld/pr17709
+	* ld-i386/protected6.d: New file.
+	* ld-i386/protected6.s: Likewise.
+	* ld-x86-64/protected6.d: Likewise.
+	* ld-x86-64/protected6.s: Likewise.
+	* ld-x86-64/protected7.d: Likewise.
+	* ld-x86-64/protected7.s: Likewise.
+	* ld-x86-64/protected7a.d: Likewise.
+	* ld-x86-64/protected7b.d: Likewise.
+
+2015-04-10  H.J. Lu  <hongjiu.lu@intel.com>
+
 	PR ld/pr15228
 	PR ld/pr17709
 	* ld-i386/i386.exp (i386tests): Add a test for PR ld/17709.
diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp
index 3fdd39c..3dd1139 100644
--- a/ld/testsuite/ld-i386/i386.exp
+++ b/ld/testsuite/ld-i386/i386.exp
@@ -236,6 +236,7 @@ run_dump_test "protected2"
 run_dump_test "protected3"
 run_dump_test "protected4"
 run_dump_test "protected5"
+run_dump_test "protected6"
 run_dump_test "tlspie1"
 run_dump_test "tlspie2"
 run_dump_test "nogot1"
diff --git a/ld/testsuite/ld-i386/protected6.d b/ld/testsuite/ld-i386/protected6.d
new file mode 100644
index 0000000..37d5132
--- /dev/null
+++ b/ld/testsuite/ld-i386/protected6.d
@@ -0,0 +1,3 @@
+#as: --32
+#ld: -shared -melf_i386
+#error: .*relocation R_386_GOTOFF against protected data `foo' can not be used when making a shared object
diff --git a/ld/testsuite/ld-i386/protected6.s b/ld/testsuite/ld-i386/protected6.s
new file mode 100644
index 0000000..f57900e
--- /dev/null
+++ b/ld/testsuite/ld-i386/protected6.s
@@ -0,0 +1,14 @@
+	.data
+	.protected	foo
+	.globl foo
+	.align 4
+	.type	foo, @object
+	.size	foo, 4
+foo:
+	.long	1
+	.text
+	.globl bar
+	.type	bar, @function
+bar:
+	movl	foo@GOTOFF(%ecx), %eax
+	.size	bar, .-bar
diff --git a/ld/testsuite/ld-x86-64/protected6.d b/ld/testsuite/ld-x86-64/protected6.d
new file mode 100644
index 0000000..872a9f6
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/protected6.d
@@ -0,0 +1,3 @@
+#as: --64
+#ld: -shared -melf_x86_64
+#error: .*relocation R_X86_64_GOTOFF64 against protected data `foo' can not be used when making a shared object
diff --git a/ld/testsuite/ld-x86-64/protected6.s b/ld/testsuite/ld-x86-64/protected6.s
new file mode 100644
index 0000000..8ac69c5
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/protected6.s
@@ -0,0 +1,14 @@
+	.protected	foo
+.globl foo
+	.data
+	.align 4
+	.type	foo, @object
+	.size	foo, 4
+foo:
+	.long	1
+	.text
+	.globl bar
+	.type	bar, @function
+bar:
+	movabsq	$foo@GOTOFF, %rax
+	.size	bar, .-bar
diff --git a/ld/testsuite/ld-x86-64/protected7.s b/ld/testsuite/ld-x86-64/protected7.s
new file mode 100644
index 0000000..df4765d
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/protected7.s
@@ -0,0 +1,12 @@
+	.text
+.globl foo
+	.protected	foo
+	.type	foo, @function
+foo:
+	ret
+	.size	foo, .-foo
+.globl bar
+	.type	bar, @function
+bar:
+	movabsq	$foo@GOTOFF, %rax
+	.size	bar, .-bar
diff --git a/ld/testsuite/ld-x86-64/protected7a.d b/ld/testsuite/ld-x86-64/protected7a.d
new file mode 100644
index 0000000..3082084
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/protected7a.d
@@ -0,0 +1,4 @@
+#source: protected7.s
+#as: --64
+#ld: -shared -melf_x86_64
+#error: .*relocation R_X86_64_GOTOFF64 against protected function `foo' can not be used when making a shared object
diff --git a/ld/testsuite/ld-x86-64/protected7b.d b/ld/testsuite/ld-x86-64/protected7b.d
new file mode 100644
index 0000000..e18026c
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/protected7b.d
@@ -0,0 +1,6 @@
+#source: protected7.s
+#as: --64
+#ld: -shared -Bsymbolic -melf_x86_64
+#readelf: -r
+
+There are no relocations in this file.
diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
index 98514ed..63754ef 100644
--- a/ld/testsuite/ld-x86-64/x86-64.exp
+++ b/ld/testsuite/ld-x86-64/x86-64.exp
@@ -218,6 +218,9 @@ run_dump_test "protected3"
 run_dump_test "protected3-l1om"
 run_dump_test "protected4"
 run_dump_test "protected5"
+run_dump_test "protected6"
+run_dump_test "protected7a"
+run_dump_test "protected7b"
 run_dump_test "tlsle1"
 run_dump_test "tlspie1"
 run_dump_test "unique1"
-- 
1.9.3


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]