From 742d6bb69816f677387082eda81d7f1727a7d7d4 Mon Sep 17 00:00:00 2001 From: bebbo Date: Mon, 13 Feb 2017 18:59:08 +0100 Subject: [PATCH] @R with multiple defined symbols now the first definition is retained (was: last definition), thus object file definition have precedence over libs --- bfd/linker.c | 21 +++++++++++++-------- ld/ldmain.c | 2 +- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/bfd/linker.c b/bfd/linker.c index 375b61d..b150a81 100644 --- a/bfd/linker.c +++ b/bfd/linker.c @@ -1621,14 +1621,19 @@ _bfd_generic_link_add_one_symbol (info, abfd, name, flags, section, value, break; case CDEF: - /* We have found a definition for a symbol which was - previously common. */ - BFD_ASSERT (h->type == bfd_link_hash_common); - if (! ((*info->callbacks->multiple_common) - (info, h->root.string, - h->u.c.p->section->owner, bfd_link_hash_common, h->u.c.size, - abfd, bfd_link_hash_defined, (bfd_vma) 0))) - return FALSE; + { + /* We have found a definition for a symbol which was + previously common. */ + int rr = ((*info->callbacks->multiple_common) + (info, h->root.string, + h->u.c.p->section->owner, bfd_link_hash_common, h->u.c.size, + abfd, bfd_link_hash_defined, (bfd_vma)0)); + BFD_ASSERT(h->type == bfd_link_hash_common); + if (!rr) + return FALSE; + if (rr == 2) + break; + } /* Fall through. */ case DEF: case DEFW: diff --git a/ld/ldmain.c b/ld/ldmain.c index e0f1fa2..b5fc307 100644 --- a/ld/ldmain.c +++ b/ld/ldmain.c @@ -1018,7 +1018,7 @@ multiple_common (info, name, obfd, otype, osize, nbfd, ntype, nsize) bfd_vma nsize; { if (! config.warn_common) - return TRUE; + return 2; if (ntype == bfd_link_hash_defined || ntype == bfd_link_hash_defweak