Question on LD Linker providing low 2 bytes of address as a constant

Simon Richter Simon.Richter@hogyros.de
Mon Oct 22 16:07:00 GMT 2007


Hi,

Miller, Doreen schrieb:

> If I put the address of the table I wanted stored in HdlrTbl in my
> pre-initializer, the compiler reports "error: initializer element is not
> constant".  If I change HdlrTbl from 2 bytes to 4 bytes and leave the
> pre-initilizer the way it was, it compiles fine.  So it looks like I
> need a way to tell the compiler and linker that I only want the lowest 2
> bytes of the address (which is identical to the address since the 2 high
> bytes are 0).

ld should accept storing a two byte value in a two byte field.

I just tested with the assembler source

         .word   foo
         .long   foo
bar:
         .globl  bar

and the linker script

SECTIONS {
         .text 0x12345678 : {
                 *(.text)
         }
         foo = ABSOLUTE(bar) & 0xffff;
}

and I get an image that indeed reads

12345678 7e 56 7e 56 00 00
1234567e

So it is certainly possible on the linker side. The problem with gcc is 
that there is no legal way to express this in C -- cast expressions 
cannot be "constant-expression"s, and pointers cannot be mixed with 
integers in a binary &.

Depending on the size of the tables, it might just make sense to create 
them with .word directives in the assembler. The linker script stuff is 
a lot simpler if the values don't have to be computed (i.e. the linker 
sees that the addresses are below 0x10000), as the linker will check the 
size of the relocation only when it is applied to the final output image.

    Simon



More information about the Binutils mailing list