[BFD][PR21703]Override the new defined symbol with the old normal symbol when --allow-multiple-definition is provided

Alan Modra amodra@gmail.com
Thu Jul 6 05:46:00 GMT 2017


On Tue, Jul 04, 2017 at 08:50:50PM +0100, Renlin Li wrote:
> --- a/bfd/elflink.c
> +++ b/bfd/elflink.c
> @@ -1569,6 +1569,15 @@ _bfd_elf_merge_symbol (bfd *abfd,
>        *size_change_ok = TRUE;
>      }
>  
> +  /* The old symbol definition is overriding the new one if the symbol is a
> +     normal symbol.  */
> +  if (olddef && !olddyn && !oldweak
> +      && newdef && info->allow_multiple_definition)
> +    {
> +      *override = TRUE;
> +      return TRUE;
> +    }
> +
>    /* If we are looking at a dynamic object, and we have found a
>       definition, we need to see if the symbol was already defined by
>       some other object.  If so, we want to use the existing

This doesn't look correct to me.  override is really meant to handle
cases involving dynamic symbols.  I think skip should be set instead.

It might be easier to get the condition correct, and better for
maintenance, if you write

  if (<multiple definition detected>)
    {
      if (!info->allow_multiple_definition)
	into->callbacks->multiple_definition (info, h, abfd, sec, *pvalue);
      *skip = TRUE;
      return TRUE;
    }

ie. handle multiple definitions completely in _bfd_elf_merge_symbol.
I haven't written in the condition because I'll probably get it wrong
without testing.  :)

-- 
Alan Modra
Australia Development Lab, IBM



More information about the Binutils mailing list