ld's sole user of update_definedness() vs documentation

Jan Beulich jbeulich@suse.com
Mon Feb 22 07:35:52 GMT 2021


On 21.02.2021 05:05, Alan Modra wrote:
>> Perhaps, if there are scripts in the wild which do this, this
>> could at least be a warning for the time being?
> 
> Yes, I didn't mean to leave this go so long without doing something.
> I just committed the following.

Thanks for the quick fix. Wouldn't it be better to also adjust the
PROVIDE() doc then, replacing "error" by "warning"? I can certainly
do this, if you agree.

Jan

> Note that we don't even warn if scripts adjust a symbol as in
> ld-elf/var1 and ld-scripts/pr14962.
> 
> include/
> 	* bfdlink.h (struct bfd_link_info): Add warn_multiple_definition.
> ld/
> 	* ldexp.c (exp_fold_tree_1): Warn on script defining a symbol
> 	defined in an object file.
> 	* ldmain.c (multiple_definition): Heed info->warn_multiple_definition.
> 	* testsuite/ld-scripts/defined5.d: Expect a warning.
> 
> diff --git a/include/bfdlink.h b/include/bfdlink.h
> index 079e31227e..95728b6f03 100644
> --- a/include/bfdlink.h
> +++ b/include/bfdlink.h
> @@ -465,12 +465,16 @@ struct bfd_link_info
>       statics.  */
>    unsigned int task_link: 1;
>  
> -  /* TRUE if ok to have multiple definition.  */
> +  /* TRUE if ok to have multiple definitions, without warning.  */
>    unsigned int allow_multiple_definition: 1;
>  
> -  /* TRUE if ok to have prohibit multiple definition of absolute symbols.  */
> +  /* TRUE if multiple definition of absolute symbols (eg. from -R) should
> +     be reported.  */
>    unsigned int prohibit_multiple_definition_absolute: 1;
>  
> +  /* TRUE if multiple definitions should only warn.  */
> +  unsigned int warn_multiple_definition: 1;
> +
>    /* TRUE if ok to have version with no definition.  */
>    unsigned int allow_undefined_version: 1;
>  
> diff --git a/ld/ldexp.c b/ld/ldexp.c
> index 084bb17c4b..016784505b 100644
> --- a/ld/ldexp.c
> +++ b/ld/ldexp.c
> @@ -1186,16 +1186,19 @@ exp_fold_tree_1 (etree_type *tree)
>  		{
>  		  if (expld.result.section == NULL)
>  		    expld.result.section = expld.section;
> -		  if (!update_definedness (tree->assign.dst, h) && 0)
> +		  if (!update_definedness (tree->assign.dst, h)
> +		      && expld.assign_name != NULL)
>  		    {
> -		      /* Symbol was already defined.  For now this error
> -			 is disabled because it causes failures in the ld
> -			 testsuite: ld-elf/var1, ld-scripts/defined5, and
> -			 ld-scripts/pr14962.  Some of these no doubt
> -			 reflect scripts used in the wild.  */
> +		      /* Symbol was already defined, and the script isn't
> +			 modifying the symbol value for some reason as in
> +			 ld-elf/var1 and ld-scripts/pr14962.
> +			 For now this is only a warning.  */
> +		      unsigned int warn = link_info.warn_multiple_definition;
> +		      link_info.warn_multiple_definition = 1;
>  		      (*link_info.callbacks->multiple_definition)
>  			(&link_info, h, link_info.output_bfd,
>  			 expld.result.section, expld.result.value);
> +		      link_info.warn_multiple_definition = warn;
>  		    }
>  		  if (expld.phase == lang_fixed_phase_enum)
>  		    {
> diff --git a/ld/ldmain.c b/ld/ldmain.c
> index 863df0293e..5c88ee744f 100644
> --- a/ld/ldmain.c
> +++ b/ld/ldmain.c
> @@ -1074,7 +1074,9 @@ multiple_definition (struct bfd_link_info *info,
>        nval = oval;
>        obfd = NULL;
>      }
> -  einfo (_("%X%P: %C: multiple definition of `%pT'"),
> +  if (!info->warn_multiple_definition)
> +    einfo ("%X");
> +  einfo (_("%P: %C: multiple definition of `%pT'"),
>  	 nbfd, nsec, nval, name);
>    if (obfd != NULL)
>      einfo (_("; %D: first defined here"), obfd, osec, oval);
> diff --git a/ld/testsuite/ld-scripts/defined5.d b/ld/testsuite/ld-scripts/defined5.d
> index 2530c0e09e..7aa680b85a 100644
> --- a/ld/testsuite/ld-scripts/defined5.d
> +++ b/ld/testsuite/ld-scripts/defined5.d
> @@ -1,10 +1,11 @@
>  #ld: -Tdefined5.t
> +#warning: .*multiple definition of `defined'.*
>  #nm: -B
> -#source: defined5.s
>  #xfail: [is_xcoff_format]
>  # xcoff outputs value of "defined" from the object file
>  
> -# Check that arithmetic on DEFINED works.
> +# Check that a script can override an object file symbol, if multiple
> +# definitions are allowed.  See pr12356.
>  #...
>  0+1000 D defined
>  #pass
> 
> 



More information about the Binutils mailing list