mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-19 00:59:15 +08:00
Prevent the --keep-global-symbol and --globalize-symbol options from being used together.
This is the result of an email thread starting here: https://sourceware.org/ml/binutils/2018-09/msg00031.html The main point of the thread is this observation: * Supposing we had an object file with two globals, SomeGlobal and SomeOtherGlobal, if one were to do "--globalize-symbol SomeGlobal --keep-global-symbol SomeOtherGlobal", you might expect that both SomeGlobal and SomeOtherGlobal are global in the output file... but it isn't. Because --keep-global-symbol is set and doesn't include SomeGlobal, SomeGlobal will be demoted to a local symbol. And because the check to see if we should apply the --globalize-symbol flag checks "flags" (the original flag set), and not "sym->flags", it decides not to do anything, so SomeGlobal remains a local symbol. Although this is a weird edge case, should this be changed so that --keep-global-symbol implicitly keeps anything also specified via --globalize-symbol? (The code seems technically correct with respect to the documentation, but IMO the behavior is counter-intuitive). binutils* objcopy.c (copy_main): Issue a fata error if the --keep-global-symbol(s) and the --globalize-symbol(s) options are used together. * doc/binutils.texi: Document that the two options are incompatible. * testsuite/binutils-all/copy-5.d: New test. * testsuite/binutils-all/objcopy.exp: Run the new test.
This commit is contained in:
@ -1,3 +1,14 @@
|
|||||||
|
2018-10-11 Jordan Rupprecht <rupprecht@google.com>
|
||||||
|
Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* objcopy.c (copy_main): Issue a fata error if the
|
||||||
|
--keep-global-symbol(s) and the --globalize-symbol(s) options are
|
||||||
|
used together.
|
||||||
|
* doc/binutils.texi: Document that the two options are
|
||||||
|
incompatible.
|
||||||
|
* testsuite/binutils-all/copy-5.d: New test.
|
||||||
|
* testsuite/binutils-all/objcopy.exp: Run the new test.
|
||||||
|
|
||||||
2018-10-10 Helge Deller <deller@gmx.de>
|
2018-10-10 Helge Deller <deller@gmx.de>
|
||||||
Alan Modra <amodra@gmail.com>
|
Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
@ -1129,6 +1129,7 @@ objcopy [@option{-F} @var{bfdname}|@option{--target=}@var{bfdname}]
|
|||||||
[@option{--localize-hidden}]
|
[@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{--globalize-symbols=}@var{filename}]
|
||||||
[@option{-W} @var{symbolname}|@option{--weaken-symbol=}@var{symbolname}]
|
[@option{-W} @var{symbolname}|@option{--weaken-symbol=}@var{symbolname}]
|
||||||
[@option{-w}|@option{--wildcard}]
|
[@option{-w}|@option{--wildcard}]
|
||||||
[@option{-x}|@option{--discard-all}]
|
[@option{-x}|@option{--discard-all}]
|
||||||
@ -1169,7 +1170,6 @@ objcopy [@option{-F} @var{bfdname}|@option{--target=}@var{bfdname}]
|
|||||||
[@option{--strip-unneeded-symbols=}@var{filename}]
|
[@option{--strip-unneeded-symbols=}@var{filename}]
|
||||||
[@option{--keep-global-symbols=}@var{filename}]
|
[@option{--keep-global-symbols=}@var{filename}]
|
||||||
[@option{--localize-symbols=}@var{filename}]
|
[@option{--localize-symbols=}@var{filename}]
|
||||||
[@option{--globalize-symbols=}@var{filename}]
|
|
||||||
[@option{--weaken-symbols=}@var{filename}]
|
[@option{--weaken-symbols=}@var{filename}]
|
||||||
[@option{--add-symbol} @var{name}=[@var{section}:]@var{value}[,@var{flags}]]
|
[@option{--add-symbol} @var{name}=[@var{section}:]@var{value}[,@var{flags}]]
|
||||||
[@option{--alt-machine-code=}@var{index}]
|
[@option{--alt-machine-code=}@var{index}]
|
||||||
@ -1380,7 +1380,9 @@ by a relocation. This option may be given more than once.
|
|||||||
@itemx --keep-global-symbol=@var{symbolname}
|
@itemx --keep-global-symbol=@var{symbolname}
|
||||||
Keep only symbol @var{symbolname} global. Make all other symbols local
|
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. Note: this option cannot be used in
|
||||||
|
conjunction with the @option{--globalize-symbol} or
|
||||||
|
@option{--globalize-symbols} options.
|
||||||
|
|
||||||
@item --localize-hidden
|
@item --localize-hidden
|
||||||
In an ELF object, mark all symbols that have hidden or internal visibility
|
In an ELF object, mark all symbols that have hidden or internal visibility
|
||||||
@ -1400,7 +1402,8 @@ Make symbol @var{symbolname} weak. This option may be given more than once.
|
|||||||
@item --globalize-symbol=@var{symbolname}
|
@item --globalize-symbol=@var{symbolname}
|
||||||
Give symbol @var{symbolname} global scoping so that it is visible
|
Give symbol @var{symbolname} global scoping so that it is visible
|
||||||
outside of the file in which it is defined. This option may be given
|
outside of the file in which it is defined. This option may be given
|
||||||
more than once.
|
more than once. Note: this option cannot be used in conjunction with
|
||||||
|
the @option{-G} or @option{--keep-global-symbol} options.
|
||||||
|
|
||||||
@item -w
|
@item -w
|
||||||
@itemx --wildcard
|
@itemx --wildcard
|
||||||
@ -1774,7 +1777,9 @@ This option may be given more than once.
|
|||||||
Apply @option{--globalize-symbol} option to each symbol listed in the file
|
Apply @option{--globalize-symbol} option to each symbol listed in the file
|
||||||
@var{filename}. @var{filename} is simply a flat file, with one symbol
|
@var{filename}. @var{filename} is simply a flat file, with one symbol
|
||||||
name per line. Line comments may be introduced by the hash character.
|
name per line. Line comments may be introduced by the hash character.
|
||||||
This option may be given more than once.
|
This option may be given more than once. Note: this option cannot be
|
||||||
|
used in conjunction with the @option{-G} or @option{--keep-global-symbol}
|
||||||
|
options.
|
||||||
|
|
||||||
@item --weaken-symbols=@var{filename}
|
@item --weaken-symbols=@var{filename}
|
||||||
Apply @option{--weaken-symbol} option to each symbol listed in the file
|
Apply @option{--weaken-symbol} option to each symbol listed in the file
|
||||||
|
@ -4753,6 +4753,8 @@ copy_main (int argc, char *argv[])
|
|||||||
bfd_boolean show_version = FALSE;
|
bfd_boolean show_version = FALSE;
|
||||||
bfd_boolean change_warn = TRUE;
|
bfd_boolean change_warn = TRUE;
|
||||||
bfd_boolean formats_info = FALSE;
|
bfd_boolean formats_info = FALSE;
|
||||||
|
bfd_boolean use_globalize = FALSE;
|
||||||
|
bfd_boolean use_keep_global = FALSE;
|
||||||
int c;
|
int c;
|
||||||
struct stat statbuf;
|
struct stat statbuf;
|
||||||
const bfd_arch_info_type *input_arch = NULL;
|
const bfd_arch_info_type *input_arch = NULL;
|
||||||
@ -4871,10 +4873,12 @@ copy_main (int argc, char *argv[])
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case OPTION_GLOBALIZE_SYMBOL:
|
case OPTION_GLOBALIZE_SYMBOL:
|
||||||
|
use_globalize = TRUE;
|
||||||
add_specific_symbol (optarg, globalize_specific_htab);
|
add_specific_symbol (optarg, globalize_specific_htab);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'G':
|
case 'G':
|
||||||
|
use_keep_global = TRUE;
|
||||||
add_specific_symbol (optarg, keepglobal_specific_htab);
|
add_specific_symbol (optarg, keepglobal_specific_htab);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -5306,11 +5310,13 @@ copy_main (int argc, char *argv[])
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case OPTION_GLOBALIZE_SYMBOLS:
|
case OPTION_GLOBALIZE_SYMBOLS:
|
||||||
|
use_globalize = TRUE;
|
||||||
add_specific_symbols (optarg, globalize_specific_htab,
|
add_specific_symbols (optarg, globalize_specific_htab,
|
||||||
&globalize_specific_buffer);
|
&globalize_specific_buffer);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPTION_KEEPGLOBAL_SYMBOLS:
|
case OPTION_KEEPGLOBAL_SYMBOLS:
|
||||||
|
use_keep_global = TRUE;
|
||||||
add_specific_symbols (optarg, keepglobal_specific_htab,
|
add_specific_symbols (optarg, keepglobal_specific_htab,
|
||||||
&keepglobal_specific_buffer);
|
&keepglobal_specific_buffer);
|
||||||
break;
|
break;
|
||||||
@ -5446,6 +5452,9 @@ copy_main (int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (use_globalize && use_keep_global)
|
||||||
|
fatal(_("--globalize-symbol(s) is incompatible with -G/--keep-global-symbol(s)"));
|
||||||
|
|
||||||
if (formats_info)
|
if (formats_info)
|
||||||
{
|
{
|
||||||
display_info ();
|
display_info ();
|
||||||
|
7
binutils/testsuite/binutils-all/copy-5.d
Normal file
7
binutils/testsuite/binutils-all/copy-5.d
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#PROG: objcopy
|
||||||
|
#source: bintest.s
|
||||||
|
#objcopy: -G fred --globalize-symbol jim bintest.o bintest.copy.o
|
||||||
|
# A few targets cannot assemble the bintest.s source file...
|
||||||
|
#notarget: pdp11-* *-darwin
|
||||||
|
#name: Error when using --keep-global-symbol with --globalize-symbol
|
||||||
|
#error: \A[^\n]*: --globalize-symbol\(s\) is incompatible with -G/--keep-global-symbol\(s\)
|
@ -1074,6 +1074,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"
|
||||||
run_dump_test "copy-4"
|
run_dump_test "copy-4"
|
||||||
|
run_dump_test "copy-5"
|
||||||
|
|
||||||
# Use bintest.o from the copy-4 test to determine ELF reloc type
|
# Use bintest.o from the copy-4 test to determine ELF reloc type
|
||||||
set reloc_format rel
|
set reloc_format rel
|
||||||
if { [is_elf_format] && [is_rela tmpdir/bintest.o] } {
|
if { [is_elf_format] && [is_rela tmpdir/bintest.o] } {
|
||||||
|
Reference in New Issue
Block a user