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