This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [ld] section address : ALIGN(align) and the maximum of input section alignments


On Tue, Mar 3, 2020 at 2:39 PM Alan Modra <amodra@gmail.com> wrote:
>
> On Tue, Feb 25, 2020 at 10:30:03PM -0800, Fangrui Song wrote:
> > > Why doesn't `.bss . : ALIGN(16)` respect the maximum of input section alignments (32)?
> > >
> > > (I have verified that .bss being SHT_NOBITS is unrelated.)
> > >
> > > The rule of sh_addr computation appears to be:
> > >
> > > * ADDR is unset, ALIGN is unset => max_input_alignment
> > > * ADDR is unset, ALIGN is set => max(ALIGN, max_input_alignment)
> > > * ADDR is set, ALIGN is unset => max_input_alignment
> > > * ADDR is set, ALIGN is set => ALIGN
> >
> > When ADDR is set, ALIGN is used while max_input_alignment is ignored.
> >
> > ld/ldlang.c:5582
> >
> >                 if (os->addr_tree == NULL) {
> >                     ...
> >                   newdot = os->region->current;
> >                     // maximum of ALIGN and input section alignments
> >                   section_alignment = os->bfd_section->alignment_power;
> >                 }
> >               else
> >                   // ALIGN
> >                 section_alignment = exp_get_power (os->section_alignment, "section alignment");
> >
> > Alan, is the `else` branch supposed to use `section_alignment = os->bfd_section->alignment_power;` as well?
>
> No.  When you specify the address of an output section that is the
> address it should have.  Except that specifying both an address and
> alignment aligns the address given.  Specifying both is somewhat
> contradictory and it would probably have been better if we didn't
> support ALIGN here.

Thanks. For the example below, do you agree with the comments in a.x below?

% cat a.s
.globl _start; _start: ret
.section .data.rel.ro,"aw"; .balign 8; .byte 0
.data; .byte 0
.section .data2,"aw"; .balign 8; .byte 0
.section .data3,"aw"; .balign 32; .byte 0
.bss; .balign 32; .byte 0
% as a.s -o a.o

% cat a.x
SECTIONS {
  .text 0x10000 : { *(.text) }
  /* sh_addr is 0x10010. Specifying both address and ALIGN should be
disallowed. */
  .data.rel.ro . : ALIGN(16) { *(.data.rel.ro) }

  .data 0x20000 : { *(.data) }
  /* sh_addr is 0x20001. Should there be a warning that sh_addralign
is 8? Even --warn-section-align does not warn. */
  .data2 . : { *(.data2) }
  /* sh_addr is 0x20020. The input section alignment wins. */
  .data3 : ALIGN(16) { *(.data3) }
  /* sh_addr is 0x20030. Specifying both address and ALIGN should be
disallowed. */
  .bss . : ALIGN(16) { *(.bss) }
}

% ld.bfd -T a.x a.s -o a

If specifying both Output Section Address and ALIGN is disallowed,
there should be no "changing start of section" warning when
--warn-section-align is not specified. Is my understanding correct?

BTW, I filed a bug about duplicate "changing start of section"
warnings https://sourceware.org/bugzilla/show_bug.cgi?id=25570


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]