> Date: Sun, 20 May 2018 10:26:44 +0200
> From: Sebastien Marie <[email protected]>
> 
> Hi,
> 
> While trying to build git HEAD of radare2, I found us objcopy(1) doesn't
> have the --localize-hidden option.
> 
> As the option was proposed in
> https://sourceware.org/ml/binutils/2006-06/msg00204.html (in 2006), and
> commited in GPLv2 tree of binutils, I think the patch is suitable for us
> too.
> 
> Diff to add the option below.
> 
> Link to the backported commit:
> https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commitdiff;h=d58c2e3acdba2aadf3a47d741236fa02d7bb04ff;hp=22a84b55803f2adae036b553f7ca347ba02744be
> 
> Thanks.

There is a minor tabs vs. spaces issue in the binutils.texi bit.
Otherwise this is ok kettenis@

> -- 
> Sebastien Marie
> 
> https://sourceware.org/ml/binutils/2006-06/msg00204.html
> from Richard Sandiford
> 
> This patch adds a --localize-hidden option to objcopy.  As its name
> suggests, it converts all global or weak STV_HIDDEN or STV_INTERNAL
> symbols into local symbols.  It is equivalent to listing all such
> symbols using separate -L options.
> 
> Index: objcopy.c
> ===================================================================
> RCS file: /cvs/src/gnu/usr.bin/binutils-2.17/binutils/objcopy.c,v
> retrieving revision 1.4
> diff -u -p -r1.4 objcopy.c
> --- objcopy.c 15 Nov 2015 04:13:17 -0000      1.4
> +++ objcopy.c 20 May 2018 08:06:13 -0000
> @@ -190,6 +190,9 @@ static bfd_boolean remove_leading_char =
>  /* Whether to permit wildcard in symbol comparison.  */
>  static bfd_boolean wildcard = FALSE;
>  
> +/* True if --localize-hidden is in effect.  */
> +static bfd_boolean localize_hidden = FALSE;
> +
>  /* List of symbols to strip, keep, localize, keep-global, weaken,
>     or redefine.  */
>  static struct symlist *strip_specific_list = NULL;
> @@ -240,6 +243,7 @@ enum command_line_switch
>      OPTION_STRIP_UNNEEDED_SYMBOL,
>      OPTION_STRIP_UNNEEDED_SYMBOLS,
>      OPTION_KEEP_SYMBOLS,
> +    OPTION_LOCALIZE_HIDDEN,
>      OPTION_LOCALIZE_SYMBOLS,
>      OPTION_GLOBALIZE_SYMBOL,
>      OPTION_GLOBALIZE_SYMBOLS,
> @@ -328,6 +332,7 @@ static struct option copy_options[] =
>    {"keep-global-symbols", required_argument, 0, OPTION_KEEPGLOBAL_SYMBOLS},
>    {"keep-symbol", required_argument, 0, 'K'},
>    {"keep-symbols", required_argument, 0, OPTION_KEEP_SYMBOLS},
> +  {"localize-hidden", no_argument, 0, OPTION_LOCALIZE_HIDDEN},
>    {"localize-symbol", required_argument, 0, 'L'},
>    {"localize-symbols", required_argument, 0, OPTION_LOCALIZE_SYMBOLS},
>    {"no-adjust-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS},
> @@ -428,6 +433,7 @@ copy_usage (FILE *stream, int exit_statu
>       --only-keep-debug             Strip everything but the debug 
> information\n\
>    -K --keep-symbol <name>          Do not strip symbol <name>\n\
>       --keep-file-symbols           Do not strip file symbol(s)\n\
> +     --localize-hidden             Turn all ELF hidden symbols into locals\n\
>    -L --localize-symbol <name>      Force symbol <name> to be marked as a 
> local\n\
>       --globalize-symbol <name>     Force symbol <name> to be marked as a 
> global\n\
>    -G --keep-global-symbol <name>   Localize all symbols except <name>\n\
> @@ -809,6 +815,24 @@ is_strip_section (bfd *abfd ATTRIBUTE_UN
>    return FALSE;
>  }
>  
> +/* Return true if SYM is a hidden symbol.  */
> +
> +static bfd_boolean
> +is_hidden_symbol (asymbol *sym)
> +{
> +  elf_symbol_type *elf_sym;
> +
> +  elf_sym = elf_symbol_from (sym->the_bfd, sym);
> +  if (elf_sym != NULL)
> +    switch (ELF_ST_VISIBILITY (elf_sym->internal_elf_sym.st_other))
> +      {
> +      case STV_HIDDEN:
> +      case STV_INTERNAL:
> +       return TRUE;
> +      }
> +  return FALSE;
> +}
> +
>  /* Choose which symbol entries to copy; put the result in OSYMS.
>     We don't copy in place, because that confuses the relocs.
>     Return the number of symbols to print.  */
> @@ -955,7 +979,8 @@ filter_symbols (bfd *abfd, bfd *obfd, as
>             && (flags & (BSF_GLOBAL | BSF_WEAK))
>             && (is_specified_symbol (name, localize_specific_list)
>                 || (keepglobal_specific_list != NULL
> -                   && ! is_specified_symbol (name, 
> keepglobal_specific_list))))
> +                   && ! is_specified_symbol (name, keepglobal_specific_list))
> +               || (localize_hidden && is_hidden_symbol (sym))))
>           {
>             sym->flags &= ~ (BSF_GLOBAL | BSF_WEAK);
>             sym->flags |= BSF_LOCAL;
> @@ -1532,6 +1557,7 @@ copy_object (bfd *ibfd, bfd *obfd)
>        || strip_symbols == STRIP_UNNEEDED
>        || strip_symbols == STRIP_NONDEBUG
>        || discard_locals != LOCALS_UNDEF
> +      || localize_hidden
>        || strip_specific_list != NULL
>        || keep_specific_list != NULL
>        || localize_specific_list != NULL
> @@ -3059,6 +3085,10 @@ copy_main (int argc, char *argv[])
>       case OPTION_KEEP_SYMBOLS:
>         add_specific_symbols (optarg, &keep_specific_list);
>         break;
> +
> +     case OPTION_LOCALIZE_HIDDEN:
> +       localize_hidden = TRUE;
> +       break
>  
>       case OPTION_LOCALIZE_SYMBOLS:
>         add_specific_symbols (optarg, &localize_specific_list);
> Index: doc/binutils.texi
> ===================================================================
> RCS file: /cvs/src/gnu/usr.bin/binutils-2.17/binutils/doc/binutils.texi,v
> retrieving revision 1.1.1.1
> diff -u -p -r1.1.1.1 binutils.texi
> --- doc/binutils.texi 24 Apr 2011 20:14:40 -0000      1.1.1.1
> +++ doc/binutils.texi 20 May 2018 08:06:17 -0000
> @@ -952,6 +952,7 @@ objcopy [@option{-F} @var{bfdname}|@opti
>          [@option{-N} 
> @var{symbolname}|@option{--strip-symbol=}@var{symbolname}]
>          [@option{--strip-unneeded-symbol=}@var{symbolname}]
>          [@option{-G} 
> @var{symbolname}|@option{--keep-global-symbol=}@var{symbolname}]
> +     [@option{--localize-hidden}]
>          [@option{-L} 
> @var{symbolname}|@option{--localize-symbol=}@var{symbolname}]
>          [@option{--globalize-symbol=}@var{symbolname}]
>          [@option{-W} 
> @var{symbolname}|@option{--weaken-symbol=}@var{symbolname}]
> @@ -1123,6 +1124,11 @@ by a relocation.  This option may be giv
>  Keep only symbol @var{symbolname} global.  Make all other symbols local
>  to the file, so that they are not visible externally.  This option may
>  be given more than once.
> +
> +@item --localize-hidden
> +In an ELF object, mark all symbols that have hidden or internal visibility
> +as local.  This option applies on top of symbol-specific localization options
> +such as @option{-L}.
>  
>  @item -L @var{symbolname}
>  @itemx --localize-symbol=@var{symbolname}
> 
> 

Reply via email to