diff options
author | Fāng-ruì Sòng <maskray@google.com> | 2019-11-01 14:47:55 -0700 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2019-11-04 11:55:28 +1030 |
commit | 64f52b3ec1853d14293d5a461d7abc8bde5e3f62 (patch) | |
tree | c51b92c5e9a8c8cb49eed60c703e817a1f3aa248 /binutils/objcopy.c | |
parent | 5e874de30bb9e50ac7401f028e3c64e282854d2e (diff) | |
download | gdb-64f52b3ec1853d14293d5a461d7abc8bde5e3f62.zip gdb-64f52b3ec1853d14293d5a461d7abc8bde5e3f62.tar.gz gdb-64f52b3ec1853d14293d5a461d7abc8bde5e3f62.tar.bz2 |
Implement objcopy/strip --keep-section=<sectionpattern>
llvm-objcopy and llvm-strip support an option --keep-section that
keeps some sections from being removed.
* objcopy.c (enum option_values): Add OPTION_KEEP_SECTION.
(SECTION_CONTEXT_KEEP): Define. Adjust other SECTION_CONTEXT macros.
(copy_usage): Describe --keep-section.
(strip_usage): Likewise.
(copy_main): Handle SECTION_CONTEXT_KEEP.
(strip_main): Likewise.
(is_strip_section_1): Likewise.
* testsuite/binutils-all/objcopy.exp: Add tests.
* testsuite/binutils-all/keep-section-1.d: New test driver file.
* testsuite/binutils-all/keep-section-2.d: Likewise.
* doc/binutils.texi: Document the new feature.
* NEWS: Mention the new feature.
Diffstat (limited to 'binutils/objcopy.c')
-rw-r--r-- | binutils/objcopy.c | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 7bdd447..5643970 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -143,13 +143,14 @@ struct section_list COPY and REMOVE are mutually exlusive. SET and ALTER are mutually exclusive. */ #define SECTION_CONTEXT_REMOVE (1 << 0) /* Remove this section. */ #define SECTION_CONTEXT_COPY (1 << 1) /* Copy this section, delete all non-copied section. */ -#define SECTION_CONTEXT_SET_VMA (1 << 2) /* Set the sections' VMA address. */ -#define SECTION_CONTEXT_ALTER_VMA (1 << 3) /* Increment or decrement the section's VMA address. */ -#define SECTION_CONTEXT_SET_LMA (1 << 4) /* Set the sections' LMA address. */ -#define SECTION_CONTEXT_ALTER_LMA (1 << 5) /* Increment or decrement the section's LMA address. */ -#define SECTION_CONTEXT_SET_FLAGS (1 << 6) /* Set the section's flags. */ -#define SECTION_CONTEXT_REMOVE_RELOCS (1 << 7) /* Remove relocations for this section. */ -#define SECTION_CONTEXT_SET_ALIGNMENT (1 << 8) /* Set alignment for section. */ +#define SECTION_CONTEXT_KEEP (1 << 2) /* Keep this section. */ +#define SECTION_CONTEXT_SET_VMA (1 << 3) /* Set the sections' VMA address. */ +#define SECTION_CONTEXT_ALTER_VMA (1 << 4) /* Increment or decrement the section's VMA address. */ +#define SECTION_CONTEXT_SET_LMA (1 << 5) /* Set the sections' LMA address. */ +#define SECTION_CONTEXT_ALTER_LMA (1 << 6) /* Increment or decrement the section's LMA address. */ +#define SECTION_CONTEXT_SET_FLAGS (1 << 7) /* Set the section's flags. */ +#define SECTION_CONTEXT_REMOVE_RELOCS (1 << 8) /* Remove relocations for this section. */ +#define SECTION_CONTEXT_SET_ALIGNMENT (1 << 9) /* Set alignment for section. */ bfd_vma vma_val; /* Amount to change by or set to. */ bfd_vma lma_val; /* Amount to change by or set to. */ @@ -332,6 +333,7 @@ enum command_line_switch OPTION_INTERLEAVE_WIDTH, OPTION_KEEPGLOBAL_SYMBOLS, OPTION_KEEP_FILE_SYMBOLS, + OPTION_KEEP_SECTION, OPTION_KEEP_SYMBOLS, OPTION_LOCALIZE_HIDDEN, OPTION_LOCALIZE_SYMBOLS, @@ -386,6 +388,7 @@ static struct option strip_options[] = {"input-format", required_argument, 0, 'I'}, /* Obsolete */ {"input-target", required_argument, 0, 'I'}, {"keep-file-symbols", no_argument, 0, OPTION_KEEP_FILE_SYMBOLS}, + {"keep-section", required_argument, 0, OPTION_KEEP_SECTION}, {"keep-symbol", required_argument, 0, 'K'}, {"merge-notes", no_argument, 0, 'M'}, {"no-merge-notes", no_argument, 0, OPTION_NO_MERGE_NOTES}, @@ -457,6 +460,7 @@ static struct option copy_options[] = {"keep-file-symbols", no_argument, 0, OPTION_KEEP_FILE_SYMBOLS}, {"keep-global-symbol", required_argument, 0, 'G'}, {"keep-global-symbols", required_argument, 0, OPTION_KEEPGLOBAL_SYMBOLS}, + {"keep-section", required_argument, 0, OPTION_KEEP_SECTION}, {"keep-symbol", required_argument, 0, 'K'}, {"keep-symbols", required_argument, 0, OPTION_KEEP_SYMBOLS}, {"localize-hidden", no_argument, 0, OPTION_LOCALIZE_HIDDEN}, @@ -589,6 +593,7 @@ copy_usage (FILE *stream, int exit_status) --only-keep-debug Strip everything but the debug information\n\ --extract-dwo Copy only DWO sections\n\ --extract-symbol Remove section contents but keep symbols\n\ + --keep-section <name> Do not strip section <name>\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\ @@ -722,6 +727,7 @@ strip_usage (FILE *stream, int exit_status) -M --merge-notes Remove redundant entries in note sections (default)\n\ --no-merge-notes Do not attempt to remove redundant notes\n\ -N --strip-symbol=<name> Do not copy symbol <name>\n\ + --keep-section=<name> Do not strip section <name>\n\ -K --keep-symbol=<name> Do not strip symbol <name>\n\ --keep-file-symbols Do not strip file symbol(s)\n\ -w --wildcard Permit wildcard in symbol comparison\n\ @@ -1311,6 +1317,10 @@ is_mergeable_note_section (bfd * abfd, asection * sec) static bfd_boolean is_strip_section_1 (bfd *abfd ATTRIBUTE_UNUSED, asection *sec) { + if (find_section_list (bfd_section_name (sec), FALSE, SECTION_CONTEXT_KEEP) + != NULL) + return FALSE; + if (sections_removed || sections_copied) { struct section_list *p; @@ -4584,6 +4594,9 @@ strip_main (int argc, char *argv[]) case 'R': handle_remove_section_option (optarg); break; + case OPTION_KEEP_SECTION: + find_section_list (optarg, TRUE, SECTION_CONTEXT_KEEP); + break; case OPTION_REMOVE_RELOCS: handle_remove_relocations_option (optarg); break; @@ -5010,6 +5023,10 @@ copy_main (int argc, char *argv[]) handle_remove_section_option (optarg); break; + case OPTION_KEEP_SECTION: + find_section_list (optarg, TRUE, SECTION_CONTEXT_KEEP); + break; + case OPTION_REMOVE_RELOCS: handle_remove_relocations_option (optarg); break; |