Describe AT option of SECTIONS command, at long last.

This commit is contained in:
Roland Pesch 1994-02-02 02:27:55 +00:00
parent 03d2167461
commit 67c4333b27
1 changed files with 73 additions and 20 deletions

View File

@ -1303,6 +1303,7 @@ big for the region, the linker will issue an error message.
@node SECTIONS
@section Specifying Output Sections
@kindex SECTIONS
The @code{SECTIONS} command controls exactly where input sections are
placed into output sections, their order in the output file, and to
@ -1311,11 +1312,14 @@ which output sections they are allocated.
You may use at most one @code{SECTIONS} command in a script file,
but you can have as many statements within it as you wish. Statements
within the @code{SECTIONS} command can do one of three things:
@itemize @bullet
@item
define the entry point;
@item
assign a value to a symbol;
@item
describe the placement of a named output section, and which input
sections go into it.
@ -1327,7 +1331,7 @@ Point}, and @pxref{Assignment}. They are permitted here as well for
your convenience in reading the script, so that symbols and the entry
point can be defined at meaningful points in your output-file layout.
When no @code{SECTIONS} command is given, the linker places each input
If you do not use a @code{SECTIONS} command, the linker places each input
section into an identically named output section in the order that the
sections are first encountered in the input files. If all input sections
are present in the first file, for example, the order of sections in the
@ -1377,12 +1381,13 @@ sequence of characters, but any name which does not conform to the standard
@node Section Placement
@subsection Section Placement
@cindex contents of a section
In a section definition, you can specify the contents of an output section by
listing particular input files, by listing particular input-file
sections, or by a combination of the two. You can also place arbitrary
data in the section, and define symbols relative to the beginning of the
section.
In a section definition, you can specify the contents of an output
section by listing particular input files, by listing particular
input-file sections, or by a combination of the two. You can also place
arbitrary data in the section, and define symbols relative to the
beginning of the section.
The @var{contents} of a section definition may include any of the
following kinds of statement. You can include as many of these as you
@ -1512,15 +1517,16 @@ SECTIONS @{
@node Section Data Expressions
@subsection Section Data Expressions
@cindex expressions in a section
The foregoing statements
arrange, in your output file, data originating from your input files.
You can also place data directly in an output section from the link
command script. Most of these additional statements involve
expressions; @pxref{Expressions}. Although these statements are shown
separately here for ease of presentation, no such segregation is needed
within a section definition in the @code{SECTIONS} command; you can
intermix them freely with any of the statements we've just described.
The foregoing statements arrange, in your output file, data originating
from your input files. You can also place data directly in an output
section from the link command script. Most of these additional
statements involve expressions; @pxref{Expressions}. Although these
statements are shown separately here for ease of presentation, no such
segregation is needed within a section definition in the @code{SECTIONS}
command; you can intermix them freely with any of the statements we've
just described.
@table @code
@item CREATE_OBJECT_SYMBOLS
@ -1649,16 +1655,17 @@ optional portions:
@smallexample
SECTIONS @{
@dots{}
@var{secname} @var{start} BLOCK(@var{align}) (NOLOAD) : @{ @var{contents} @} =@var{fill} >@var{region}
@var{secname} @var{start} BLOCK(@var{align}) (NOLOAD) : AT ( @var{ldadr} )
@{ @var{contents} @} =@var{fill} >@var{region}
@dots{}
@}
@end smallexample
@var{secname} and @var{contents} are required. @xref{Section
Definition}, and @pxref{Section Placement} for details on @var{contents}.
The remaining elements---@var{start}, @code{BLOCK(@var{align)}},
@code{(NOLOAD)} @code{=@var{fill}}, and @code{>@var{region}}---are all
optional.
Definition}, and @pxref{Section Placement} for details on
@var{contents}. The remaining elements---@var{start},
@code{BLOCK(@var{align)}}, @code{(NOLOAD)}, @code{AT ( @var{ldadr} )},
@code{=@var{fill}}, and @code{>@var{region}}---are all optional.
@table @code
@item @var{start}
@ -1689,13 +1696,15 @@ the location counter @code{.} prior to the beginning of the section, so
that the section will begin at the specified alignment. @var{align} is
an expression.
@item (NOLOAD)
@kindex NOLOAD
@cindex prevent unnecessary loading
@cindex loading, preventing
@item (NOLOAD)
Use @samp{(NOLOAD)} to prevent a section from being loaded into memory
each time it is accessed. For example, in the script sample below, the
@code{ROM} segment is addressed at memory location @samp{0} and does not
need to be loaded into each object file:
@example
SECTIONS @{
ROM 0 (NOLOAD) : @{ @dots{} @}
@ -1703,6 +1712,50 @@ SECTIONS @{
@}
@end example
@kindex AT ( @var{ldadr} )
@cindex specify load address
@cindex load address, specifying
@item AT ( @var{ldadr} )
The expression @var{ldadr} that follows the @code{AT} keyword specifies
the load address of the section. The default (if you do not use the
@code{AT} keyword) is to make the load address the same as the
relocation address. This feature is designed to make it easy to build a
ROM image. For example, this @code{SECTIONS} definition creates two
output sections: one called @samp{.text}, which starts at @code{0x1000},
and one called @samp{.mdata}, which is loaded at the end of the
@samp{.text} section even though its relocation address is
@code{0x2000}. The symbol @code{_data} is defined with the value
@code{0x2000}:
@smallexample
SECTIONS
@{
.text 0x1000 : @{ *(.text) _etext = . ; @}
.mdata 0x2000 : AT ( ADDR(.text) + SIZEOF ( .text ) )
@{ _data = . ; *(.data); _edata = . ; @}
.bss 0x3000 : @{ _bstart = . ; *(.bss) *(COMMON) ; _bend = . ;@}
@}
@end smallexample
The run-time initialization code (for C programs, usually @code{crt0})
for use with a ROM generated this way has to include something like
the following, to copy the initialized data from the ROM image to its runtime
address:
@example
/* ROM has data glommed at end of text; copy it. */
char *src = _etext;
char *dst = _data;
while (dst < _edata) @{
*dst++ = *src++;
@}
/* Zero bss */
for (dst = _bstart; dst< _bend; dst++)
*dst = 0;
@end example
@item =@var{fill}
@kindex =@var{fill}
@cindex section fill pattern