[PATCH v2] LTO: Properly check wrapper symbol

Alan Modra amodra@gmail.com
Tue Jul 9 07:21:35 GMT 2024


On Mon, Jul 08, 2024 at 12:59:20AM -0700, H.J. Lu wrote:
> Add wrapper_symbol to bfd_link_hash_entry and set it to true for wrapper
> symbol. Set wrap_status to wrapper if wrapper_symbol is true in LTO.
> 
> bfd/
> 
> 	PR ld/31956
> 	* linker.c (bfd_wrapped_link_hash_lookup): Set wrapper_symbol
> 	for wrapper symbol.
> 
> include/
> 
> 	PR ld/31956
> 	* bfdlink.h (bfd_link_hash_entry): Add wrapper_symbol.
> 
> ld/
> 
> 	PR ld/31956
> 	* plugin.c (get_symbols): Set wrap_status to wrapper if
> 	wrapper_symbol is set.
> 	* testsuite/ld-plugin/lto.exp: Run PR ld/31956 tests.
> 	* testsuite/ld-plugin/pr31956a.c: New file.
> 	* testsuite/ld-plugin/pr31956b.c: Likewise.
> 
> Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
> ---
>  bfd/linker.c                      |  2 ++
>  include/bfdlink.h                 |  3 +++
>  ld/plugin.c                       |  4 +---
>  ld/testsuite/ld-plugin/lto.exp    | 16 ++++++++++++++++
>  ld/testsuite/ld-plugin/pr31956a.c |  3 +++
>  ld/testsuite/ld-plugin/pr31956b.c | 23 +++++++++++++++++++++++
>  6 files changed, 48 insertions(+), 3 deletions(-)
>  create mode 100644 ld/testsuite/ld-plugin/pr31956a.c
>  create mode 100644 ld/testsuite/ld-plugin/pr31956b.c
> 
> diff --git a/bfd/linker.c b/bfd/linker.c
> index 111deecf55d..21009a838bc 100644
> --- a/bfd/linker.c
> +++ b/bfd/linker.c
> @@ -573,6 +573,8 @@ bfd_wrapped_link_hash_lookup (bfd *abfd,
>  	  strcat (n, WRAP);
>  	  strcat (n, l);
>  	  h = bfd_link_hash_lookup (info->hash, n, create, true, follow);
> +	  if (h != NULL)
> +	    h->wrapper_symbol = true;
>  	  free (n);
>  	  return h;
>  	}
> diff --git a/include/bfdlink.h b/include/bfdlink.h
> index 015370d268f..f802ec627ef 100644
> --- a/include/bfdlink.h
> +++ b/include/bfdlink.h
> @@ -117,6 +117,9 @@ struct bfd_link_hash_entry
>    /* The symbol, SYM, is referenced by __real_SYM in an object file.  */
>    unsigned int ref_real : 1;
>  
> +  /* The symbol is a wrapper symbol, __wrap_SYM.  */
> +  unsigned int wrapper_symbol : 1;
> +
>    /* Symbol is a built-in define.  These will be overridden by PROVIDE
>       in a linker script.  */
>    unsigned int linker_def : 1;
> diff --git a/ld/plugin.c b/ld/plugin.c
> index 8107841407a..6990fcc61b1 100644
> --- a/ld/plugin.c
> +++ b/ld/plugin.c
> @@ -780,9 +780,7 @@ get_symbols (const void *handle, int nsyms, struct ld_plugin_symbol *syms,
>  	  if (blhe && link_info.wrap_hash != NULL)
>  	    {
>  	      /* Check if a symbol is a wrapper symbol.  */
> -	      struct bfd_link_hash_entry *unwrap
> -		= unwrap_hash_lookup (&link_info, (bfd *) abfd, blhe);
> -	      if (unwrap && unwrap != h)
> +	      if (h->wrapper_symbol)
>  		wrap_status = wrapper;
>  	     }
>  	}

There is no need to check wrap_hash here.  This could be
	  if (blhe && blhe->wrapper_symbol)
	    wrap_status = wrapper;

The patch is OK, but please do add to the git log an explanation as to
why using unwrap_hash_lookup fails.

> diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp
> index 7b4b3492a2f..9476caf7ab4 100644
> --- a/ld/testsuite/ld-plugin/lto.exp
> +++ b/ld/testsuite/ld-plugin/lto.exp
> @@ -530,6 +530,22 @@ set lto_link_elf_tests [list \
>     {} \
>     "pr29086" \
>    ] \
> +  [list \
> +   "PR ld/31956 (a)" \
> +   "-Wl,--wrap=parse_line" \
> +   "-O2 -flto" \
> +   {pr31956a.c pr31956b.c} \
> +   {} \
> +   "pr31956a" \
> +  ] \
> +  [list \
> +   "PR ld/31956 (b)" \
> +   "-Wl,--wrap=parse_line" \
> +   "-O2 -flto" \
> +   {pr31956b.c pr31956a.c} \
> +   {} \
> +   "pr31956b" \
> +  ] \
>    [list \
>     "Build pr30281.so" \
>     "-shared -Wl,--version-script,pr30281.t \
> diff --git a/ld/testsuite/ld-plugin/pr31956a.c b/ld/testsuite/ld-plugin/pr31956a.c
> new file mode 100644
> index 00000000000..48df8c537fb
> --- /dev/null
> +++ b/ld/testsuite/ld-plugin/pr31956a.c
> @@ -0,0 +1,3 @@
> +extern void parse_line(void);
> +void _cmocka_run_group_tests(void *) {}
> +void argv_parse_cmd(void) { parse_line(); }
> diff --git a/ld/testsuite/ld-plugin/pr31956b.c b/ld/testsuite/ld-plugin/pr31956b.c
> new file mode 100644
> index 00000000000..1b069318257
> --- /dev/null
> +++ b/ld/testsuite/ld-plugin/pr31956b.c
> @@ -0,0 +1,23 @@
> +struct CMUnitTest {
> +  void *test_func;
> +};
> +
> +extern void _cmocka_run_group_tests(void *);
> +
> +extern void argv_parse_cmd(void);
> +void __wrap_parse_line(void) {};
> +
> +void foo (void) {
> +  argv_parse_cmd();
> +}
> +
> +struct CMUnitTest main_tests = {
> +   foo
> +};
> +
> +int
> +main (void)
> +{
> +  _cmocka_run_group_tests (&main_tests);
> +  return 0;
> +}
> -- 
> 2.45.2

-- 
Alan Modra


More information about the Binutils mailing list