OSDN Git Service

bfd/
authorhjl <hjl>
Sun, 16 Mar 2008 22:26:22 +0000 (22:26 +0000)
committerhjl <hjl>
Sun, 16 Mar 2008 22:26:22 +0000 (22:26 +0000)
2008-03-16  H.J. Lu  <hongjiu.lu@intel.com>

PR ld/5789
PR ld/5943
* elf32-i386.c  (elf_i386_relocate_section): Issue an error
for R_386_GOTOFF relocaton against undefined hidden/internal
symbols when building a shared object.

* elf64-x86-64.c (elf64_x86_64_relocate_section): Issue an
error for R_X86_64_PC8/R_X86_64_PC16/R_X86_64_PC32
relocaton against undefined hidden/internal symbols when
building a shared object.
(elf64_x86_64_finish_dynamic_symbol): Return FALSE when symbol
is referenced locally, but isn't defined in a regular file.

ld/testsuite/

2008-03-16  H.J. Lu  <hongjiu.lu@intel.com>

PR ld/5789
PR ld/5943
* ld-i386/hidden1.d: New.
* ld-i386/hidden1.s: Likewise.
* ld-i386/hidden2.d: Likewise.
* ld-i386/hidden2.s: Likewise.
* ld-i386/hidden3.d: Likewise.
* ld-i386/hidden4.s: Likewise.
* ld-i386/protected1.d: Likewise.
* ld-i386/protected1.s: Likewise.
* ld-i386/protected2.d: Likewise.
* ld-i386/protected2.s: Likewise.
* ld-i386/protected3.d: Likewise.
* ld-i386/protected3.s: Likewise.
* ld-x86-64/hidden1.d: Likewise.
* ld-x86-64/hidden1.s: Likewise.
* ld-x86-64/hidden2.d: Likewise.
* ld-x86-64/hidden2.s: Likewise.
* ld-x86-64/hidden3.d: Likewise.
* ld-x86-64/hidden3.s: Likewise.
* ld-x86-64/protected1.d: Likewise.
* ld-x86-64/protected1.s: Likewise.
* ld-x86-64/protected2.d: Likewise.
* ld-x86-64/protected2.s: Likewise.
* ld-x86-64/protected3.d: Likewise.
* ld-x86-64/protected3.s: Likewise.

* ld-i386/i386.exp: Run hidden1, hidden2, hidden3, protected1,
protected2 and protected3.
* ld-x86-64/x86-64.exp: Likewise.

30 files changed:
bfd/ChangeLog
bfd/elf32-i386.c
bfd/elf64-x86-64.c
ld/testsuite/ChangeLog
ld/testsuite/ld-i386/hidden1.d [new file with mode: 0644]
ld/testsuite/ld-i386/hidden1.s [new file with mode: 0644]
ld/testsuite/ld-i386/hidden2.d [new file with mode: 0644]
ld/testsuite/ld-i386/hidden2.s [new file with mode: 0644]
ld/testsuite/ld-i386/hidden3.d [new file with mode: 0644]
ld/testsuite/ld-i386/hidden3.s [new file with mode: 0644]
ld/testsuite/ld-i386/i386.exp
ld/testsuite/ld-i386/protected1.d [new file with mode: 0644]
ld/testsuite/ld-i386/protected1.s [new file with mode: 0644]
ld/testsuite/ld-i386/protected2.d [new file with mode: 0644]
ld/testsuite/ld-i386/protected2.s [new file with mode: 0644]
ld/testsuite/ld-i386/protected3.d [new file with mode: 0644]
ld/testsuite/ld-i386/protected3.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/hidden1.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/hidden1.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/hidden2.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/hidden2.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/hidden3.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/hidden3.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/protected1.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/protected1.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/protected2.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/protected2.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/protected3.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/protected3.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp

