3.3 Moving Data and Code Sections
Unlike the AVR GCC compiler, which typically produces a single .text
,
.data
and .bss
output section, this is not the
case when using MPLAB XC8. Using the --section-start
option to move
code and data with MPLAB XC8 will not work reliably.
Description
One consequence of the best-fit allocator (BFA) employed by MPLAB XC8 is that most
objects and code are not placed in the standard .text
,
.data
and .bss
output sections . The compiler
only maps the vector table, .dinit
table and some special sections
into the .text
output section, leaving other
.text*
input sections unmapped. The linker implementation then
creates an output section for each unmapped input section and proceeds to allocate
them as it sees fit.
If you need to explicitly locate any of these standard sections, the
-Wl,--section-start
option will not work as expected.
Additionally, any tools used to dump or analyze the output after linking and that
expect to see a single .text
section for all the program code might
also fail.
Provided you are using the latest MPLAB XC8 compiler, the
-Wl,--section-start
option can be used to position sections
with a user-defined name (sections not called .text
,
.data
and .bss
) and without any modification
to the linker script. User-defined sections can be created using the
__section()
specifier.
Migration
The -Wl,-Tsection=addr
option can
instead be used to position standard sections, like the .text
,
.data
and .bss
sections at the specified
address.
Although the -Wl,-Ttext
option will move the .text
section to the offset specified, this option also sets the starting address from
which the linker begins program memory allocation for all code (even that handled by
the BFA). Thus, when this option is used, the .text
section will
start at the exact offset specified; other code sections will be located after this.
Similarly, the -Wl,-Tdata
option also sets the starting address
from which the linker begins data (both initialized and uninitialized)
allocation.