diff options
-rw-r--r-- | bfd/ChangeLog | 11 | ||||
-rw-r--r-- | bfd/elf32-i386.c | 1 | ||||
-rw-r--r-- | bfd/elf64-x86-64.c | 3 | ||||
-rw-r--r-- | ld/testsuite/ChangeLog | 15 | ||||
-rw-r--r-- | ld/testsuite/ld-i386/i386.exp | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-i386/protected4.d | 5 | ||||
-rw-r--r-- | ld/testsuite/ld-i386/protected4.s | 12 | ||||
-rw-r--r-- | ld/testsuite/ld-i386/protected5.d | 5 | ||||
-rw-r--r-- | ld/testsuite/ld-i386/protected5.s | 12 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/protected4.d | 5 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/protected4.s | 12 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/protected5.d | 5 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/protected5.s | 12 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/x86-64.exp | 2 |
14 files changed, 101 insertions, 1 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b9849f8..735a0ba 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,14 @@ +2012-03-20 H.J. Lu <hongjiu.lu@intel.com> + + PR ld/13880 + * elf32-i386.c (elf_i386_relocate_section): Don't issue an error + for R_386_GOTOFF relocation against protected function if + SYMBOLIC_BIND is true. + + * elf64-x86-64.c (elf_x86_64_relocate_section): Don't issue an + error for R_X86_64_GOTOFF64 relocation against protected function + when building executable or SYMBOLIC_BIND is true. + 2012-03-16 Roland McGrath <mcgrathr@google.com> * config.bfd: Handle x86_64-*-nacl*. diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 4ae2166..f35e3c22 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -3503,6 +3503,7 @@ elf_i386_relocate_section (bfd *output_bfd, return FALSE; } else if (!info->executable + && !SYMBOLIC_BIND (info, h) && h->type == STT_FUNC && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED) { diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index f2f803a..cc5ee42 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -3464,8 +3464,9 @@ elf_x86_64_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 + if (!info->executable && h + && !SYMBOLIC_BIND (info, h) && h->def_regular && h->type == STT_FUNC && ELF_ST_VISIBILITY (h->other) == STV_PROTECTED) diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 1bcf098..ac06f53 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,18 @@ +2012-03-20 H.J. Lu <hongjiu.lu@intel.com> + + PR ld/13880 + * ld-i386/i386.exp: Run protected4 and protected5. + * ld-x86-64/x86-64.exp: Likewise. + + * ld-i386/protected4.d: New. + * ld-i386/protected4.s: Likewise. + * ld-i386/protected5.d: Likewise. + * ld-i386/protected5.s: Likewise. + * ld-x86-64/protected4.d: Likewise. + * ld-x86-64/protected4.s: Likewise. + * ld-x86-64/protected5.d: Likewise. + * ld-x86-64/protected5.s: Likewise. + 2012-03-19 Andreas Schwab <schwab@linux-m68k.org> * ld-m68k/m68k.exp ("TLS indirect symbol use"): Pass diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp index 1727922..ff9db98 100644 --- a/ld/testsuite/ld-i386/i386.exp +++ b/ld/testsuite/ld-i386/i386.exp @@ -194,6 +194,8 @@ run_dump_test "hidden3" run_dump_test "protected1" run_dump_test "protected2" run_dump_test "protected3" +run_dump_test "protected4" +run_dump_test "protected5" run_dump_test "tlspie1" run_dump_test "tlspie2" run_dump_test "nogot1" diff --git a/ld/testsuite/ld-i386/protected4.d b/ld/testsuite/ld-i386/protected4.d new file mode 100644 index 0000000..f16f0c0 --- /dev/null +++ b/ld/testsuite/ld-i386/protected4.d @@ -0,0 +1,5 @@ +#as: --32 +#ld: -shared -Bsymbolic -melf_i386 +#readelf: -r + +There are no relocations in this file. diff --git a/ld/testsuite/ld-i386/protected4.s b/ld/testsuite/ld-i386/protected4.s new file mode 100644 index 0000000..66f2a56 --- /dev/null +++ b/ld/testsuite/ld-i386/protected4.s @@ -0,0 +1,12 @@ + .text + .protected foo + .globl foo + .type foo, @function +foo: + ret + .size foo, .-foo + .globl bar + .type bar, @function +bar: + movl foo@GOTOFF(%ecx), %eax + .size bar, .-bar diff --git a/ld/testsuite/ld-i386/protected5.d b/ld/testsuite/ld-i386/protected5.d new file mode 100644 index 0000000..89e2159 --- /dev/null +++ b/ld/testsuite/ld-i386/protected5.d @@ -0,0 +1,5 @@ +#as: --32 +#ld: -pie -melf_i386 +#readelf: -r + +There are no relocations in this file. diff --git a/ld/testsuite/ld-i386/protected5.s b/ld/testsuite/ld-i386/protected5.s new file mode 100644 index 0000000..fc218f2 --- /dev/null +++ b/ld/testsuite/ld-i386/protected5.s @@ -0,0 +1,12 @@ + .text + .protected foo + .globl foo + .type foo, @function +foo: + ret + .size foo, .-foo + .globl _start + .type _start, @function +_start: + movl foo@GOTOFF(%ecx), %eax + .size _start, .-_start diff --git a/ld/testsuite/ld-x86-64/protected4.d b/ld/testsuite/ld-x86-64/protected4.d new file mode 100644 index 0000000..a8a8980 --- /dev/null +++ b/ld/testsuite/ld-x86-64/protected4.d @@ -0,0 +1,5 @@ +#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/protected4.s b/ld/testsuite/ld-x86-64/protected4.s new file mode 100644 index 0000000..c6e41ec --- /dev/null +++ b/ld/testsuite/ld-x86-64/protected4.s @@ -0,0 +1,12 @@ + .text + .protected foo + .globl 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/protected5.d b/ld/testsuite/ld-x86-64/protected5.d new file mode 100644 index 0000000..afe172a --- /dev/null +++ b/ld/testsuite/ld-x86-64/protected5.d @@ -0,0 +1,5 @@ +#as: --64 +#ld: -pie -melf_x86_64 +#readelf: -r + +There are no relocations in this file. diff --git a/ld/testsuite/ld-x86-64/protected5.s b/ld/testsuite/ld-x86-64/protected5.s new file mode 100644 index 0000000..8e14138 --- /dev/null +++ b/ld/testsuite/ld-x86-64/protected5.s @@ -0,0 +1,12 @@ + .text + .protected foo + .globl foo + .type foo, @function +foo: + ret + .size foo, .-foo + .globl _start + .type _start, @function +_start: + movabsq $foo@GOTOFF, %rax + .size _start, .-_start diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index f713ca5..c258251 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -158,6 +158,8 @@ run_dump_test "protected2" run_dump_test "protected2-l1om" run_dump_test "protected3" run_dump_test "protected3-l1om" +run_dump_test "protected4" +run_dump_test "protected5" run_dump_test "tlsle1" run_dump_test "tlspie1" run_dump_test "unique1" |