> 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} > >
