On Sun, May 20, 2018 at 11:09:48AM +0200, Mark Kettenis wrote:
> > 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@
>
My bad. Here a new diff.
Thanks.
--
Sebastien Marie
Index: gnu/usr.bin/binutils-2.17/binutils/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
--- gnu/usr.bin/binutils-2.17/binutils/doc/binutils.texi 24 Apr 2011
20:14:40 -0000 1.1.1.1
+++ gnu/usr.bin/binutils-2.17/binutils/doc/binutils.texi 20 May 2018
10:18:50 -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}
Index: gnu/usr.bin/binutils-2.17/binutils/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
--- gnu/usr.bin/binutils-2.17/binutils/objcopy.c 15 Nov 2015 04:13:17
-0000 1.4
+++ gnu/usr.bin/binutils-2.17/binutils/objcopy.c 20 May 2018 10:18:52
-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
@@ -3058,6 +3084,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: