ALIGN directive showing different behavior than documented

Sandra Loosemore sandra@codesourcery.com
Mon Aug 3 19:55:00 GMT 2015
On 08/02/2015 11:19 PM, Alan Modra wrote:

> Against that, you've found some questionable linker scripts that now
> misbehave.  I'm saying they are questionable because ". = ALIGN (8);"
> inside a section that is only "ALIGN (4)" is at the heart of the
> problem, and I reckon the linker scripts you have are newer than the
> description of ALIGN that you quote above.  ie. The scripts are
> relying on undocumented behaviour.

Using an ALIGN expression with an alignment greater than that of its 
enclosing section is absolutely not undocumented behavior.  Both the 
current ld manual and the one from 1993 include such an example.

> I'm not trying to discount the fact that the previous behaviour "was
> in place for 20+ years" as you put it, and the change breaks at least
> some existing scripts.  It might be possible to reduce the impact of
> this change, for example, by making ". = ALIGN (k);" affect the
> alignment of an output section in the same way alignment of an input
> section affects alignment of an output section.

I understand that the behavior of unary ALIGN is something of an 
anomaly, but changing it now seems likely to cause obscure breakage and 
backward compatibility problems.  If the problem your patch was trying 
to solve was a discrepancy between the documentation and the 
implementation, it seems more user-friendly just to fix the 
documentation rather than pile even more warts on the implementation of 
ALIGN.  E.g. something like replacing the current parenthetical remark 
about the equivalence of the two forms with a new paragraph:

"For historical compatibility reasons, the unary ALIGN operator aligns 
the absolute address of the location counter (.) rather than its 
section-relative offset.  On the other hand, when given a 
section-relative address as its first argument, the binary form aligns 
its offset.  ALIGN(align) is therefore only equivalent to ALIGN(., 
align) outside of a section definition."

???

OTOH, if the consensus is that the linker script is bad and specifying 
an alignment within the section that is greater than the section 
alignment is an error, I think it would be much better for the linker to 
issue a diagnostic for this rather than to silently fail to perform the 
indicated alignment (that it used to do properly) and/or do other things 
like get confused and start allocating section addresses that go 
backwards.  And, remove the example in the manual, of course.

-Sandra



More information about the Binutils mailing list