[PATCH] ld: Lookup section in output with the same name

Alan Modra amodra@gmail.com
Fri Aug 31 15:39:00 GMT 2018


On Thu, Aug 30, 2018 at 01:51:37PM -0700, H.J. Lu wrote:
> --- a/ld/ldlang.c
> +++ b/ld/ldlang.c
> @@ -6097,6 +6097,24 @@ undef_start_stop (struct bfd_link_hash_entry *h)
>        || strcmp (h->u.def.section->name,
>  		 h->u.def.section->output_section->name) != 0)
>      {
> +      asection *sec = bfd_get_section_by_name (link_info.output_bfd,
> +					       h->u.def.section->name);
> +      if (sec != NULL)
> +	{
> +	  /* When there are more than one input sections with the same
> +	     section name, SECNAME, linker picks the first one to define
> +	     __start_SECNAME and __stop_SECNAME symbols.  When the first
> +	     input section is removed by comdat group, we need to check
> +	     if there is still an output section with section name
> +	     SECNAME.  */
> +	  asection *i;
> +	  for (i = sec->map_head.s; i != NULL; i = i->map_head.s)
> +	    if (i->size != 0)

I think you should check that i->name matches h->u.def.section->name
here.  At one stage we only defined start/stop symbols on orphans,
but now we do so whenever input section name matches output section
name and the name is alphanumeric.  That means a linker script might
be involved in which case differently named input sections might map
to the output section.

Also, why do you check i->size?  We define start/stop symbols on zero
sized sections!

> +	      {
> +		h->u.def.section = i;
> +		return;
> +	      }
> +	}
>        h->type = bfd_link_hash_undefined;
>        h->u.undef.abfd = NULL;
>      }

-- 
Alan Modra
Australia Development Lab, IBM



More information about the Binutils mailing list