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.
This commit is contained in:
Niklas G?rtler 2019-08-28 12:33:41 +01:00 committed by Nick Clifton
parent a1c110a3fe
commit fa463e9fc6
4 changed files with 72 additions and 6 deletions

View file

@ -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;