链接编辑器提供一组预定义的输出段描述符和入口条件,如预定义段中所述。链接编辑器已经知道这些节,因此创建这些节无需 mapfile 指令。所显示的可用于生成它们的 mapfile 指令仅为提供说明,并作为相对复杂的 mapfile 规范的一个示例。可以使用 mapfile 段指令修改或扩充这些内置定义。
通常,节到段的分配可在单个段指令中完成。但是,预定义节具有更复杂的要求,即要求按照不同于段在内存中的布局顺序处理这些节的入口条件。为此可以使用两个过程,第一个用于按照所需顺序定义所有段,第二个用于按照实现所需结果的顺序建立入口条件。用户 mapfile 很少需要采用此策略。
# Predefined segments and entrance criteria for the Oracle Solaris # link-editor $mapfile_version 2 # The lrodata and ldata segments only apply to x86-64 objects. # Establish amd64 as a convenient token for conditional input $if _ELF64 && _x86 $add amd64 $endif # Pass 1: Define the segments and their attributes, but # defer the entrance criteria details to the 2nd pass. LOAD_SEGMENT text { FLAGS = READ EXECUTE; }; LOAD_SEGMENT data { FLAGS = READ WRITE EXECUTE; }; LOAD_SEGMENT bss { DISABLE; FLAGS=DATA; }; $if amd64 LOAD_SEGMENT lrodata { FLAGS = READ }; LOAD_SEGMENT ldata { FLAGS = READ WRITE; }; $endif NOTE_SEGMENT note; NULL_SEGMENT extra; # Pass 2: Define ASSIGN_SECTION attributes for the segments defined # above, in the order the link-editor should evaluate them. # All SHT_NOTE sections go to the note segment NOTE_SEGMENT note { ASSIGN_SECTION { TYPE = NOTE; }; }; $if amd64 # Medium/large model x86-64 readonly sections to lrodata LOAD_SEGMENT lrodata { ASSIGN_SECTION { FLAGS = ALLOC AMD64_LARGE; }; }; $endif # text receives all readonly allocable sections LOAD_SEGMENT text { ASSIGN_SECTION { FLAGS = ALLOC !WRITE; }; }; # If bss is enabled, it takes the writable NOBITS sections # that would otherwise end up in ldata or data. LOAD_SEGMENT bss { DISABLE; ASSIGN_SECTION { FLAGS = ALLOC WRITE; TYPE = NOBITS; }; }; $if amd64 # Medium/large model x86-64 writable sections to ldata LOAD_SEGMENT ldata { ASSIGN_SECTION { FLAGS = ALLOC WRITE AMD64_LARGE; }; ASSIGN_SECTION { TYPE = NOBITS; FLAGS = AMD64_LARGE }; }; $endif # Any writable allocable sections not taken above go to data LOAD_SEGMENT data { ASSIGN_SECTION { FLAGS = ALLOC WRITE; }; }; # Any section that makes it to this point ends up at the # end of the object file in the extra segment. This accounts # for the bulk of non-allocable sections. NULL_SEGMENT extra { ASSIGN_SECTION; };