This is the mail archive of the binutils-cvs@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]

[binutils-gdb] Replace SYMBOLIC_BIND with SYMBOL_REFERENCES_LOCAL


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=e3c0e327923e27c7d96e6e44e22e10998ff158d7

commit e3c0e327923e27c7d96e6e44e22e10998ff158d7
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Sat Apr 11 07:34:49 2015 -0700

    Replace SYMBOLIC_BIND with SYMBOL_REFERENCES_LOCAL
    
    When checking R_386_GOTOFF/R_X86_64_GOTOFF64 for building shared library,
    we should check SYMBOL_REFERENCES_LOCAL instead of SYMBOLIC_BIND to cover
    more cases.
    
    bfd/
    
    	* elf32-i386.c (elf_i386_relocate_section): Replace SYMBOLIC_BIND
    	with SYMBOL_REFERENCES_LOCAL when checking R_386_GOTOFF against
    	protected data symbol when building shared library.
    	* elf64-x86-64.c (elf_x86_64_relocate_section): Check
    	R_X86_64_GOTOFF64 against undefined symbol and replace
    	SYMBOLIC_BIND with SYMBOL_REFERENCES_LOCAL when checking
    	R_X86_64_GOTOFF64 against protected data symbol when building
    	shared library.
    
    ld/testsuite/
    
    	* ld-i386/i386.exp: Run protected6a.
    	* ld-i386/protected6.d: Renamed to ...
    	* ld-i386/protected6a.d: This.
    	* ld-x86-64/hidden4.d: New file.
    	* ld-x86-64/hidden4.s: Likewise.
    	* ld-x86-64/hidden5.d: Likewise.
    	* ld-x86-64/hidden5.s: Likewise.
    	* ld-x86-64/protected6.d: Renamed to ...
    	* ld-x86-64/protected6a.d: This.
    	* ld-x86-64/x86-64.exp: Run hidden4, hidden5, protected6a,
    	protected7a and protected7b.

Diff:
---
 bfd/ChangeLog                                      | 11 +++++
 bfd/elf32-i386.c                                   |  4 +-
 bfd/elf64-x86-64.c                                 | 56 ++++++++++++++++------
 ld/testsuite/ChangeLog                             | 14 ++++++
 ld/testsuite/ld-i386/i386.exp                      |  2 +-
 .../ld-i386/{protected6.d => protected6a.d}        |  1 +
 ld/testsuite/ld-x86-64/hidden4.d                   |  3 ++
 ld/testsuite/ld-x86-64/hidden4.s                   |  8 ++++
 ld/testsuite/ld-x86-64/hidden5.d                   |  3 ++
 ld/testsuite/ld-x86-64/hidden5.s                   |  7 +++
 .../ld-x86-64/{protected6.d => protected6a.d}      |  1 +
 ld/testsuite/ld-x86-64/x86-64.exp                  |  4 +-
 12 files changed, 96 insertions(+), 18 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index ea35435..207884a 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,14 @@
