This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [PATCH] ld: fix ABSOLUTE for general expressions
On Tue, Jul 19, 2016 at 09:06:49AM +0200, Tristan Gingold wrote:
>
> > On 19 Jul 2016, at 03:02, Alan Modra <amodra@gmail.com> wrote:
> >
> > On Mon, Jul 18, 2016 at 05:34:06PM +0200, Tristan Gingold wrote:
> >> Hello,
> >>
> >> it appears that ABSOLUTE(x) doesn't generate an absolute value when X is not a symbol, it looks like it works only for symbols.
> >> See the testcase for an example.
> > [snip]
> >> +SECTIONS
> >> +{
> >> + .text 0x100 :
> >> + {
> >> + *(.text)
> >> + _stack_start = ABSOLUTE(0x0800);
> >> + }
> >> +}
> >
> > I think what you're missing is that a plain number inside an output
> > section statement is section relative, if the number is used as an
> > address.
>
> But, this is not what the doc says:
>
> ABSOLUTE(exp)
> Return the absolute (non-relocatable, as opposed to non-negative) value of the expression exp. Primarily useful to assign an absolute value to a symbol within a section definition, where symbol values are normally section relative.
>
> I think the doc is clear, and according to it:
>
> SECTIONS
> {
> .text 0x100 :
> {
> *(.text)
> _stack_start = ABSOLUTE(0x0800);
> }
> }
>
> should set _stack_start to the value 0x800 (and not 0x900).
So how would you expect the following to behave?
SECTIONS
{
.text 0x100 :
{
*(.text)
x = 0x800;
y = absolute (x);
z = absolute (0x800);
}
}
I would have thought that x, y and z should have the same value in an
executable, and they do as shown by nm.
0000000000000900 T x
0000000000000900 A y
0000000000000900 T z
There *is* a bug in the section of z. Somehow it manages to be
section relative! Hmm, no doubt due to premature folding of the
expression, in exp_unop.
> I am not against allowing only symbols for operand of ABSOLUTE. I think this would be much clearer and still backward compatible in practice.
>
> The rule you gave 'a plain number inside an output section statement is section relative' is not well defined.
> For example, how to apply it to:
> x = 0x80 + 4;
> I know how ld would understand it: this is section_vma + 0x84. But this is not exactly your rule!
In this case we have a section relative 0x80 added to a section
relative 4, which by the odd rules regarding operations on two values
in the same section, comes to a section relative 0x84.
--
Alan Modra
Australia Development Lab, IBM