From: H.J. Lu Date: Fri, 7 Apr 2017 14:40:14 +0000 (-0700) Subject: ELF: Check ELF_COMMON_DEF_P for common symbols X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8170f7693bc0a9442c0aa280197925db92d48ca6;p=binutils-gdb.git ELF: Check ELF_COMMON_DEF_P for common symbols Since common symbols that are turned into definitions don't have the DEF_REGULAR flag set, we need to check ELF_COMMON_DEF_P for common symbols. bfd/ PR ld/19579 PR ld/21306 * elf32-s390.c (elf_s390_finish_dynamic_symbol): Check ELF_COMMON_DEF_P for common symbols. * elf64-s390.c (elf_s390_finish_dynamic_symbol): Likewise. * elf64-x86-64.c (elf_x86_64_relocate_section): Likewise. * elflink.c (_bfd_elf_merge_symbol): Revert commits 202ac193bbbecc96a4978d1ac3d17148253f9b01 and 07492f668d2173da7a2bda3707ff0985e0f460b6. ld/ PR ld/19579 PR ld/21306 * testsuite/ld-elf/pr19579a.c (main): Updated. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index da9eac6f902..a4664f82b6b 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,15 @@ +2017-04-07 H.J. Lu + + PR ld/19579 + PR ld/21306 + * elf32-s390.c (elf_s390_finish_dynamic_symbol): Check + ELF_COMMON_DEF_P for common symbols. + * elf64-s390.c (elf_s390_finish_dynamic_symbol): Likewise. + * elf64-x86-64.c (elf_x86_64_relocate_section): Likewise. + * elflink.c (_bfd_elf_merge_symbol): Revert commits + 202ac193bbbecc96a4978d1ac3d17148253f9b01 and + 07492f668d2173da7a2bda3707ff0985e0f460b6. + 2017-04-07 Pedro Alves * opncls.c (bfd_get_debug_link_info): Rename to... diff --git a/bfd/elf32-s390.c b/bfd/elf32-s390.c index fd1bc13d5c0..ddb6f5b255e 100644 --- a/bfd/elf32-s390.c +++ b/bfd/elf32-s390.c @@ -3785,7 +3785,7 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd, RELATIVE reloc. The entry in the global offset table will already have been initialized in the relocate_section function. */ - if (!h->def_regular) + if (!(h->def_regular || ELF_COMMON_DEF_P (h))) return FALSE; BFD_ASSERT((h->got.offset & 1) != 0); rela.r_info = ELF32_R_INFO (0, R_390_RELATIVE); diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c index b5fd05f2630..fbbf8d6e1de 100644 --- a/bfd/elf64-s390.c +++ b/bfd/elf64-s390.c @@ -3582,7 +3582,7 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd, RELATIVE reloc. The entry in the global offset table will already have been initialized in the relocate_section function. */ - if (!h->def_regular) + if (!(h->def_regular || ELF_COMMON_DEF_P (h))) return FALSE; BFD_ASSERT((h->got.offset & 1) != 0); rela.r_info = ELF64_R_INFO (0, R_390_RELATIVE); diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 6d92c79c931..a4048f19584 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -4926,7 +4926,8 @@ do_ifunc_pointer: { /* Symbol is referenced locally. Make sure it is defined locally or for a branch. */ - fail = !h->def_regular && !branch; + fail = (!(h->def_regular || ELF_COMMON_DEF_P (h)) + && !branch); } else if (!(bfd_link_pie (info) && (h->needs_copy || eh->needs_copy))) diff --git a/bfd/elflink.c b/bfd/elflink.c index 9bf75c849bb..c00d7120319 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -1544,16 +1544,13 @@ _bfd_elf_merge_symbol (bfd *abfd, represent variables; this can cause confusion in principle, but any such confusion would seem to indicate an erroneous program or shared library. We also permit a common symbol in a regular - object to override a weak symbol in a shared object. A common - symbol in executable also overrides a symbol in a shared object. */ + object to override a weak symbol in a shared object. */ if (newdyn && newdef && (olddef || (h->root.type == bfd_link_hash_common - && (newweak - || newfunc - || (!olddyn && bfd_link_executable (info)))))) + && (newweak || newfunc)))) { *override = TRUE; newdef = FALSE; diff --git a/ld/ChangeLog b/ld/ChangeLog index c632fd8db49..044b947f5b0 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2017-04-07 H.J. Lu + + PR ld/19579 + PR ld/21306 + * testsuite/ld-elf/pr19579a.c (main): Updated. + 2017-04-07 Nick Clifton PR 21090 diff --git a/ld/testsuite/ld-elf/pr19579a.c b/ld/testsuite/ld-elf/pr19579a.c index e4a6eb1ea9b..69d0f35898d 100644 --- a/ld/testsuite/ld-elf/pr19579a.c +++ b/ld/testsuite/ld-elf/pr19579a.c @@ -9,7 +9,7 @@ extern int *bar_p (void); int main () { - if (foo[0] == 0 && foo == foo_p () && bar[0] == 0 && bar == bar_p ()) + if (foo[0] == 0 && foo == foo_p () && bar[0] == -1 && bar == bar_p ()) printf ("PASS\n"); return 0; }