summaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2017-04-07 07:40:14 -0700
committerH.J. Lu <hjl.tools@gmail.com>2017-04-07 07:40:14 -0700
commit8170f7693bc0a9442c0aa280197925db92d48ca6 (patch)
tree794312ba7250e6bbbe996d8b4c2cf3baa3b512e6 /bfd
parent6670ec13726c3afca789672f6235378a5e1f7d71 (diff)
downloadbinutils-gdb-8170f7693bc0a9442c0aa280197925db92d48ca6.tar.gz
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.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog12
-rw-r--r--bfd/elf32-s390.c2
-rw-r--r--bfd/elf64-s390.c2
-rw-r--r--bfd/elf64-x86-64.c3
-rw-r--r--bfd/elflink.c7
5 files changed, 18 insertions, 8 deletions
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 <hongjiu.lu@intel.com>
+
+ 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 <palves@redhat.com>
* 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;