Change objcopy's --set-section-alignment option to take a byte alignment value rather...
authorNick Clifton <nickc@redhat.com>
Wed, 2 Oct 2019 10:55:02 +0000 (11:55 +0100)
committerNick Clifton <nickc@redhat.com>
Wed, 2 Oct 2019 10:55:02 +0000 (11:55 +0100)
PR 24942
* objcopy.c (copy_usage): Update description of
--set-section-alignment.
(copy_main): Interpret numeric argument of --set-section-alignment
as a byte alignment, not a power of two alignment.
* doc/binutils.texi: Update description of
--set-section-alignment.
* testsuite/binutils-all/set-section-alignment.d: New test.
* testsuite/binutils-all/objcopy.exp: Run the new test.

binutils/ChangeLog
binutils/doc/binutils.texi
binutils/objcopy.c
binutils/testsuite/binutils-all/objcopy.exp
binutils/testsuite/binutils-all/set-section-alignment.d [new file with mode: 0644]

index dcc876c67b76453e2eee4a83f28a1c19de0afab9..f4402ae742343e7f383e186ce44d2a0b0f69bf91 100644 (file)
@@ -1,3 +1,15 @@
+2019-10-02  Niklas Gürtler  <profclonk@gmail.com>
+
+       PR 24942
+       * objcopy.c (copy_usage): Update description of
+       --set-section-alignment.
+       (copy_main): Interpret numeric argument of --set-section-alignment
+       as a byte alignment, not a power of two alignment.
+       * doc/binutils.texi: Update description of
+       --set-section-alignment.
+       * testsuite/binutils-all/set-section-alignment.d: New test.
+       * testsuite/binutils-all/objcopy.exp: Run the new test.
+
 2019-09-30  Alan Modra  <amodra@gmail.com>
 
        PR 25046
index bb37cb0988460001ea4858d88f3d95bbe098c1e6..b0de3d061d11d46b4c6cd380f025dd7bb8b4b378 100644 (file)
@@ -1622,9 +1622,9 @@ contents--just remove the section instead.  Not all flags are
 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}.
+Set the alignment for any sections matching @var{sectionpattern}.
+@var{align} specifies the alignment in bytes and must be a power of
+two, i.e. 1, 2, 4, 8@dots{}. 
 
 @item --add-section @var{sectionname}=@var{filename}
 Add a new section named @var{sectionname} while copying the file.  The
index 6489fbe72f90c85787096bd4d39cb67ab8f58381..8f74bebae88e7cd8d60f8658b37b68fc7ba5b464 100644 (file)
@@ -615,7 +615,7 @@ copy_usage (FILE *stream, int exit_status)
      --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\
+                                   Set section <name>'s alignment to <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\
@@ -5280,24 +5280,37 @@ copy_main (int argc, char *argv[])
            const char *s;
            int len;
            char *name;
-           int align;
+           int palign, align;
 
            s = strchr (optarg, '=');
            if (s == NULL)
-             fatal (_("bad format for %s"), "--set-section-alignment");
+             fatal (_("bad format for --set-section-alignment: argument needed"));
            
-           align = atoi(s+1);
-           if (align < 0)
-             fatal (_("bad format for %s"), "--set-section-alignment");
+           align = atoi (s + 1);
+           if (align <= 0)
+             fatal (_("bad format for --set-section-alignment: numeric argument needed"));
 
+           /* Convert integer alignment into a power-of-two alignment.  */
+           palign = 0;
+           while ((align & 1) == 0)
+             {
+               align >>= 1;
+               ++palign;
+             }
+           
+           if (align != 1)
+             /* Number has more than on 1, i.e. wasn't a power of 2.  */
+             fatal (_("bad format for --set-section-alignment: alignment is not a power of two"));
+
+           /* Add the alignment setting to the section list.  */
            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;
+           if (p)
+             p->alignment = palign;
          }
          break;
          
index 3e3c35556dbe436f8aa5cc8644cd00c06a82b606..e12a8286a598542717b9c619e5abecf68bb62cd5 100644 (file)
@@ -1310,3 +1310,5 @@ proc objcopy_remove_relocations_from_executable { } {
 objcopy_remove_relocations_from_executable
 
 run_dump_test "pr23633"
+
+run_dump_test "set-section-alignment"
diff --git a/binutils/testsuite/binutils-all/set-section-alignment.d b/binutils/testsuite/binutils-all/set-section-alignment.d
new file mode 100644 (file)
index 0000000..d562ce1
--- /dev/null
@@ -0,0 +1,9 @@
+#source: pr23633.s
+#PROG: objcopy
+#objcopy: --set-section-alignment .text=16
+#objdump: --section-headers
+#notarget: *-*-*aout *-*-*coff *-*-cygwin* *-*-darwin *-*-mingw* *-*-go32 *-*-*pe hppa*-*-hpux* ns32k-*-* powerpc-*-aix* rs6000-*-* rx-*-* *-*-vms
+
+#...
+.*\.text.*2\*\*4
+#pass
This page took 0.030475 seconds and 4 git commands to generate.