Add an option to objcopy to change the alignment of sections.
[deliverable/binutils-gdb.git] / binutils / objcopy.c
index eb25421c6ece341e4728aae59123cc39f1568d1f..ebb99339aaa8023ca360e566be8a994947e6ea49 100644 (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;
This page took 0.025008 seconds and 4 git commands to generate.