[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [MiNT] binutils problem ??



On Fri, 2009-09-25 at 22:52 +0200, Vincent Rivière wrote:
> Hello, Alan.
> 
> > Can someone compile this test app....
> > 
> > test:
> > 	.word	3
> > test2:
> > 	.align	2
> > test3:
> > 	.word	5
> > 
> > build with....
> > 
> > as -o test.o test.S
> > 
> > and then run 
> > 
> > nm test.o
> > 
> > With the current binutils from Vincent I get....
> > 
> > 00000000 t test
> > 00000002 t test2
> > 00000002 t test3
> > 
> > but with the old binutils I get...
> > 
> > 00000000 t test
> > 00000002 t test2
> > 00000004 t test3
> > 
> > Can anyone confirm ??
> 
> I confirm.
> 
> The semantics of the .align directive are different between assemblers and 
> platforms, it must be considered as unportable. The meaning of .align is 
> even different between gas versions.
> 
> To solve this issue, gas introduced 2 new directives :
> 
> .balign     takes an absolute value in bytes
> .p2align    takes a power of 2
> 
> So ".balign 8" is the same as ".p2align 3", the next data will be aligned on 
> 8 bytes.
> 
> ".even" is portable, it is the same as ".balign 2"
> 
> Depending on assemblers and platforms, ".align" behaves like ".balign" or 
> ".p2align", so it is unportable.
> 
> The standard gas behaviour is like this:
> - on a.out targets, .align is like .p2align
> - on ELF targets, .align is like .balign
> - on some specific platforms it is different
> 
> The old binutils 2.13 for MiNT use the default gas behaviour, so since we 
> use a.out object files, .align behaves like .p2align and takes a power of 2.
> 
> My current binutils patch use the standard (?) Atari behaviour, .align takes 
> an absolute value.
> 
> This .align behaviour is the only functional change I made in the binutils, 
> and I have been considering reverting it for some time (any remark is welcome).
> 
> Today I consider that .align is unsafe and we must use .balign instead. So 
> if no one uses .align, its behaviour is not important, and we should keep 
> the gas default. But beware, if one day we use ELF object files, the 
> semantics of .align will change. Another good reason to not use .align.
> 
> And beware, the maximum alignment supported by our toolchain is 4 bytes, it 
> will be honored in recent OS versions (like TOS 4.x and FreeMiNT) but not in 
> older TOS versions like 1.62.
> 
> No mystery here.

O.k. I'm building Didier's TOS binaries for coldfire & ct60 and he
uses .align all over the place.

So either his code needs fixing, or we need to revert to the old
behaviour. At the time when we get ELF support then I guess it's
reasonable to define a new ABI, but this currently breaks older code and
makes it incompatible with the older assembler.

If you feel strongly about not reverting let me know, and I'll go change
the code.

Thanks Vincent for the explanation.

Alan.