diff options
author | Niklas G?rtler <profclonk@gmail.com> | 2019-08-28 12:33:41 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2019-08-28 12:33:41 +0100 |
commit | fa463e9fc644e7a3bad39aa73bf6be72ea865805 (patch) | |
tree | 8cf65d7b31acaa739e104787a35dcf7022d3cc9f /binutils/objcopy.c | |
parent | a1c110a3fe02f5cb8de18137f6615005288e849e (diff) | |
download | gdb-fa463e9fc644e7a3bad39aa73bf6be72ea865805.zip gdb-fa463e9fc644e7a3bad39aa73bf6be72ea865805.tar.gz gdb-fa463e9fc644e7a3bad39aa73bf6be72ea865805.tar.bz2 |
Add an option to objcopy to change the alignment of sections.
PR 24942
* objcopy.c (SECTION_CONTEXT_SET_ALIGNMENT): New constant.
(struct section_list): Add alignment field.
(command_line_switch): Add OPTION_SET_SECTION_ALIGNMENT.
(copy_options): Add --set-section-alignment.
(copy_usage): Describe --set-section-alignment.
(find_section_list): Initialise the alignment field.
(setup_section): Handle the alignment field.
(copy_main): Handle OPTION_SET_SECTION_ALIGNMENT.
* doc/binutils.texi: Document the new feature.
* NEWS: Mention the new feature.
Diffstat (limited to 'binutils/objcopy.c')
-rw-r--r-- | binutils/objcopy.c | 50 |
1 files changed, 46 insertions, 4 deletions
diff --git a/binutils/objcopy.c b/binutils/objcopy.c index eb25421..ebb9933 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -143,10 +143,12 @@ struct section_list #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. */ bfd_vma vma_val; /* Amount to change by or set to. */ bfd_vma lma_val; /* Amount to change by or set to. */ flagword flags; /* What to set the section flags to. */ + unsigned int alignment; /* Alignment of output section. */ }; static struct section_list *change_sections; @@ -344,8 +346,9 @@ enum command_line_switch OPTION_REMOVE_RELOCS, OPTION_RENAME_SECTION, OPTION_REVERSE_BYTES, - OPTION_SECTION_ALIGNMENT, + OPTION_PE_SECTION_ALIGNMENT, OPTION_SET_SECTION_FLAGS, + OPTION_SET_SECTION_ALIGNMENT, OPTION_SET_START, OPTION_SREC_FORCES3, OPTION_SREC_LEN, @@ -476,8 +479,9 @@ static struct option copy_options[] = {"remove-relocations", required_argument, 0, OPTION_REMOVE_RELOCS}, {"rename-section", required_argument, 0, OPTION_RENAME_SECTION}, {"reverse-bytes", required_argument, 0, OPTION_REVERSE_BYTES}, - {"section-alignment", required_argument, 0, OPTION_SECTION_ALIGNMENT}, + {"section-alignment", required_argument, 0, OPTION_PE_SECTION_ALIGNMENT}, {"set-section-flags", required_argument, 0, OPTION_SET_SECTION_FLAGS}, + {"set-section-alignment", required_argument, 0, OPTION_SET_SECTION_ALIGNMENT}, {"set-start", required_argument, 0, OPTION_SET_START}, {"srec-forceS3", no_argument, 0, OPTION_SREC_FORCES3}, {"srec-len", required_argument, 0, OPTION_SREC_LEN}, @@ -610,6 +614,8 @@ copy_usage (FILE *stream, int exit_status) Warn if a named section does not exist\n\ --set-section-flags <name>=<flags>\n\ Set section <name>'s properties to <flags>\n\ + --set-section-alignment <name>=<align>\n\ + Set section <name>'s alignment to 2^<align> bytes\n\ --add-section <name>=<file> Add section <name> found in <file> to output\n\ --update-section <name>=<file>\n\ Update contents of section <name> with\n\ @@ -964,6 +970,7 @@ find_section_list (const char *name, bfd_boolean add, unsigned int context) p->vma_val = 0; p->lma_val = 0; p->flags = 0; + p->alignment = 0; p->next = change_sections; change_sections = p; @@ -3766,6 +3773,7 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg) const char * name; char *prefix = NULL; bfd_boolean make_nobits; + unsigned int alignment; if (is_strip_section (ibfd, isection)) return; @@ -3872,11 +3880,18 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg) osection->lma = lma; + p = find_section_list (bfd_section_name (ibfd, isection), FALSE, + SECTION_CONTEXT_SET_ALIGNMENT); + if (p != NULL) + alignment = p->alignment; + else + alignment = bfd_section_alignment (ibfd, isection); + /* FIXME: This is probably not enough. If we change the LMA we may have to recompute the header for the file as well. */ if (!bfd_set_section_alignment (obfd, osection, - bfd_section_alignment (ibfd, isection))) + alignment)) { err = _("failed to set alignment"); goto loser; @@ -5262,6 +5277,33 @@ copy_main (int argc, char *argv[]) } break; + case OPTION_SET_SECTION_ALIGNMENT: + { + struct section_list *p; + const char *s; + int len; + char *name; + int align; + + s = strchr (optarg, '='); + if (s == NULL) + fatal (_("bad format for %s"), "--set-section-alignment"); + + align = atoi(s+1); + if (align < 0) + fatal (_("bad format for %s"), "--set-section-alignment"); + + len = s - optarg; + name = (char *) xmalloc (len + 1); + strncpy (name, optarg, len); + name[len] = '\0'; + + p = find_section_list (name, TRUE, SECTION_CONTEXT_SET_ALIGNMENT); + + p->alignment = align; + } + break; + case OPTION_RENAME_SECTION: { flagword flags; @@ -5457,7 +5499,7 @@ copy_main (int argc, char *argv[]) pe_image_base = parse_vma (optarg, "--image-base"); break; - case OPTION_SECTION_ALIGNMENT: + case OPTION_PE_SECTION_ALIGNMENT: pe_section_alignment = parse_vma (optarg, "--section-alignment"); break; |