index 7eb56a2..f882a22 100644 (file)
@@ -1,3 +1,18 @@
+2008-03-16  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/5789
+       PR ld/5943
+       * elf32-i386.c  (elf_i386_relocate_section): Issue an error
+       for R_386_GOTOFF relocaton against undefined hidden/internal
+       symbols when building a shared object.
+
+       * elf64-x86-64.c (elf64_x86_64_relocate_section): Issue an
+       error for R_X86_64_PC8/R_X86_64_PC16/R_X86_64_PC32
+       relocaton against undefined hidden/internal symbols when
+       building a shared object.
+       (elf64_x86_64_finish_dynamic_symbol): Return FALSE when symbol
+       is referenced locally, but isn't defined in a regular file.
+
 2008-03-15  H.J. Lu  <hongjiu.lu@intel.com>
 
        * bfd-in.h (BFD_NO_FLAGS, HAS_RELOC, EXEC_P, HAS_LINENO,
index 432e7d3..c10dbb3 100644 (file)
@@ -2753,19 +2753,46 @@ elf_i386_relocate_section (bfd *output_bfd,
 
          /* 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.  */
-         if (info->shared
-             && !info->executable
-             && h
-             && h->def_regular
-             && h->type == STT_FUNC
-             && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
+            as function address.  We also need to make sure that a
+            symbol is defined locally.  */
+         if (info->shared && h)
            {
-             (*_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);
-             bfd_set_error (bfd_error_bad_value);
-             return FALSE;
+             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_386_GOTOFF 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
+                      && h->type == STT_FUNC
+                      && 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);
+                 bfd_set_error (bfd_error_bad_value);
+                 return FALSE;
+               }
            }
 
          /* Note that sgot is not involved in this
index 3e508e0..71c10a7 100644 (file)
@@ -2595,30 +2595,63 @@ elf64_x86_64_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
        case R_X86_64_PC16:
        case R_X86_64_PC32:
          if (info->shared
-             && !SYMBOL_REFERENCES_LOCAL (info, h)
              && (input_section->flags & SEC_ALLOC) != 0
              && (input_section->flags & SEC_READONLY) != 0
-             && (!h->def_regular
-                 || r_type != R_X86_64_PC32
-                 || h->type != STT_FUNC
-                 || ELF_ST_VISIBILITY (h->other) != STV_PROTECTED
-                 || !is_32bit_relative_branch (contents,
-                                               rel->r_offset)))
+             && h != NULL)
            {
-             if (h->def_regular
-                 && r_type == R_X86_64_PC32
-                 && h->type == STT_FUNC
-                 && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
-               (*_bfd_error_handler)
-                  (_("%B: relocation R_X86_64_PC32 against protected function `%s' can not be used when making a shared object"),
-                   input_bfd, h->root.root.string);
+             bfd_boolean fail = FALSE;
+             bfd_boolean branch
+               = (r_type == R_X86_64_PC32
+                  && is_32bit_relative_branch (contents, rel->r_offset));
+
+             if (SYMBOL_REFERENCES_LOCAL (info, h))
+               {
+                 /* Symbol is referenced locally.  Make sure it is
+                    defined locally or for a branch.  */
+                 fail = !h->def_regular && !branch;
+               }
              else
-               (*_bfd_error_handler)
-                 (_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
-                  input_bfd, x86_64_elf_howto_table[r_type].name,
-                  h->root.root.string);
-             bfd_set_error (bfd_error_bad_value);
-             return FALSE;
+               {
+                 /* Symbol isn't referenced locally.  We only allow
+                    branch to symbol with non-default visibility. */
+                 fail = (!branch
+                         || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT);
+               }
+
+             if (fail)
+               {
+                 const char *fmt;
+                 const char *v;
+                 const char *pic = "";
+
+                 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");
+                     pic = _("; recompile with -fPIC");
+                     break;
+                   }
+
+                 if (h->def_regular)
+                   fmt = _("%B: relocation %s against %s `%s' can not be used when making a shared object%s");
+                 else
+                   fmt = _("%B: relocation %s against undefined %s `%s' can not be used when making a shared object%s");
+
+                 (*_bfd_error_handler) (fmt, input_bfd,
+                                        x86_64_elf_howto_table[r_type].name,
+                                        v,  h->root.root.string, pic);
+                 bfd_set_error (bfd_error_bad_value);
+                 return FALSE;
+               }
            }
          /* Fall through.  */
 
