From de4859eacb74a440d9fd61e4a0f051e3737a05dd Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Wed, 2 Oct 2019 11:55:02 +0100 Subject: Change objcopy's --set-section-alignment option to take a byte alignment value rather than a power of two alignment value. 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 | 12 +++++++++ binutils/doc/binutils.texi | 6 ++--- binutils/objcopy.c | 29 ++++++++++++++++------ binutils/testsuite/binutils-all/objcopy.exp | 2 ++ .../testsuite/binutils-all/set-section-alignment.d | 9 +++++++ 5 files changed, 47 insertions(+), 11 deletions(-) create mode 100644 binutils/testsuite/binutils-all/set-section-alignment.d (limited to 'binutils') 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 + + 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 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 =\n\ Set section 's properties to \n\ --set-section-alignment =\n\ - Set section 's alignment to 2^ bytes\n\ + Set section 's alignment to bytes\n\ --add-section = Add section found in to output\n\ --update-section =\n\ Update contents of section 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 -- cgit v1.1