diff options
author | Nick Clifton <nickc@redhat.com> | 2010-10-06 08:58:59 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2010-10-06 08:58:59 +0000 |
commit | ea5cae92bdd0686144ac42346d32c58e6f0e0b16 (patch) | |
tree | c8b3bc69800b8c40581a0b39dd1c198e565ffb17 /ld | |
parent | c0e4ee6b249d0e2fc3f3e4e0864e00faf93fe126 (diff) | |
download | fsf-binutils-gdb-ea5cae92bdd0686144ac42346d32c58e6f0e0b16.zip fsf-binutils-gdb-ea5cae92bdd0686144ac42346d32c58e6f0e0b16.tar.gz fsf-binutils-gdb-ea5cae92bdd0686144ac42346d32c58e6f0e0b16.tar.bz2 |
* script-sections.cc(class Memory_region): Remove
current_lma_offset_ field. Rename current_vma_offset_ to
current_offset_. Add last_section_ field.
(Memory_region::get_current_vma_address): Rename to
get_current_address.
(Memory_region::get_current_lma_address): Delete.
(Memory_region::increment_vma_offset): Rename to
increment_offset.
(Memory_region::increment_lma_offset): Delete.
(Memory_region::attributes_compatible): New method. Returns
true if the provided section is compatible with the region.
(Memory_region::get_last_section): New method. Returns the last
section to use the region.
(Memory_region::set_last_section): New method. Stores the last
section to use the region.
(Script_sections::block_in_region): New method. Returns true if
a block of memory is contained within a region.
(Script_sections::find_memory_region): New method. Locates a
memory region to be used to set a VMA or LMA address.
(Output_section_definition::set_section_addresses): Add code to
check for addresses set by memory regions.
(Output_segment::set_section_addresses): Remove memory region
walking code.
(Script_sections::create_segment): Add a warning if a header
segment is created outside of any region.
* script-sections.h (class Script_sections): Add prototypes for
find_memory_region and block_in_region methods.
* testsuite/memory_test.s: Use .long instead of .word.
* testsuite/memory_test.t: Add some more output sections.
* testsuite/memory_test.sh: Update expected output.
* ld.texinfo: Update description of computation of VMA and LMA
addresses for output sections.
* ld-scripts/rgn-at5.t: Add some more output sections.
* ld-scripts/rgn-at5.d: Update expected output.
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ChangeLog | 5 | ||||
-rw-r--r-- | ld/ld.texinfo | 110 | ||||
-rw-r--r-- | ld/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/rgn-at5.d | 11 | ||||
-rw-r--r-- | ld/testsuite/ld-scripts/rgn-at5.t | 10 |
5 files changed, 98 insertions, 43 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index b1b0ef6..24f3bc8 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,8 @@ +2010-10-06 Nick Clifton <nickc@redhat.com> + + * ld.texinfo: Update description of computation of VMA and LMA + addresses for output sections. + 2010-10-06 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> * Makefile.am (ALL_64_EMULATIONS): Fix typo in last commit. diff --git a/ld/ld.texinfo b/ld/ld.texinfo index 206068a..36e2460 100644 --- a/ld/ld.texinfo +++ b/ld/ld.texinfo @@ -3682,33 +3682,55 @@ Discarding}. @cindex address, section @cindex section address The @var{address} is an expression for the VMA (the virtual memory -address) of the output section. If you do not provide @var{address}, -the linker will set it based on @var{region} if present, or otherwise -based on the current value of the location counter. - -If you provide @var{address}, the address of the output section will be -set to precisely that. If you provide neither @var{address} nor -@var{region}, then the address of the output section will be set to the -current value of the location counter aligned to the alignment -requirements of the output section. The alignment requirement of the -output section is the strictest alignment of any input section contained -within the output section. - -For example, +address) of the output section. This address is optional, but if it +is provided then the output address will be set exactly as specified. + +If the output address is not specified then one will be chosen for the +section, based on the heuristic below. This address will be adjusted +to fit the alignment requirement of the output section. The +alignment requirement is the strictest alignment of any input section +contained within the output section. + +The output section address heuristic is as follows: + +@itemize @bullet +@item +If an output memory @var{region} is set for the section then it +is added to this region and its address will be the next free address +in that region. + +@item +If the MEMORY command has been used to create a list of memory +regions then the first region which has attributes compatible with the +section is selected to contain it. The section's output address will +be the next free address in that region; @ref{MEMORY}. + +@item +If no memory regions were specified, or none match the section then +the output address will be based on the current value of the location +counter. +@end itemize + +@noindent +For example: + @smallexample .text . : @{ *(.text) @} @end smallexample + @noindent and + @smallexample .text : @{ *(.text) @} @end smallexample + @noindent are subtly different. The first will set the address of the @samp{.text} output section to the current value of the location counter. The second will set it to the current value of the location -counter aligned to the strictest alignment of a @samp{.text} input -section. +counter aligned to the strictest alignment of any of the @samp{.text} +input sections. The @var{address} may be an arbitrary expression; @ref{Expressions}. For example, if you want to align the section on a 0x10 byte boundary, @@ -4307,25 +4329,44 @@ SECTIONS @{ @cindex load address @cindex section load address Every section has a virtual address (VMA) and a load address (LMA); see -@ref{Basic Script Concepts}. The address expression which may appear in -an output section description sets the VMA (@pxref{Output Section -Address}). +@ref{Basic Script Concepts}. The virtual address is specified by the +@pxref{Output Section Address} described earlier. The load address is +specified by the @code{AT} or @code{AT>} keywords. Specifying a load +address is optional. -The expression @var{lma} that follows the @code{AT} keyword specifies -the load address of the section. - -Alternatively, with @samp{AT>@var{lma_region}} expression, you may -specify a memory region for the section's load address. @xref{MEMORY}. -Note that if the section has not had a VMA assigned to it then the -linker will use the @var{lma_region} as the VMA region as well. +The @code{AT} keyword takes an expression as an argument. This +specifies the exact load address of the section. The @code{AT>} keyword +takes the name of a memory region as an argument. @xref{MEMORY}. The +load address of the section is set to the next free address in the +region, aligned to the section's alignment requirements. If neither @code{AT} nor @code{AT>} is specified for an allocatable -section, the linker will set the LMA such that the difference between -VMA and LMA for the section is the same as the preceding output -section in the same region. If there is no preceding output section -or the section is not allocatable, the linker will set the LMA equal -to the VMA. -@xref{Output Section Region}. +section, the linker will use the following heuristic to determine the +load address: + +@itemize @bullet +@item +If the section has a specific VMA address, then this is used as +the LMA address as well. + +@item +If the section is not allocatable then its LMA is set to its VMA. + +@item +Otherwise if a memory region can be found that is compatible +with the current section, and this region contains at least one +section, then the LMA is set so the difference between the +VMA and LMA is the same as the difference between the VMA and LMA of +the last section in the located region. + +@item +If no memory regions have been declared then a default region +that covers the entire address space is used in the previous step. + +@item +If no suitable region could be found, or there was no previous +section then the LMA is set equal to the VMA. +@end itemize @cindex ROM initialized data @cindex initialized data in ROM @@ -4364,12 +4405,11 @@ extern char _etext, _data, _edata, _bstart, _bend; char *src = &_etext; char *dst = &_data; -/* ROM has data at end of text; copy it. */ -while (dst < &_edata) @{ +/* ROM has data at end of text; copy it. */ +while (dst < &_edata) *dst++ = *src++; -@} -/* Zero bss */ +/* Zero bss. */ for (dst = &_bstart; dst< &_bend; dst++) *dst = 0; @end group diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 3342d62..245f7d5 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-10-06 Nick Clifton <nickc@redhat.com> + + * ld-scripts/rgn-at5.t: Add some more output sections. + * ld-scripts/rgn-at5.d: Update expected output. + 2010-09-30 H.J. Lu <hongjiu.lu@intel.com> PR ld/11812 diff --git a/ld/testsuite/ld-scripts/rgn-at5.d b/ld/testsuite/ld-scripts/rgn-at5.d index e33b34b..972c6c2 100644 --- a/ld/testsuite/ld-scripts/rgn-at5.d +++ b/ld/testsuite/ld-scripts/rgn-at5.d @@ -11,9 +11,10 @@ Sections: Idx +Name +Size +VMA +LMA +File off +Algn +Flags - 0 .sec0 +0+4 +0+02000 +0+2000 +0+02000 +.* - 1 .sec1 +0+4 +0+01000 +0+012c +0+01000 +.* - 2 .sec2 +0+4 +0+04000 +0+603c +0+04000 +.* - 3 .sec3 +0+4 +0+05000 +0+412c +0+03000 +.* - 4 .sec4 +0+4 +0+02004 +0+2004 +0+02004 +.* + 0 .sec0 +0+4 +0+2000 +0+2000 +0+1000 +.* + 1 .sec1 +0+4 +0+1000 +0+2004 +0+2000 +.* + 2 .sec2 +0+4 +0+4000 +0+603c +0+4000 +.* + 3 .sec3 +0+4 +0+5000 +0+5000 +0+3000 +.* + 4 .sec4 +0+4 +0+2008 +0+2008 +0+2008 +.* + 5 .sec5 +0+4 +0+200c +0+200c +0+200c +.* #pass diff --git a/ld/testsuite/ld-scripts/rgn-at5.t b/ld/testsuite/ld-scripts/rgn-at5.t index 53ad242..3a35994 100644 --- a/ld/testsuite/ld-scripts/rgn-at5.t +++ b/ld/testsuite/ld-scripts/rgn-at5.t @@ -10,13 +10,17 @@ SECTIONS { .sec0 : { *(*.sec0) } - .sec1 ORIGIN (region1) : AT(LENGTH (region2)) { *(*.sec1) } + .sec1 ORIGIN (region1) : { *(*.sec1) } AT> region2 - fred = ORIGIN (region1) + LENGTH (region1) ; + fred = ORIGIN (region1) + LENGTH (region1); .sec2 : { *(*.sec2) } > region3 AT> region4 .sec3 0x5000 : { *(*.sec3) } - /DISCARD/ : { *(.reginfo) } + .sec4 : { *(*.sec4) } AT> region2 + + .sec5 : { LONG(0x5555) } > region2 + + /DISCARD/ : { *(*) } } |