@@ -3343,6 +3376,8 @@ elf64_x86_64_finish_dynamic_symbol (bfd *output_bfd,
       if (info->shared
          && SYMBOL_REFERENCES_LOCAL (info, h))
        {
+         if (!h->def_regular)
+           return FALSE;
          BFD_ASSERT((h->got.offset & 1) != 0);
          rela.r_info = ELF64_R_INFO (0, R_X86_64_RELATIVE);
          rela.r_addend = (h->root.u.def.value
index 9ddae66..2f5fab8 100644 (file)
@@ -1,3 +1,36 @@
+2008-03-16  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/5789
+       PR ld/5943
+       * ld-i386/hidden1.d: New.
+       * ld-i386/hidden1.s: Likewise.
+       * ld-i386/hidden2.d: Likewise.
+       * ld-i386/hidden2.s: Likewise.
+       * ld-i386/hidden3.d: Likewise.
+       * ld-i386/hidden4.s: Likewise.
+       * ld-i386/protected1.d: Likewise.
+       * ld-i386/protected1.s: Likewise.
+       * ld-i386/protected2.d: Likewise.
+       * ld-i386/protected2.s: Likewise.
+       * ld-i386/protected3.d: Likewise.
+       * ld-i386/protected3.s: Likewise.
+       * ld-x86-64/hidden1.d: Likewise.
+       * ld-x86-64/hidden1.s: Likewise.
+       * ld-x86-64/hidden2.d: Likewise.
+       * ld-x86-64/hidden2.s: Likewise.
+       * ld-x86-64/hidden3.d: Likewise.
+       * ld-x86-64/hidden3.s: Likewise.
+       * ld-x86-64/protected1.d: Likewise.
+       * ld-x86-64/protected1.s: Likewise.
+       * ld-x86-64/protected2.d: Likewise.
+       * ld-x86-64/protected2.s: Likewise.
+       * ld-x86-64/protected3.d: Likewise.
+       * ld-x86-64/protected3.s: Likewise.
+
+       * ld-i386/i386.exp: Run hidden1, hidden2, hidden3, protected1,
+       protected2 and protected3.
+       * ld-x86-64/x86-64.exp: Likewise.
+
 2008-03-14  Alan Modra  <amodra@bigpond.net.au>
 
        * ld-spu/ovl2.s: Make setjmp global.
diff --git a/ld/testsuite/ld-i386/hidden1.d b/ld/testsuite/ld-i386/hidden1.d
new file mode 100644 (file)
index 0000000..5ace20d
--- /dev/null
@@ -0,0 +1,3 @@
+#as: --32
+#ld: -shared -melf_i386
+#error: .*relocation R_386_GOTOFF against undefined hidden symbol `foo' can not be used when making a shared object
diff --git a/ld/testsuite/ld-i386/hidden1.s b/ld/testsuite/ld-i386/hidden1.s
new file mode 100644 (file)
index 0000000..2c1ce93
--- /dev/null
@@ -0,0 +1,9 @@
+       .text
+.globl bar
+       .type   bar, @function
+bar:
+       leal    foo@GOTOFF(%ecx), %eax
+       ret
+       .size   bar, .-bar
+       .weak   foo
+       .hidden foo
diff --git a/ld/testsuite/ld-i386/hidden2.d b/ld/testsuite/ld-i386/hidden2.d
new file mode 100644 (file)
index 0000000..90bc438
--- /dev/null
@@ -0,0 +1,13 @@
+#as: --32
+#ld: -shared -melf_i386
+#objdump: -drw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <bar>:
+[      ]*[a-f0-9]+:    e8 cf fe ff ff          call   0 <bar-0x[a-f0-9]+>
+[      ]*[a-f0-9]+:    c3                      ret    
+#pass
diff --git a/ld/testsuite/ld-i386/hidden2.s b/ld/testsuite/ld-i386/hidden2.s
new file mode 100644 (file)
index 0000000..03e2ce7
--- /dev/null
@@ -0,0 +1,9 @@
+       .text
+.globl bar
+       .type   bar, @function
+bar:
+       call    foo
+       ret
+       .size   bar, .-bar
+       .weak   foo
+       .hidden foo
diff --git a/ld/testsuite/ld-i386/hidden3.d b/ld/testsuite/ld-i386/hidden3.d
new file mode 100644 (file)
index 0000000..5ace20d
--- /dev/null
@@ -0,0 +1,3 @@
+#as: --32
+#ld: -shared -melf_i386
+#error: .*relocation R_386_GOTOFF against undefined hidden symbol `foo' can not be used when making a shared object
diff --git a/ld/testsuite/ld-i386/hidden3.s b/ld/testsuite/ld-i386/hidden3.s
new file mode 100644 (file)
index 0000000..221b159
--- /dev/null
@@ -0,0 +1,8 @@
+       .text
+.globl bar
+       .type   bar, @function
+bar:
+       leal    foo@GOTOFF(%ecx), %eax
+       ret
+       .size   bar, .-bar
+       .hidden foo
index 10f90ce..6f75f3a 100644 (file)
@@ -132,3 +132,9 @@ run_dump_test "tlsie2"
 run_dump_test "tlsie3"
 run_dump_test "tlsie4"
 run_dump_test "tlsie5"
+run_dump_test "hidden1"
+run_dump_test "hidden2"
+run_dump_test "hidden3"
+run_dump_test "protected1"
+run_dump_test "protected2"
+run_dump_test "protected3"
diff --git a/ld/testsuite/ld-i386/protected1.d b/ld/testsuite/ld-i386/protected1.d
new file mode 100644 (file)
index 0000000..a3cb5ce
--- /dev/null
@@ -0,0 +1,3 @@
+#as: --32
+#ld: -shared -melf_i386
+#error: .*relocation R_386_GOTOFF against protected function `foo' can not be used when making a shared object
diff --git a/ld/testsuite/ld-i386/protected1.s b/ld/testsuite/ld-i386/protected1.s
new file mode 100644 (file)
index 0000000..2edaeb2
--- /dev/null
@@ -0,0 +1,13 @@
+       .text
+.globl foo
+       .protected      foo
+       .type   foo, @function
+foo:
+       ret
+       .size   foo, .-foo
+.globl bar
+       .type   bar, @function
+bar:
+       leal    foo@GOTOFF(%ecx), %eax
+       ret
+       .size   bar, .-bar
diff --git a/ld/testsuite/ld-i386/protected2.d b/ld/testsuite/ld-i386/protected2.d
new file mode 100644 (file)
index 0000000..ba53e59
--- /dev/null
@@ -0,0 +1,16 @@
+#as: --32
+#ld: -shared -melf_i386
+#objdump: -drw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+[a-f0-9]+ <foo>:
+[      ]*[a-f0-9]+:    c3                      ret    
+
+0+[a-f0-9]+ <bar>:
+[      ]*[a-f0-9]+:    e8 fa ff ff ff          call   [a-f0-9]+ <foo>
+[      ]*[a-f0-9]+:    c3                      ret    
+#pass
diff --git a/ld/testsuite/ld-i386/protected2.s b/ld/testsuite/ld-i386/protected2.s
new file mode 100644 (file)
index 0000000..61e5aec
--- /dev/null
@@ -0,0 +1,13 @@
+       .text
+.globl foo
+       .protected      foo
+       .type   foo, @function
+foo:
+       ret
+       .size   foo, .-foo
+.globl bar
+       .type   bar, @function
+bar:
+       call    foo
+       ret
+       .size   bar, .-bar
diff --git a/ld/testsuite/ld-i386/protected3.d b/ld/testsuite/ld-i386/protected3.d
new file mode 100644 (file)
index 0000000..e42185a
--- /dev/null
@@ -0,0 +1,13 @@
+#as: --32
+#ld: -shared -melf_i386
+#objdump: -drw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+[a-f0-9]+ <bar>:
+[      ]*[a-f0-9]+:    8b 81 0c 00 00 00       mov    0x[a-f0-9]+\(%ecx\),%eax
+[      ]*[a-f0-9]+:    c3                      ret    
+#pass
diff --git a/ld/testsuite/ld-i386/protected3.s b/ld/testsuite/ld-i386/protected3.s
new file mode 100644 (file)
index 0000000..7a605a2
--- /dev/null
@@ -0,0 +1,15 @@
+       .protected      foo
+.globl foo
+       .data
+       .align 4
+       .type   foo, @object
+       .size   foo, 4
+foo:
+       .long   1
+       .text
+.globl bar
+       .type   bar, @function
+bar:
+       movl    foo@GOTOFF(%ecx), %eax
+       ret
+       .size   bar, .-bar
diff --git a/ld/testsuite/ld-x86-64/hidden1.d b/ld/testsuite/ld-x86-64/hidden1.d
new file mode 100644 (file)
index 0000000..c4c843b
--- /dev/null
@@ -0,0 +1,3 @@
+#as: --64
+#ld: -shared -melf_x86_64
+#error: .*relocation R_X86_64_PC32 against undefined hidden symbol `foo' can not be used when making a shared object
diff --git a/ld/testsuite/ld-x86-64/hidden1.s b/ld/testsuite/ld-x86-64/hidden1.s
new file mode 100644 (file)
index 0000000..ba7f88b
--- /dev/null
@@ -0,0 +1,9 @@
+       .text
+.globl bar
+       .type   bar, @function
+bar:
+       leaq    foo(%rip), %rax
+       ret
+       .size   bar, .-bar
+       .weak   foo
+       .hidden foo
diff --git a/ld/testsuite/ld-x86-64/hidden2.d b/ld/testsuite/ld-x86-64/hidden2.d
new file mode 100644 (file)
index 0000000..0d89e6e
--- /dev/null
@@ -0,0 +1,13 @@
+#as: --64
+#ld: -shared -melf_x86_64
+#objdump: -drw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+[a-f0-9]+ <bar>:
+[      ]*[a-f0-9]+:    e8 33 fe ff ff          callq  0 <bar-0x[a-f0-9]+>
+[      ]*[a-f0-9]+:    c3                      retq   
+#pass
diff --git a/ld/testsuite/ld-x86-64/hidden2.s b/ld/testsuite/ld-x86-64/hidden2.s
new file mode 100644 (file)
index 0000000..03e2ce7
--- /dev/null
@@ -0,0 +1,9 @@
+       .text
+.globl bar
+       .type   bar, @function
+bar:
+       call    foo
+       ret
+       .size   bar, .-bar
+       .weak   foo
+       .hidden foo
diff --git a/ld/testsuite/ld-x86-64/hidden3.d b/ld/testsuite/ld-x86-64/hidden3.d
new file mode 100644 (file)
index 0000000..c4c843b
--- /dev/null
@@ -0,0 +1,3 @@
+#as: --64
+#ld: -shared -melf_x86_64
+#error: .*relocation R_X86_64_PC32 against undefined hidden symbol `foo' can not be used when making a shared object
diff --git a/ld/testsuite/ld-x86-64/hidden3.s b/ld/testsuite/ld-x86-64/hidden3.s
new file mode 100644 (file)
index 0000000..75482aa
--- /dev/null
@@ -0,0 +1,8 @@
+       .text
+.globl bar
+       .type   bar, @function
+bar:
+       leaq    foo(%rip), %rax
+       ret
+       .size   bar, .-bar
+       .hidden foo
diff --git a/ld/testsuite/ld-x86-64/protected1.d b/ld/testsuite/ld-x86-64/protected1.d
new file mode 100644 (file)
index 0000000..783b85a
--- /dev/null
@@ -0,0 +1,3 @@
+#as: --64
+#ld: -shared -melf_x86_64
+#error: .*relocation R_X86_64_PC32 against protected symbol `foo' can not be used when making a shared object
diff --git a/ld/testsuite/ld-x86-64/protected1.s b/ld/testsuite/ld-x86-64/protected1.s
new file mode 100644 (file)
index 0000000..31368aa
--- /dev/null
@@ -0,0 +1,13 @@
+       .text
+.globl foo
+       .protected      foo
+       .type   foo, @function
+foo:
+       ret
+       .size   foo, .-foo
+.globl bar
+       .type   bar, @function
+bar:
+       leaq    foo(%rip), %rax
+       ret
+       .size   bar, .-bar
diff --git a/ld/testsuite/ld-x86-64/protected2.d b/ld/testsuite/ld-x86-64/protected2.d
new file mode 100644 (file)
index 0000000..2e91b17
--- /dev/null
@@ -0,0 +1,16 @@
+#as: --64
+#ld: -shared -melf_x86_64
+#objdump: -drw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+[a-f0-9]+ <foo>:
+[      ]*[a-f0-9]+:    c3                      retq   
+
+0+[a-f0-9]+ <bar>:
+[      ]*[a-f0-9]+:    e8 fa ff ff ff          callq  [a-f0-9]+ <foo>
+[      ]*[a-f0-9]+:    c3                      retq   
+#pass
diff --git a/ld/testsuite/ld-x86-64/protected2.s b/ld/testsuite/ld-x86-64/protected2.s
new file mode 100644 (file)
index 0000000..61e5aec
--- /dev/null
@@ -0,0 +1,13 @@
+       .text
+.globl foo
+       .protected      foo
+       .type   foo, @function
+foo:
+       ret
+       .size   foo, .-foo
+.globl bar
+       .type   bar, @function
+bar:
+       call    foo
+       ret
+       .size   bar, .-bar
diff --git a/ld/testsuite/ld-x86-64/protected3.d b/ld/testsuite/ld-x86-64/protected3.d
new file mode 100644 (file)
index 0000000..09556ce
--- /dev/null
@@ -0,0 +1,13 @@
+#as: --64
+#ld: -shared -melf_x86_64
+#objdump: -drw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+[a-f0-9]+ <bar>:
+[      ]*[a-f0-9]+:    8b 05 ce 00 20 00       mov    0x[a-f0-9]+\(%rip\),%eax        # [a-f0-9]+ <foo>
+[      ]*[a-f0-9]+:    c3                      retq   
+#pass
diff --git a/ld/testsuite/ld-x86-64/protected3.s b/ld/testsuite/ld-x86-64/protected3.s
new file mode 100644 (file)
index 0000000..e4af6e7
--- /dev/null
@@ -0,0 +1,15 @@
+       .protected      foo
+.globl foo
+       .data
+       .align 4
+       .type   foo, @object
+       .size   foo, 4
+foo:
+       .long   1
+       .text
+.globl bar
+       .type   bar, @function
+bar:
+       movl    foo(%rip), %eax
+       ret
+       .size   bar, .-bar
index cd26091..eeeea43 100644 (file)
@@ -86,3 +86,9 @@ run_dump_test "tlsgd2"
 run_dump_test "tlsgd3"
 run_dump_test "tlsie2"
 run_dump_test "tlsie3"
+run_dump_test "hidden1"
+run_dump_test "hidden2"
+run_dump_test "hidden3"
+run_dump_test "protected1"
+run_dump_test "protected2"
+run_dump_test "protected3"