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: Question about ADDR(SECTION) of ld in document


Hi Cao,

> 'ADDR(SECTION)'
>      Return the address (VMA) of the named SECTION.  Your script must
>      previously have defined the location of that section.  In the
>      following example, 'start_of_output_1', 'symbol_1' and 'symbol_2'
>      are assigned equivalent values, except that 'symbol_1' will be
>      relative to the '.output1' section while the other two will be
>      absolute:
>           SECTIONS { ...
>             .output1 :
>               {
>               start_of_output_1 = ABSOLUTE(.);
>               ...
>               }
>             .output :
>               {
>               symbol_1 = ADDR(.output1);
>               symbol_2 = start_of_output_1;
>               }
>           ... }
> 
> My intuition tell me the symbol_1's value is relative to the ".output"
> section, not ".output1", which is also the offset inside ".output", and
> symbol_2's value is the same as symbol_1.

It is non-intuitive, I agree.  But the documentation is correct.  If you
look at the symbol table qfter linking something with the above linker
script you will see that symbol_1 is actually set to be relative to the
.output1 section, not the .output section.  This is despite the fact that
it is defined in the .output section.

For example:

  % readelf --syms --wide --sections a.out
  Section Headers:
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 1] .output2          PROGBITS        0000000000000000 200000 000004 00  WA  0   0  1
  [ 2] .output1          PROGBITS        0000000000000004 200004 000004 00  WA  0   0  1
  [ 3] .output           PROGBITS        0000000000000008 200008 00000c 00  WA  0   0  1

  Symbol table '.symtab' contains 9 entries:
     Num:    Value          Size Type    Bind   Vis      Ndx Name
     4: 0000000000000004     0 NOTYPE  GLOBAL DEFAULT  ABS start_of_output_1
     5: 0000000000000004     0 NOTYPE  GLOBAL DEFAULT    2 symbol_1
     6: 000000000000000c     0 NOTYPE  GLOBAL DEFAULT    3 symbol_2

Note that the "Ndx" field of symbol_1 is 2 (ie the .output1 section)
whereas the Ndx field of symbol_2 is 3 (ie the .output section).

(I am using a slightly tweaked version of the linker script from the documentation
which is why some of the actual values may not be what you expect).

Cheers
  Nick




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