Mapping Example

The following example is a user-defined
mapfile. The numbers on the left are included
in the example for tutorial purposes. Only the information to the right of
the numbers actually appears in the mapfile.

Four separate segments are manipulated in this example. The implicitly
declared segment elephant (line 1) receives all of the
.data sections from the files
peanuts.o and popcorn.o.
Notice that *popcorn.o matches any
popcorn.o file that can be supplied to the
link-edit. The file need not be in the current directory. On the other hand,
if /var/tmp/peanuts.o was supplied to the link-edit, it
does not match peanuts.o because it is not preceded by
an *.

The implicitly declared segment monkey (line 2) receives
all sections that are both $PROGBITS and
allocatable-executable (?AX), as well as all sections not
already in the segment elephant with the name
.data (line 3). The .data
sections entering the monkey segment need not be
$PROGBITS or allocatable-executable because the
section_type and section_flags
values are entered on a separate line from the
section_name value.

An "and" relationship exists between attributes on the same line
as illustrated by $PROGBITS "and"
?AX on line 2. An "or" relationship
exists between attributes for the same segment that span more than one line,
as illustrated by $PROGBITS ?AX on line 2
"or" .data on line 3.

The monkey segment is implicitly declared in line 2 with
segment_type value LOAD,
segment_flags value RWX, and
no virtual_address, physical_address,
length or alignment values
specified (defaults are used). In line 4 the segment_type
value of monkey is set to LOAD.
Because the segment_type attribute value does not change,
no warning is issued. The virtual_address value is set to
0x80000000 and the maximum
length value to 0x4000.

Line 5 implicitly declares the donkey segment. The entrance
criteria are designed to route all .data sections to this
segment. Actually, no sections fall into this segment because the entrance
criteria for monkey in line 3 capture all of these
sections. In line 6, the segment_flags value is set to
?RX and the alignment value is
set to 0x1000. Because both of these attribute values
changed, a warning is issued.

Line 7 sets the virtual_address value of the text segment
to 0x80008000.

The example of a user-defined mapfile is designed to
cause warnings for illustration purposes. If you want to change the order of
the directives to avoid warnings, use the following example.

The text and data segments are
manipulated in this example. Line 1 declares the text
segment to have a virtual_address of
0xf0004000 and to not
include the ELF header or any program headers as part of
this segment's address calculations. Lines 2 and 3 turn on
section-within-segment ordering and specify that the
.text and .rodata sections are
the first two sections in this segment. The result is that the
.text section have a virtual address of
0xf0004000, and the .rodata
section immediately follows that address.

Any other $PROGBITS section that makes up the
text segment follows the
.rodata section. Line 5 declares the
data segment and specifies that its virtual
address must begin on a 0x1000 byte boundary. The first
section that constitutes the data segment also resides on
a 0x1000 byte boundary within the file image.