+2015-04-11  H.J. Lu  <hongjiu.lu@intel.com>
+
+	* elf32-i386.c (elf_i386_relocate_section): Replace SYMBOLIC_BIND
+	with SYMBOL_REFERENCES_LOCAL when checking R_386_GOTOFF against
+	protected data symbol when building shared library.
+	* elf64-x86-64.c (elf_x86_64_relocate_section): Check
+	R_X86_64_GOTOFF64 against undefined symbol and replace
+	SYMBOLIC_BIND with SYMBOL_REFERENCES_LOCAL when checking
+	R_X86_64_GOTOFF64 against protected data symbol when building
+	shared library.
+
 2015-04-10  H.J. Lu  <hongjiu.lu@intel.com>
 
 	PR ld/pr17709
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
index af16da3..f71bce1 100644
--- a/bfd/elf32-i386.c
+++ b/bfd/elf32-i386.c
@@ -3717,7 +3717,7 @@ elf_i386_relocate_section (bfd *output_bfd,
 	  /* 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.  */
+	     need to make sure that a symbol is referenced locally.  */
 	  if (info->shared && h)
 	    {
 	      if (!h->def_regular)
@@ -3747,7 +3747,7 @@ elf_i386_relocate_section (bfd *output_bfd,
 		  return FALSE;
 		}
 	      else if (!info->executable
-		       && !SYMBOLIC_BIND (info, h)
+		       && !SYMBOL_REFERENCES_LOCAL (info, h)
 		       && (h->type == STT_FUNC
 			   || h->type == STT_OBJECT)
 		       && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index 2b37c27..a3604c7 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -3957,22 +3957,50 @@ elf_x86_64_relocate_section (bfd *output_bfd,
 
 	  /* 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_OBJECT)
-	      && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
+	     used as function address or with copy relocation.  We also
+	     need to make sure that a symbol is referenced locally.  */
+	  if (info->shared && h)
 	    {
-	      (*_bfd_error_handler)
-		(_("%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);
+	      if (!h->def_regular)
+		{
+		  const char *v;
+
+		  switch (ELF_ST_VISIBILITY (h->other))
+		    {
+		    case STV_HIDDEN:
+		      v = _("hidden symbol");
+		      break;
+		    case STV_INTERNAL:
+		      v = _("internal symbol");
+		      break;
+		    case STV_PROTECTED:
+		      v = _("protected symbol");
+		      break;
+		    default:
+		      v = _("symbol");
+		      break;
+		    }
+
+		  (*_bfd_error_handler)
+		    (_("%B: relocation R_X86_64_GOTOFF64 against undefined %s `%s' can not be used when making a shared object"),
+		     input_bfd, v, h->root.root.string);
+		  bfd_set_error (bfd_error_bad_value);
+		  return FALSE;
+		}
+	      else if (!info->executable
+		       && !SYMBOL_REFERENCES_LOCAL (info, h)
+		       && (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 %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;
+		}
 	    }
 
 	  /* Note that sgot is not involved in this
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index c4bc387..8b45279 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,17 @@
+2015-04-11  H.J. Lu  <hongjiu.lu@intel.com>
+
+	* ld-i386/i386.exp: Run protected6a.
+	* ld-i386/protected6.d: Renamed to ...
+	* ld-i386/protected6a.d: This.
+	* ld-x86-64/hidden4.d: New file.
+	* ld-x86-64/hidden4.s: Likewise.
+	* ld-x86-64/hidden5.d: Likewise.
+	* ld-x86-64/hidden5.s: Likewise.
+	* ld-x86-64/protected6.d: Renamed to ...
+	* ld-x86-64/protected6a.d: This.
+	* ld-x86-64/x86-64.exp: Run hidden4, hidden5, protected6a,
+	protected7a and protected7b.
+
 2015-04-10  H.J. Lu  <hongjiu.lu@intel.com>
 
 	PR ld/pr17709
diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp
index 3dd1139..0c0fd96 100644
--- a/ld/testsuite/ld-i386/i386.exp
+++ b/ld/testsuite/ld-i386/i386.exp
@@ -236,7 +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 "protected6a"
 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/protected6a.d
similarity index 86%
rename from ld/testsuite/ld-i386/protected6.d
rename to ld/testsuite/ld-i386/protected6a.d
index 37d5132..7dc3504 100644
--- a/ld/testsuite/ld-i386/protected6.d
+++ b/ld/testsuite/ld-i386/protected6a.d
@@ -1,3 +1,4 @@
+#source: protected6.s
 #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-x86-64/hidden4.d b/ld/testsuite/ld-x86-64/hidden4.d
new file mode 100644
index 0000000..2f36d008
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/hidden4.d
@@ -0,0 +1,3 @@
+#as: --64
+#ld: -shared -melf_x86_64
+#error: .*relocation R_X86_64_GOTOFF64 against undefined hidden symbol `foo' can not be used when making a shared object
diff --git a/ld/testsuite/ld-x86-64/hidden4.s b/ld/testsuite/ld-x86-64/hidden4.s
new file mode 100644
index 0000000..3e6a2a1
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/hidden4.s
@@ -0,0 +1,8 @@
+	.text
+.globl bar
+	.type	bar, @function
+bar:
+	movabsq	$foo@GOTOFF, %rax
+	.size	bar, .-bar
+	.weak	foo
+	.hidden	foo
diff --git a/ld/testsuite/ld-x86-64/hidden5.d b/ld/testsuite/ld-x86-64/hidden5.d
new file mode 100644
index 0000000..2f36d008
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/hidden5.d
@@ -0,0 +1,3 @@
+#as: --64
+#ld: -shared -melf_x86_64
+#error: .*relocation R_X86_64_GOTOFF64 against undefined hidden symbol `foo' can not be used when making a shared object
diff --git a/ld/testsuite/ld-x86-64/hidden5.s b/ld/testsuite/ld-x86-64/hidden5.s
new file mode 100644
index 0000000..f356076
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/hidden5.s
@@ -0,0 +1,7 @@
+	.text
+.globl bar
+	.type	bar, @function
+bar:
+	movabsq	$foo@GOTOFF, %rax
+	.size	bar, .-bar
+	.hidden	foo
diff --git a/ld/testsuite/ld-x86-64/protected6.d b/ld/testsuite/ld-x86-64/protected6a.d
similarity index 87%
rename from ld/testsuite/ld-x86-64/protected6.d
rename to ld/testsuite/ld-x86-64/protected6a.d
index 872a9f6..3a7963f 100644
--- a/ld/testsuite/ld-x86-64/protected6.d
+++ b/ld/testsuite/ld-x86-64/protected6a.d
@@ -1,3 +1,4 @@
+#source: protected6.s
 #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/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
index 63754ef..213a4c0 100644
--- a/ld/testsuite/ld-x86-64/x86-64.exp
+++ b/ld/testsuite/ld-x86-64/x86-64.exp
@@ -211,6 +211,8 @@ run_dump_test "tlsie3"
 run_dump_test "hidden1"
 run_dump_test "hidden2"
 run_dump_test "hidden3"
+run_dump_test "hidden4"
+run_dump_test "hidden5"
 run_dump_test "protected1"
 run_dump_test "protected2"
 run_dump_test "protected2-l1om"
@@ -218,7 +220,7 @@ run_dump_test "protected3"
 run_dump_test "protected3-l1om"
 run_dump_test "protected4"
 run_dump_test "protected5"
-run_dump_test "protected6"
+run_dump_test "protected6a"
 run_dump_test "protected7a"
 run_dump_test "protected7b"
 run_dump_test "tlsle1"


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