From de564eb5cc8c67fc38f9910937935eef5ebc17d8 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 11 Oct 2018 11:38:10 +0100 Subject: [PATCH] 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. --- binutils/ChangeLog | 11 +++++++++++ binutils/doc/binutils.texi | 13 +++++++++---- binutils/objcopy.c | 9 +++++++++ binutils/testsuite/binutils-all/copy-5.d | 7 +++++++ binutils/testsuite/binutils-all/objcopy.exp | 2 ++ 5 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 binutils/testsuite/binutils-all/copy-5.d diff --git a/binutils/ChangeLog b/binutils/ChangeLog index fd568340df..8b84df5d57 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,14 @@ +2018-10-11 Jordan Rupprecht + Nick Clifton + + * 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 Alan Modra diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi index 76cbed05af..cd70791490 100644 --- a/binutils/doc/binutils.texi +++ b/binutils/doc/binutils.texi @@ -1129,6 +1129,7 @@ objcopy [@option{-F} @var{bfdname}|@option{--target=}@var{bfdname}] [@option{--localize-hidden}] [@option{-L} @var{symbolname}|@option{--localize-symbol=}@var{symbolname}] [@option{--globalize-symbol=}@var{symbolname}] + [@option{--globalize-symbols=}@var{filename}] [@option{-W} @var{symbolname}|@option{--weaken-symbol=}@var{symbolname}] [@option{-w}|@option{--wildcard}] [@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{--keep-global-symbols=}@var{filename}] [@option{--localize-symbols=}@var{filename}] - [@option{--globalize-symbols=}@var{filename}] [@option{--weaken-symbols=}@var{filename}] [@option{--add-symbol} @var{name}=[@var{section}:]@var{value}[,@var{flags}]] [@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} 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. +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 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} 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 -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 @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 @var{filename}. @var{filename} is simply a flat file, with one symbol 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} Apply @option{--weaken-symbol} option to each symbol listed in the file diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 9af3c1eb1b..d8ae1f98a1 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -4753,6 +4753,8 @@ copy_main (int argc, char *argv[]) bfd_boolean show_version = FALSE; bfd_boolean change_warn = TRUE; bfd_boolean formats_info = FALSE; + bfd_boolean use_globalize = FALSE; + bfd_boolean use_keep_global = FALSE; int c; struct stat statbuf; const bfd_arch_info_type *input_arch = NULL; @@ -4871,10 +4873,12 @@ copy_main (int argc, char *argv[]) break; case OPTION_GLOBALIZE_SYMBOL: + use_globalize = TRUE; add_specific_symbol (optarg, globalize_specific_htab); break; case 'G': + use_keep_global = TRUE; add_specific_symbol (optarg, keepglobal_specific_htab); break; @@ -5306,11 +5310,13 @@ copy_main (int argc, char *argv[]) break; case OPTION_GLOBALIZE_SYMBOLS: + use_globalize = TRUE; add_specific_symbols (optarg, globalize_specific_htab, &globalize_specific_buffer); break; case OPTION_KEEPGLOBAL_SYMBOLS: + use_keep_global = TRUE; add_specific_symbols (optarg, keepglobal_specific_htab, &keepglobal_specific_buffer); 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) { display_info (); diff --git a/binutils/testsuite/binutils-all/copy-5.d b/binutils/testsuite/binutils-all/copy-5.d new file mode 100644 index 0000000000..33f22e5e3c --- /dev/null +++ b/binutils/testsuite/binutils-all/copy-5.d @@ -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\) diff --git a/binutils/testsuite/binutils-all/objcopy.exp b/binutils/testsuite/binutils-all/objcopy.exp index a1610297ad..3676f76213 100644 --- a/binutils/testsuite/binutils-all/objcopy.exp +++ b/binutils/testsuite/binutils-all/objcopy.exp @@ -1074,6 +1074,8 @@ if [is_elf_format] { run_dump_test "copy-2" run_dump_test "copy-3" run_dump_test "copy-4" +run_dump_test "copy-5" + # Use bintest.o from the copy-4 test to determine ELF reloc type set reloc_format rel if { [is_elf_format] && [is_rela tmpdir/bintest.o] } { -- 2.34.1