binutils/
* objcopy.c (localize_hidden): New variable. (OPTION_LOCALIZE_HIDDEN): New command_line_switch value. (copy_options): Add --localize-hidden. (copy_usage): Mention --localize-hidden. (is_hidden_symbol): New function. (filter_symbols): Handle localize_hidden. (copy_object): Call filter_symbols if localize_hidden. (copy_main): Handle OPTION_LOCALIZE_HIDDEN. * doc/binutils.texi (--localize-hidden): Document new option. binutils/testsuite/ * binutils-all/localize-hidden-1.s, * binutils-all/localize-hidden-1.d, * binutils-all/localize-hidden-2.s, * binutils-all/localize-hidden-2.d: New tests. * binutils-all/objcopy.exp: Run them.
This commit is contained in:
parent
22a84b5580
commit
d58c2e3acd
9 changed files with 124 additions and 1 deletions
|
@ -1,3 +1,15 @@
|
||||||
|
2006-06-23 Richard Sandiford <richard@codesourcery.com>
|
||||||
|
|
||||||
|
* objcopy.c (localize_hidden): New variable.
|
||||||
|
(OPTION_LOCALIZE_HIDDEN): New command_line_switch value.
|
||||||
|
(copy_options): Add --localize-hidden.
|
||||||
|
(copy_usage): Mention --localize-hidden.
|
||||||
|
(is_hidden_symbol): New function.
|
||||||
|
(filter_symbols): Handle localize_hidden.
|
||||||
|
(copy_object): Call filter_symbols if localize_hidden.
|
||||||
|
(copy_main): Handle OPTION_LOCALIZE_HIDDEN.
|
||||||
|
* doc/binutils.texi (--localize-hidden): Document new option.
|
||||||
|
|
||||||
2006-06-23 Daniel Jacobowitz <dan@codesourcery.com>
|
2006-06-23 Daniel Jacobowitz <dan@codesourcery.com>
|
||||||
|
|
||||||
* Makefile.am (ar_DEPENDENCIES, ranlib_DEPENDENCIES)
|
* Makefile.am (ar_DEPENDENCIES, ranlib_DEPENDENCIES)
|
||||||
|
|
|
@ -952,6 +952,7 @@ objcopy [@option{-F} @var{bfdname}|@option{--target=}@var{bfdname}]
|
||||||
[@option{-N} @var{symbolname}|@option{--strip-symbol=}@var{symbolname}]
|
[@option{-N} @var{symbolname}|@option{--strip-symbol=}@var{symbolname}]
|
||||||
[@option{--strip-unneeded-symbol=}@var{symbolname}]
|
[@option{--strip-unneeded-symbol=}@var{symbolname}]
|
||||||
[@option{-G} @var{symbolname}|@option{--keep-global-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{-L} @var{symbolname}|@option{--localize-symbol=}@var{symbolname}]
|
||||||
[@option{--globalize-symbol=}@var{symbolname}]
|
[@option{--globalize-symbol=}@var{symbolname}]
|
||||||
[@option{-W} @var{symbolname}|@option{--weaken-symbol=}@var{symbolname}]
|
[@option{-W} @var{symbolname}|@option{--weaken-symbol=}@var{symbolname}]
|
||||||
|
@ -1124,6 +1125,11 @@ Keep only symbol @var{symbolname} global. Make all other symbols local
|
||||||
to the file, so that they are not visible externally. This option may
|
to the file, so that they are not visible externally. This option may
|
||||||
be given more than once.
|
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}
|
@item -L @var{symbolname}
|
||||||
@itemx --localize-symbol=@var{symbolname}
|
@itemx --localize-symbol=@var{symbolname}
|
||||||
Make symbol @var{symbolname} local to the file, so that it is not
|
Make symbol @var{symbolname} local to the file, so that it is not
|
||||||
|
|
|
@ -190,6 +190,9 @@ static bfd_boolean remove_leading_char = FALSE;
|
||||||
/* Whether to permit wildcard in symbol comparison. */
|
/* Whether to permit wildcard in symbol comparison. */
|
||||||
static bfd_boolean wildcard = FALSE;
|
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,
|
/* List of symbols to strip, keep, localize, keep-global, weaken,
|
||||||
or redefine. */
|
or redefine. */
|
||||||
static struct symlist *strip_specific_list = NULL;
|
static struct symlist *strip_specific_list = NULL;
|
||||||
|
@ -240,6 +243,7 @@ enum command_line_switch
|
||||||
OPTION_STRIP_UNNEEDED_SYMBOL,
|
OPTION_STRIP_UNNEEDED_SYMBOL,
|
||||||
OPTION_STRIP_UNNEEDED_SYMBOLS,
|
OPTION_STRIP_UNNEEDED_SYMBOLS,
|
||||||
OPTION_KEEP_SYMBOLS,
|
OPTION_KEEP_SYMBOLS,
|
||||||
|
OPTION_LOCALIZE_HIDDEN,
|
||||||
OPTION_LOCALIZE_SYMBOLS,
|
OPTION_LOCALIZE_SYMBOLS,
|
||||||
OPTION_GLOBALIZE_SYMBOL,
|
OPTION_GLOBALIZE_SYMBOL,
|
||||||
OPTION_GLOBALIZE_SYMBOLS,
|
OPTION_GLOBALIZE_SYMBOLS,
|
||||||
|
@ -328,6 +332,7 @@ static struct option copy_options[] =
|
||||||
{"keep-global-symbols", required_argument, 0, OPTION_KEEPGLOBAL_SYMBOLS},
|
{"keep-global-symbols", required_argument, 0, OPTION_KEEPGLOBAL_SYMBOLS},
|
||||||
{"keep-symbol", required_argument, 0, 'K'},
|
{"keep-symbol", required_argument, 0, 'K'},
|
||||||
{"keep-symbols", required_argument, 0, OPTION_KEEP_SYMBOLS},
|
{"keep-symbols", required_argument, 0, OPTION_KEEP_SYMBOLS},
|
||||||
|
{"localize-hidden", no_argument, 0, OPTION_LOCALIZE_HIDDEN},
|
||||||
{"localize-symbol", required_argument, 0, 'L'},
|
{"localize-symbol", required_argument, 0, 'L'},
|
||||||
{"localize-symbols", required_argument, 0, OPTION_LOCALIZE_SYMBOLS},
|
{"localize-symbols", required_argument, 0, OPTION_LOCALIZE_SYMBOLS},
|
||||||
{"no-adjust-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS},
|
{"no-adjust-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS},
|
||||||
|
@ -428,6 +433,7 @@ copy_usage (FILE *stream, int exit_status)
|
||||||
--only-keep-debug Strip everything but the debug information\n\
|
--only-keep-debug Strip everything but the debug information\n\
|
||||||
-K --keep-symbol <name> Do not strip symbol <name>\n\
|
-K --keep-symbol <name> Do not strip symbol <name>\n\
|
||||||
--keep-file-symbols Do not strip file symbol(s)\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\
|
-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\
|
--globalize-symbol <name> Force symbol <name> to be marked as a global\n\
|
||||||
-G --keep-global-symbol <name> Localize all symbols except <name>\n\
|
-G --keep-global-symbol <name> Localize all symbols except <name>\n\
|
||||||
|
@ -809,6 +815,24 @@ is_strip_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
|
||||||
return FALSE;
|
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.
|
/* Choose which symbol entries to copy; put the result in OSYMS.
|
||||||
We don't copy in place, because that confuses the relocs.
|
We don't copy in place, because that confuses the relocs.
|
||||||
Return the number of symbols to print. */
|
Return the number of symbols to print. */
|
||||||
|
@ -955,7 +979,8 @@ filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
|
||||||
&& (flags & (BSF_GLOBAL | BSF_WEAK))
|
&& (flags & (BSF_GLOBAL | BSF_WEAK))
|
||||||
&& (is_specified_symbol (name, localize_specific_list)
|
&& (is_specified_symbol (name, localize_specific_list)
|
||||||
|| (keepglobal_specific_list != NULL
|
|| (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_GLOBAL | BSF_WEAK);
|
||||||
sym->flags |= BSF_LOCAL;
|
sym->flags |= BSF_LOCAL;
|
||||||
|
@ -1532,6 +1557,7 @@ copy_object (bfd *ibfd, bfd *obfd)
|
||||||
|| strip_symbols == STRIP_UNNEEDED
|
|| strip_symbols == STRIP_UNNEEDED
|
||||||
|| strip_symbols == STRIP_NONDEBUG
|
|| strip_symbols == STRIP_NONDEBUG
|
||||||
|| discard_locals != LOCALS_UNDEF
|
|| discard_locals != LOCALS_UNDEF
|
||||||
|
|| localize_hidden
|
||||||
|| strip_specific_list != NULL
|
|| strip_specific_list != NULL
|
||||||
|| keep_specific_list != NULL
|
|| keep_specific_list != NULL
|
||||||
|| localize_specific_list != NULL
|
|| localize_specific_list != NULL
|
||||||
|
@ -3064,6 +3090,10 @@ copy_main (int argc, char *argv[])
|
||||||
add_specific_symbols (optarg, &keep_specific_list);
|
add_specific_symbols (optarg, &keep_specific_list);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OPTION_LOCALIZE_HIDDEN:
|
||||||
|
localize_hidden = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
case OPTION_LOCALIZE_SYMBOLS:
|
case OPTION_LOCALIZE_SYMBOLS:
|
||||||
add_specific_symbols (optarg, &localize_specific_list);
|
add_specific_symbols (optarg, &localize_specific_list);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1,3 +1,11 @@
|
||||||
|
2006-06-23 Richard Sandiford <richard@codesourcery.com>
|
||||||
|
|
||||||
|
* binutils-all/localize-hidden-1.s,
|
||||||
|
* binutils-all/localize-hidden-1.d,
|
||||||
|
* binutils-all/localize-hidden-2.s,
|
||||||
|
* binutils-all/localize-hidden-2.d: New tests.
|
||||||
|
* binutils-all/objcopy.exp: Run them.
|
||||||
|
|
||||||
2006-06-06 Paul Brook <paul@codesourcery.com>
|
2006-06-06 Paul Brook <paul@codesourcery.com>
|
||||||
|
|
||||||
* binutils-all/arm/objdump.exp: New file.
|
* binutils-all/arm/objdump.exp: New file.
|
||||||
|
|
17
binutils/testsuite/binutils-all/localize-hidden-1.d
Normal file
17
binutils/testsuite/binutils-all/localize-hidden-1.d
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
#PROG: objcopy
|
||||||
|
#readelf: --symbols
|
||||||
|
#objcopy: --localize-hidden
|
||||||
|
#name: --localize-hidden test 1
|
||||||
|
#...
|
||||||
|
.*: 0+1200 +0 +NOTYPE +LOCAL +HIDDEN +ABS +Lhidden
|
||||||
|
.*: 0+1300 +0 +NOTYPE +LOCAL +INTERNAL +ABS +Linternal
|
||||||
|
.*: 0+1400 +0 +NOTYPE +LOCAL +PROTECTED +ABS +Lprotected
|
||||||
|
.*: 0+1100 +0 +NOTYPE +LOCAL +DEFAULT +ABS +Ldefault
|
||||||
|
.*: 0+2200 +0 +NOTYPE +LOCAL +HIDDEN +ABS +Ghidden
|
||||||
|
.*: 0+2300 +0 +NOTYPE +LOCAL +INTERNAL +ABS +Ginternal
|
||||||
|
.*: 0+3200 +0 +NOTYPE +LOCAL +HIDDEN +ABS +Whidden
|
||||||
|
.*: 0+3300 +0 +NOTYPE +LOCAL +INTERNAL +ABS +Winternal
|
||||||
|
.*: 0+2100 +0 +NOTYPE +GLOBAL +DEFAULT +ABS +Gdefault
|
||||||
|
.*: 0+2400 +0 +NOTYPE +GLOBAL +PROTECTED +ABS +Gprotected
|
||||||
|
.*: 0+3100 +0 +NOTYPE +WEAK +DEFAULT +ABS +Wdefault
|
||||||
|
.*: 0+3400 +0 +NOTYPE +WEAK +PROTECTED +ABS +Wprotected
|
36
binutils/testsuite/binutils-all/localize-hidden-1.s
Normal file
36
binutils/testsuite/binutils-all/localize-hidden-1.s
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
.globl Gdefault
|
||||||
|
.globl Ghidden
|
||||||
|
.globl Ginternal
|
||||||
|
.globl Gprotected
|
||||||
|
|
||||||
|
.weak Wdefault
|
||||||
|
.weak Whidden
|
||||||
|
.weak Winternal
|
||||||
|
.weak Wprotected
|
||||||
|
|
||||||
|
.hidden Lhidden
|
||||||
|
.hidden Ghidden
|
||||||
|
.hidden Whidden
|
||||||
|
|
||||||
|
.internal Linternal
|
||||||
|
.internal Ginternal
|
||||||
|
.internal Winternal
|
||||||
|
|
||||||
|
.protected Lprotected
|
||||||
|
.protected Gprotected
|
||||||
|
.protected Wprotected
|
||||||
|
|
||||||
|
.equ Ldefault, 0x1100
|
||||||
|
.equ Lhidden, 0x1200
|
||||||
|
.equ Linternal, 0x1300
|
||||||
|
.equ Lprotected, 0x1400
|
||||||
|
|
||||||
|
.equ Gdefault, 0x2100
|
||||||
|
.equ Ghidden, 0x2200
|
||||||
|
.equ Ginternal, 0x2300
|
||||||
|
.equ Gprotected, 0x2400
|
||||||
|
|
||||||
|
.equ Wdefault, 0x3100
|
||||||
|
.equ Whidden, 0x3200
|
||||||
|
.equ Winternal, 0x3300
|
||||||
|
.equ Wprotected, 0x3400
|
7
binutils/testsuite/binutils-all/localize-hidden-2.d
Normal file
7
binutils/testsuite/binutils-all/localize-hidden-2.d
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
#PROG: objcopy
|
||||||
|
#nm: -n
|
||||||
|
#objcopy: --localize-hidden
|
||||||
|
#name: --localize-hidden test 2
|
||||||
|
#...
|
||||||
|
0+100 A G
|
||||||
|
#pass
|
2
binutils/testsuite/binutils-all/localize-hidden-2.s
Normal file
2
binutils/testsuite/binutils-all/localize-hidden-2.s
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
.globl G
|
||||||
|
.equ G,0x100
|
|
@ -728,3 +728,8 @@ if [is_elf_format] {
|
||||||
|
|
||||||
run_dump_test "copy-2"
|
run_dump_test "copy-2"
|
||||||
run_dump_test "copy-3"
|
run_dump_test "copy-3"
|
||||||
|
|
||||||
|
if [is_elf_format] {
|
||||||
|
run_dump_test "localize-hidden-1"
|
||||||
|
}
|
||||||
|
run_dump_test "localize-hidden-2"
|
||||||
|
|
Loading…
Add table
Reference in a new issue