Add command line option to stop the assembler from padding the end of sections to their alignment boundary.
PR gas/20247 * as.h (do_not_pad_sections_to_alignment): New global variable. * as.c (show_usage): Add --no-pad-sections. (parse_args): Likewise. * write.c (size_seg): Skip padding the end of the section if requested from the command line. (SUB_SEGMENT_ALIGN): Likewise. * doc/as.texinfo: Document the new option. * NEWS: Mention the new feature. * testsuite/gas/elf/section11.s: New test. * testsuite/gas/elf/section11.d: New test driver. * testsuite/gas/elf/elf.exp: Run the new test.
This commit is contained in:
parent
c9301e3181
commit
2edb36e77f
8 changed files with 69 additions and 6 deletions
3
gas/NEWS
3
gas/NEWS
|
@ -1,4 +1,7 @@
|
||||||
-*- text -*-
|
-*- text -*-
|
||||||
|
* Add --no-pad-sections to stop the assembler from padding the end of output
|
||||||
|
sections up to their alignment boundary.
|
||||||
|
|
||||||
* Support for the ARMv8-M architecture has been added to the ARM port. Support
|
* Support for the ARMv8-M architecture has been added to the ARM port. Support
|
||||||
for the ARMv8-M Security and DSP Extensions has also been added to the ARM
|
for the ARMv8-M Security and DSP Extensions has also been added to the ARM
|
||||||
port.
|
port.
|
||||||
|
|
10
gas/as.c
10
gas/as.c
|
@ -342,6 +342,8 @@ Options:\n\
|
||||||
fprintf (stream, _("\
|
fprintf (stream, _("\
|
||||||
-nocpp ignored\n"));
|
-nocpp ignored\n"));
|
||||||
fprintf (stream, _("\
|
fprintf (stream, _("\
|
||||||
|
-no-pad-sections do not pad the end of sections to alignment boundaries\n"));
|
||||||
|
fprintf (stream, _("\
|
||||||
-o OBJFILE name the object-file output OBJFILE (default a.out)\n"));
|
-o OBJFILE name the object-file output OBJFILE (default a.out)\n"));
|
||||||
fprintf (stream, _("\
|
fprintf (stream, _("\
|
||||||
-R fold data section into text section\n"));
|
-R fold data section into text section\n"));
|
||||||
|
@ -479,7 +481,8 @@ parse_args (int * pargc, char *** pargv)
|
||||||
OPTION_REDUCE_MEMORY_OVERHEADS,
|
OPTION_REDUCE_MEMORY_OVERHEADS,
|
||||||
OPTION_WARN_FATAL,
|
OPTION_WARN_FATAL,
|
||||||
OPTION_COMPRESS_DEBUG,
|
OPTION_COMPRESS_DEBUG,
|
||||||
OPTION_NOCOMPRESS_DEBUG
|
OPTION_NOCOMPRESS_DEBUG,
|
||||||
|
OPTION_NO_PAD_SECTIONS /* = STD_BASE + 40 */
|
||||||
/* When you add options here, check that they do
|
/* When you add options here, check that they do
|
||||||
not collide with OPTION_MD_BASE. See as.h. */
|
not collide with OPTION_MD_BASE. See as.h. */
|
||||||
};
|
};
|
||||||
|
@ -542,6 +545,7 @@ parse_args (int * pargc, char *** pargv)
|
||||||
,{"MD", required_argument, NULL, OPTION_DEPFILE}
|
,{"MD", required_argument, NULL, OPTION_DEPFILE}
|
||||||
,{"mri", no_argument, NULL, 'M'}
|
,{"mri", no_argument, NULL, 'M'}
|
||||||
,{"nocpp", no_argument, NULL, OPTION_NOCPP}
|
,{"nocpp", no_argument, NULL, OPTION_NOCPP}
|
||||||
|
,{"no-pad-sections", no_argument, NULL, OPTION_NO_PAD_SECTIONS}
|
||||||
,{"no-warn", no_argument, NULL, 'W'}
|
,{"no-warn", no_argument, NULL, 'W'}
|
||||||
,{"reduce-memory-overheads", no_argument, NULL, OPTION_REDUCE_MEMORY_OVERHEADS}
|
,{"reduce-memory-overheads", no_argument, NULL, OPTION_REDUCE_MEMORY_OVERHEADS}
|
||||||
,{"statistics", no_argument, NULL, OPTION_STATISTICS}
|
,{"statistics", no_argument, NULL, OPTION_STATISTICS}
|
||||||
|
@ -637,6 +641,10 @@ parse_args (int * pargc, char *** pargv)
|
||||||
case OPTION_NOCPP:
|
case OPTION_NOCPP:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OPTION_NO_PAD_SECTIONS:
|
||||||
|
do_not_pad_sections_to_alignment = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
case OPTION_STATISTICS:
|
case OPTION_STATISTICS:
|
||||||
flag_print_statistics = 1;
|
flag_print_statistics = 1;
|
||||||
break;
|
break;
|
||||||
|
|
6
gas/as.h
6
gas/as.h
|
@ -76,8 +76,8 @@
|
||||||
150 isn't special; it's just an arbitrary non-ASCII char value. */
|
150 isn't special; it's just an arbitrary non-ASCII char value. */
|
||||||
#define OPTION_STD_BASE 150
|
#define OPTION_STD_BASE 150
|
||||||
/* The first getopt value for machine-dependent long options.
|
/* The first getopt value for machine-dependent long options.
|
||||||
190 gives the standard options room to grow. */
|
290 gives the standard options room to grow. */
|
||||||
#define OPTION_MD_BASE 190
|
#define OPTION_MD_BASE 290
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
#undef NDEBUG
|
#undef NDEBUG
|
||||||
|
@ -377,6 +377,8 @@ COMMON int need_pass_2;
|
||||||
leave lots of padding. */
|
leave lots of padding. */
|
||||||
COMMON int linkrelax;
|
COMMON int linkrelax;
|
||||||
|
|
||||||
|
COMMON int do_not_pad_sections_to_alignment;
|
||||||
|
|
||||||
/* TRUE if we should produce a listing. */
|
/* TRUE if we should produce a listing. */
|
||||||
extern int listing;
|
extern int listing;
|
||||||
|
|
||||||
|
|
|
@ -235,6 +235,7 @@ gcc(1), ld(1), and the Info entries for @file{binutils} and @file{ld}.
|
||||||
[@b{-K}] [@b{-L}] [@b{--listing-lhs-width}=@var{NUM}]
|
[@b{-K}] [@b{-L}] [@b{--listing-lhs-width}=@var{NUM}]
|
||||||
[@b{--listing-lhs-width2}=@var{NUM}] [@b{--listing-rhs-width}=@var{NUM}]
|
[@b{--listing-lhs-width2}=@var{NUM}] [@b{--listing-rhs-width}=@var{NUM}]
|
||||||
[@b{--listing-cont-lines}=@var{NUM}] [@b{--keep-locals}]
|
[@b{--listing-cont-lines}=@var{NUM}] [@b{--keep-locals}]
|
||||||
|
[@b{--no-pad-sections}]
|
||||||
[@b{-o} @var{objfile}] [@b{-R}]
|
[@b{-o} @var{objfile}] [@b{-R}]
|
||||||
[@b{--hash-size}=@var{NUM}] [@b{--reduce-memory-overheads}]
|
[@b{--hash-size}=@var{NUM}] [@b{--reduce-memory-overheads}]
|
||||||
[@b{--statistics}]
|
[@b{--statistics}]
|
||||||
|
@ -773,6 +774,11 @@ Set the maximum width of an input source line, as displayed in a listing, to
|
||||||
Set the maximum number of lines printed in a listing for a single line of input
|
Set the maximum number of lines printed in a listing for a single line of input
|
||||||
to @var{number} + 1.
|
to @var{number} + 1.
|
||||||
|
|
||||||
|
@item --no-pad-sections
|
||||||
|
Stop the assembler for padding the ends of output sections to the alignment
|
||||||
|
of that section. The default is to pad the sections, but this can waste space
|
||||||
|
which might be needed on targets which have tight memory constraints.
|
||||||
|
|
||||||
@item -o @var{objfile}
|
@item -o @var{objfile}
|
||||||
Name the object-file output from @command{@value{AS}} @var{objfile}.
|
Name the object-file output from @command{@value{AS}} @var{objfile}.
|
||||||
|
|
||||||
|
@ -2158,6 +2164,7 @@ assembler.)
|
||||||
* listing:: --listing-XXX to configure listing output
|
* listing:: --listing-XXX to configure listing output
|
||||||
* M:: -M or --mri to assemble in MRI compatibility mode
|
* M:: -M or --mri to assemble in MRI compatibility mode
|
||||||
* MD:: --MD for dependency tracking
|
* MD:: --MD for dependency tracking
|
||||||
|
* no-pad-sections:: --no-pad-sections to stop section padding
|
||||||
* o:: -o to name the object file
|
* o:: -o to name the object file
|
||||||
* R:: -R to join data and text sections
|
* R:: -R to join data and text sections
|
||||||
* statistics:: --statistics to see statistics about assembly
|
* statistics:: --statistics to see statistics about assembly
|
||||||
|
@ -2494,6 +2501,15 @@ The rule is written to the file named in its argument.
|
||||||
|
|
||||||
This feature is used in the automatic updating of makefiles.
|
This feature is used in the automatic updating of makefiles.
|
||||||
|
|
||||||
|
@node no-pad-sections
|
||||||
|
@section Output Section Padding
|
||||||
|
@kindex --no-pad-sections
|
||||||
|
@cindex output section padding
|
||||||
|
Normally the assembler will pad the end of each output section up to its
|
||||||
|
alignment boundary. But this can waste space, which can be significant on
|
||||||
|
memory constrained targets. So the @option{--no-pad-sections} option will
|
||||||
|
disable this behaviour.
|
||||||
|
|
||||||
@node o
|
@node o
|
||||||
@section Name the Object File: @option{-o}
|
@section Name the Object File: @option{-o}
|
||||||
|
|
||||||
|
@ -2680,7 +2696,7 @@ do include file processing with the @code{.include} directive
|
||||||
(@pxref{Include,,@code{.include}}). You can use the @sc{gnu} C compiler driver
|
(@pxref{Include,,@code{.include}}). You can use the @sc{gnu} C compiler driver
|
||||||
to get other ``CPP'' style preprocessing by giving the input file a
|
to get other ``CPP'' style preprocessing by giving the input file a
|
||||||
@samp{.S} suffix. @xref{Overall Options, ,Options Controlling the Kind of
|
@samp{.S} suffix. @xref{Overall Options, ,Options Controlling the Kind of
|
||||||
Output, gcc.info, Using GNU CC} .
|
Output, gcc info, Using GNU CC}.
|
||||||
|
|
||||||
Excess whitespace, comments, and character constants
|
Excess whitespace, comments, and character constants
|
||||||
cannot be used in the portions of the input text that are not
|
cannot be used in the portions of the input text that are not
|
||||||
|
|
|
@ -205,6 +205,7 @@ if { [is_elf_format] } then {
|
||||||
run_dump_test "section8"
|
run_dump_test "section8"
|
||||||
run_dump_test "section9"
|
run_dump_test "section9"
|
||||||
run_dump_test "section10"
|
run_dump_test "section10"
|
||||||
|
run_dump_test "section11"
|
||||||
run_dump_test "dwarf2-1"
|
run_dump_test "dwarf2-1"
|
||||||
run_dump_test "dwarf2-2"
|
run_dump_test "dwarf2-2"
|
||||||
run_dump_test "dwarf2-3"
|
run_dump_test "dwarf2-3"
|
||||||
|
|
13
gas/testsuite/gas/elf/section11.d
Normal file
13
gas/testsuite/gas/elf/section11.d
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#as: --no-pad-sections
|
||||||
|
#readelf: -S --wide
|
||||||
|
#name: Disabling section padding
|
||||||
|
# The RX port uses non standard section names.
|
||||||
|
#skip: rx-*-*
|
||||||
|
|
||||||
|
#...
|
||||||
|
\[ .\] .text[ ]+PROGBITS[ ]+0+00 0+[0-9a-f]+ 0+0(1|4|5) 00 AX 0 0 16
|
||||||
|
#...
|
||||||
|
\[ .\] .data[ ]+PROGBITS[ ]+0+00 0+[0-9a-f]+ 0+01 00 WA 0 0 16
|
||||||
|
#...
|
||||||
|
\[ .\] .bss[ ]+NOBITS[ ]+0+00 0+[0-9a-f]+ 0+01 00 WA 0 0 16
|
||||||
|
#pass
|
14
gas/testsuite/gas/elf/section11.s
Normal file
14
gas/testsuite/gas/elf/section11.s
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
.section .bss
|
||||||
|
.balign 16
|
||||||
|
.skip 1
|
||||||
|
|
||||||
|
|
||||||
|
.data
|
||||||
|
.balign 16
|
||||||
|
.skip 1
|
||||||
|
|
||||||
|
|
||||||
|
.text
|
||||||
|
.balign 16
|
||||||
|
.skip 1
|
||||||
|
|
10
gas/write.c
10
gas/write.c
|
@ -579,7 +579,12 @@ size_seg (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED)
|
||||||
x = bfd_set_section_flags (abfd, sec, flags);
|
x = bfd_set_section_flags (abfd, sec, flags);
|
||||||
gas_assert (x);
|
gas_assert (x);
|
||||||
|
|
||||||
newsize = md_section_align (sec, size);
|
/* If permitted, allow the backend to pad out the section
|
||||||
|
to some alignment boundary. */
|
||||||
|
if (do_not_pad_sections_to_alignment)
|
||||||
|
newsize = size;
|
||||||
|
else
|
||||||
|
newsize = md_section_align (sec, size);
|
||||||
x = bfd_set_section_size (abfd, sec, newsize);
|
x = bfd_set_section_size (abfd, sec, newsize);
|
||||||
gas_assert (x);
|
gas_assert (x);
|
||||||
|
|
||||||
|
@ -1696,7 +1701,7 @@ set_symtab (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Finish the subsegments. After every sub-segment, we fake an
|
/* Finish the subsegments. After every sub-segment, we fake an
|
||||||
".align ...". This conforms to BSD4.2 brane-damage. We then fake
|
".align ...". This conforms to BSD4.2 brain-damage. We then fake
|
||||||
".fill 0" because that is the kind of frag that requires least
|
".fill 0" because that is the kind of frag that requires least
|
||||||
thought. ".align" frags like to have a following frag since that
|
thought. ".align" frags like to have a following frag since that
|
||||||
makes calculating their intended length trivial. */
|
makes calculating their intended length trivial. */
|
||||||
|
@ -1708,6 +1713,7 @@ set_symtab (void)
|
||||||
code-bearing sections. */
|
code-bearing sections. */
|
||||||
#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) \
|
#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) \
|
||||||
(!(FRCHAIN)->frch_next && subseg_text_p (SEG) \
|
(!(FRCHAIN)->frch_next && subseg_text_p (SEG) \
|
||||||
|
&& !do_not_pad_sections_to_alignment \
|
||||||
? get_recorded_alignment (SEG) \
|
? get_recorded_alignment (SEG) \
|
||||||
: 0)
|
: 0)
|
||||||
#else
|
#else
|
||||||
|
|
Loading…
Reference in a new issue