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
.
Example B-1 User-Defined Mapfile
1. elephant : .data : peanuts.o *popcorn.o; 2. monkey : $PROGBITS ?AX; 3. monkey : .data; 4. monkey = LOAD V0x80000000 L0x4000; 5. donkey : .data; 6. donkey = ?RX A0x1000; 7. text = V0x80008000;
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.
1. elephant : .data : peanuts.o *popcorn.o; 4. monkey = LOAD V0x80000000 L0x4000; 2. monkey : $PROGBITS ?AX; 3. monkey : .data; 6. donkey = ?RX A0x1000; 5. donkey : .data; 7. text = V0x80008000;
The following mapfile
example uses the section-within-segment ordering.
1. text = LOAD ?RXN V0xf0004000; 2. text | .text; 3. text | .rodata; 4. text : $PROGBITS ?A!W; 5. data = LOAD ?RWX R0x1000;
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.