diff options
-rw-r--r-- | binutils/ChangeLog | 12 | ||||
-rw-r--r-- | binutils/doc/binutils.texi | 6 | ||||
-rw-r--r-- | binutils/objcopy.c | 29 | ||||
-rw-r--r-- | binutils/testsuite/binutils-all/objcopy.exp | 2 | ||||
-rw-r--r-- | binutils/testsuite/binutils-all/set-section-alignment.d | 9 |
5 files changed, 47 insertions, 11 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index dcc876c..f4402ae 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -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 diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi index bb37cb0..b0de3d0 100644 --- a/binutils/doc/binutils.texi +++ b/binutils/doc/binutils.texi @@ -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 diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 6489fbe..8f74beb 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -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; diff --git a/binutils/testsuite/binutils-all/objcopy.exp b/binutils/testsuite/binutils-all/objcopy.exp index 3e3c355..e12a828 100644 --- a/binutils/testsuite/binutils-all/objcopy.exp +++ b/binutils/testsuite/binutils-all/objcopy.exp @@ -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 index 0000000..d562ce1 --- /dev/null +++ b/binutils/testsuite/binutils-all/set-section-alignment.d @@ -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 |