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:
parent
a1c110a3fe
commit
fa463e9fc6
|
@ -1,3 +1,17 @@
|
||||||
|
2019-08-28 Niklas Gürtler <profclonk@gmail.com>
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
2019-08-28 Nick Clifton <nickc@redhat.com>
|
2019-08-28 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
PR 24931
|
PR 24931
|
||||||
|
|
|
@ -2,6 +2,9 @@
|
||||||
* Add --source-comment[=<txt>] option to objdump which if present,
|
* Add --source-comment[=<txt>] option to objdump which if present,
|
||||||
provides a prefix to source code lines displayed in a disassembly.
|
provides a prefix to source code lines displayed in a disassembly.
|
||||||
|
|
||||||
|
* Add --set-section-alignment <section-name>=<align> option to objcopy to allow
|
||||||
|
the changing of section alignments.
|
||||||
|
|
||||||
* Add --verilog-data-width option to objcopy for verilog targets to control
|
* Add --verilog-data-width option to objcopy for verilog targets to control
|
||||||
width of data elements in verilog hex format.
|
width of data elements in verilog hex format.
|
||||||
|
|
||||||
|
|
|
@ -1175,6 +1175,7 @@ objcopy [@option{-F} @var{bfdname}|@option{--target=}@var{bfdname}]
|
||||||
[@option{--change-section-vma} @var{sectionpattern}@{=,+,-@}@var{val}]
|
[@option{--change-section-vma} @var{sectionpattern}@{=,+,-@}@var{val}]
|
||||||
[@option{--change-warnings}] [@option{--no-change-warnings}]
|
[@option{--change-warnings}] [@option{--no-change-warnings}]
|
||||||
[@option{--set-section-flags} @var{sectionpattern}=@var{flags}]
|
[@option{--set-section-flags} @var{sectionpattern}=@var{flags}]
|
||||||
|
[@option{--set-section-alignment} @var{sectionpattern}=@var{align}]
|
||||||
[@option{--add-section} @var{sectionname}=@var{filename}]
|
[@option{--add-section} @var{sectionname}=@var{filename}]
|
||||||
[@option{--dump-section} @var{sectionname}=@var{filename}]
|
[@option{--dump-section} @var{sectionname}=@var{filename}]
|
||||||
[@option{--update-section} @var{sectionname}=@var{filename}]
|
[@option{--update-section} @var{sectionname}=@var{filename}]
|
||||||
|
@ -1620,6 +1621,11 @@ to clear the @samp{contents} flag of a section which does have
|
||||||
contents--just remove the section instead. Not all flags are
|
contents--just remove the section instead. Not all flags are
|
||||||
meaningful for all object file formats.
|
meaningful for all object file formats.
|
||||||
|
|
||||||
|
@item --set-section-alignment @var{sectionpattern}=@var{align}
|
||||||
|
Set the alignment for any sections matching @var{sectionpattern}. @var{align}
|
||||||
|
specifies the alignment as the exponent for the power of two, i.e. the
|
||||||
|
alignment in bytes will be 2^@var{align}.
|
||||||
|
|
||||||
@item --add-section @var{sectionname}=@var{filename}
|
@item --add-section @var{sectionname}=@var{filename}
|
||||||
Add a new section named @var{sectionname} while copying the file. The
|
Add a new section named @var{sectionname} while copying the file. The
|
||||||
contents of the new section are taken from the file @var{filename}. The
|
contents of the new section are taken from the file @var{filename}. The
|
||||||
|
@ -1975,8 +1981,9 @@ for dlls.
|
||||||
[This option is specific to PE targets.]
|
[This option is specific to PE targets.]
|
||||||
|
|
||||||
@item --section-alignment @var{num}
|
@item --section-alignment @var{num}
|
||||||
Sets the section alignment. Sections in memory will always begin at
|
Sets the section alignment field in the PE header. Sections in memory
|
||||||
addresses which are a multiple of this number. Defaults to 0x1000.
|
will always begin at addresses which are a multiple of this number.
|
||||||
|
Defaults to 0x1000.
|
||||||
[This option is specific to PE targets.]
|
[This option is specific to PE targets.]
|
||||||
|
|
||||||
@item --stack @var{reserve}
|
@item --stack @var{reserve}
|
||||||
|
|
|
@ -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_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_SET_FLAGS (1 << 6) /* Set the section's flags. */
|
||||||
#define SECTION_CONTEXT_REMOVE_RELOCS (1 << 7) /* Remove relocations for this section. */
|
#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 vma_val; /* Amount to change by or set to. */
|
||||||
bfd_vma lma_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. */
|
flagword flags; /* What to set the section flags to. */
|
||||||
|
unsigned int alignment; /* Alignment of output section. */
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct section_list *change_sections;
|
static struct section_list *change_sections;
|
||||||
|
@ -344,8 +346,9 @@ enum command_line_switch
|
||||||
OPTION_REMOVE_RELOCS,
|
OPTION_REMOVE_RELOCS,
|
||||||
OPTION_RENAME_SECTION,
|
OPTION_RENAME_SECTION,
|
||||||
OPTION_REVERSE_BYTES,
|
OPTION_REVERSE_BYTES,
|
||||||
OPTION_SECTION_ALIGNMENT,
|
OPTION_PE_SECTION_ALIGNMENT,
|
||||||
OPTION_SET_SECTION_FLAGS,
|
OPTION_SET_SECTION_FLAGS,
|
||||||
|
OPTION_SET_SECTION_ALIGNMENT,
|
||||||
OPTION_SET_START,
|
OPTION_SET_START,
|
||||||
OPTION_SREC_FORCES3,
|
OPTION_SREC_FORCES3,
|
||||||
OPTION_SREC_LEN,
|
OPTION_SREC_LEN,
|
||||||
|
@ -476,8 +479,9 @@ static struct option copy_options[] =
|
||||||
{"remove-relocations", required_argument, 0, OPTION_REMOVE_RELOCS},
|
{"remove-relocations", required_argument, 0, OPTION_REMOVE_RELOCS},
|
||||||
{"rename-section", required_argument, 0, OPTION_RENAME_SECTION},
|
{"rename-section", required_argument, 0, OPTION_RENAME_SECTION},
|
||||||
{"reverse-bytes", required_argument, 0, OPTION_REVERSE_BYTES},
|
{"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-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},
|
{"set-start", required_argument, 0, OPTION_SET_START},
|
||||||
{"srec-forceS3", no_argument, 0, OPTION_SREC_FORCES3},
|
{"srec-forceS3", no_argument, 0, OPTION_SREC_FORCES3},
|
||||||
{"srec-len", required_argument, 0, OPTION_SREC_LEN},
|
{"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\
|
Warn if a named section does not exist\n\
|
||||||
--set-section-flags <name>=<flags>\n\
|
--set-section-flags <name>=<flags>\n\
|
||||||
Set section <name>'s properties to <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\
|
--add-section <name>=<file> Add section <name> found in <file> to output\n\
|
||||||
--update-section <name>=<file>\n\
|
--update-section <name>=<file>\n\
|
||||||
Update contents of section <name> with\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->vma_val = 0;
|
||||||
p->lma_val = 0;
|
p->lma_val = 0;
|
||||||
p->flags = 0;
|
p->flags = 0;
|
||||||
|
p->alignment = 0;
|
||||||
p->next = change_sections;
|
p->next = change_sections;
|
||||||
change_sections = p;
|
change_sections = p;
|
||||||
|
|
||||||
|
@ -3766,6 +3773,7 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
|
||||||
const char * name;
|
const char * name;
|
||||||
char *prefix = NULL;
|
char *prefix = NULL;
|
||||||
bfd_boolean make_nobits;
|
bfd_boolean make_nobits;
|
||||||
|
unsigned int alignment;
|
||||||
|
|
||||||
if (is_strip_section (ibfd, isection))
|
if (is_strip_section (ibfd, isection))
|
||||||
return;
|
return;
|
||||||
|
@ -3872,11 +3880,18 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
|
||||||
|
|
||||||
osection->lma = lma;
|
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
|
/* FIXME: This is probably not enough. If we change the LMA we
|
||||||
may have to recompute the header for the file as well. */
|
may have to recompute the header for the file as well. */
|
||||||
if (!bfd_set_section_alignment (obfd,
|
if (!bfd_set_section_alignment (obfd,
|
||||||
osection,
|
osection,
|
||||||
bfd_section_alignment (ibfd, isection)))
|
alignment))
|
||||||
{
|
{
|
||||||
err = _("failed to set alignment");
|
err = _("failed to set alignment");
|
||||||
goto loser;
|
goto loser;
|
||||||
|
@ -5262,6 +5277,33 @@ copy_main (int argc, char *argv[])
|
||||||
}
|
}
|
||||||
break;
|
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:
|
case OPTION_RENAME_SECTION:
|
||||||
{
|
{
|
||||||
flagword flags;
|
flagword flags;
|
||||||
|
@ -5457,7 +5499,7 @@ copy_main (int argc, char *argv[])
|
||||||
pe_image_base = parse_vma (optarg, "--image-base");
|
pe_image_base = parse_vma (optarg, "--image-base");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPTION_SECTION_ALIGNMENT:
|
case OPTION_PE_SECTION_ALIGNMENT:
|
||||||
pe_section_alignment = parse_vma (optarg,
|
pe_section_alignment = parse_vma (optarg,
|
||||||
"--section-alignment");
|
"--section-alignment");
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue