This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: Question about ADDR(SECTION) of ld in document
- From: Nick Clifton <nickc at redhat dot com>
- To: Cao jin <caoj dot fnst at cn dot fujitsu dot com>, binutils at sourceware dot org
- Date: Tue, 6 Nov 2018 16:40:52 +0000
- Subject: Re: Question about ADDR(SECTION) of ld in document
- References: <896cff5d-5056-9b04-a4ea-2de6e964eea2@cn.fujitsu.com>
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