Professional Documents
Culture Documents
ARM ELF
Development Systems Business Unit Engineering Software Group
Document number: Date of Issue: Author: Authorized by:
Copyright ARM Limited 1998, 2000. All rights reserved. Section 3 Copyright Tool Interface Standards Committee 1995.
Abstract
This specification defines the ARM-specific features of Executable and Linking Format (ELF).
Keywords
ARM ELF, ELF, ELF relocation types, Executable and Linking Format (ELF)
Distribution list
Name Function Name Function
Page 1 of 42
ARM ELF
Contents
1 ABOUT THIS DOCUMENT 4 4 4 4 4 4 5 6 6 6 7 7 8 10 12 16 18 19 21 21 22 22 24 25 25 26 26 27 27 28 28
1.1 Change control 1.1.1 Current status and anticipated changes 1.1.2 Change history 1.2 1.3 2 3 References Terms and abbreviations SCOPE GENERIC 32-BIT ELF
3.1 Introduction 3.1.1 File Format 3.1.2 Data Representation 3.1.3 Character Representations 3.2 ELF Header 3.2.1 ELF Identification 3.3 Sections 3.3.1 Special Sections 3.4 String Table
3.7 Program view 3.7.1 Program Header 3.7.2 Note Section 3.7.3 Program Loading 3.7.4 Dynamic Linking 3.8 3.9 4 Special Sections Names Pre-existing Extensions ARM- AND THUMB-SPECIFIC DEFINITIONS
Page 2 of 42
ARM ELF
4.3 Section headers 4.3.1 Common sections 4.3.2 Section alignment 4.3.3 Link and info fields 4.4 Symbols 4.4.1 Symbol value 4.4.2 Symbol size 4.4.3 Weak symbols 4.4.4 Symbol names 4.4.5 Sub-class and super-class symbols 4.4.6 Function address constants and pointers to code 4.4.7 Mapping and tagging symbols 4.4.7.1 Mapping symbols 4.4.7.2 Tagging symbols 4.4.8 Symbol table order 4.4.9 Dynamic symbol table entries 4.5 Relocation types 4.5.1 Dynamic relocation types 4.5.2 Multiple relocation 4.5.3 Field extraction and insertion 4.5.4 Relocations that depend on the type of the target location 4.6 Program headers
29 29 29 30 30 30 30 30 31 31 31 31 32 32 32 33 33 36 37 37 38 39 40 40 40 41 41 42
4.7 Dynamic linking and relocation 4.7.1 The dynamic segment 4.7.2 The dynamic segment program header 4.7.3 The dynamic section DT_SYMBOLIC 4.7.4 The hash table section
Page 3 of 42
ARM ELF
1.2 References
This document refers to the following document and reproduces book 1 of it as section 3, below. Ref
TIS-ELF
Doc No
http://www.x86.org/ftp/manuals/tools/elf.pdf
Author(s)
Tool Interface Standards (TIS) Committee
Title
Executable and Linking Format (ELF) Specification (version 1.2)
Page 4 of 42
ARM ELF
2 SCOPE
This specification defines ARM Executable and Linking Format (ARM ELF). It follows the essential structure of the Tool Interface Standards (TIS) Committees version 1.2 specification of ELF (TIS-ELF). TIS-ELF is divided into three major sections that TIS-ELF calls books:
o
Book 1 defines generic, 32-bit ELF. All users of 32-bit ELF use the definitions given in book 1. Section 3 of this specification reproduces the content of book 1 of TIS-ELF (Copyright Tool Interface Standards Committee 1995), with a few editorial corrections and clarifications, but no intentional change of content. Book 2 defines processor specifics, the definitions used by all users of ELF for a given processor (in the case of TIS-ELF, for the Intel x86 architecture). Book 3 defines operating system specifics (in the case of TIS-ELF, for Unix System V.4 for x86).
o o
Section 4 of this specification covers the material of books 2 and 3 of TIS-ELF. It includes:
o o
ARM- and Thumb-specific definitions needed by all users of ARM ELF. ARM- and Thumb-specific definitions relating to the ARM Embedded Applications Binary Interface (EABI).
The ARM EABI underlies many ARM- and Thumb-based operating environments that follow the single addressspace model. Some operating systemsespecially those founded on multiple virtual address spacesdefine their own conventions for using ARM ELFespecially in relation to shared objects and dynamic linking. These OS-specific definitions extend section 4 of this specification.
Page 5 of 42
ARM ELF
A re-locatable file holds code and data suitable for linking with other object files to create an executable or a shared object file. An executable file holds a program suitable for execution. A shared object file holds code and data suitable for linking in two contexts. First, the link editor may process it with other re-locatable and shared object files to create another object file. Second, the dynamic linker combines it with an executable file and other shared objects to create a process image.
Created by an assembler or compiler and link editor, object files are binary representations of programs intended to execute directly on a processor. Programs that require other abstract machines are excluded. After the introductory material, this section focuses on the file format and how it pertains to building programs. Subsections 3.7 onwards describe those parts of the object file containing the information necessary to execute a program.
An ELF header resides at the beginning and holds a road map describing the files organization. Sections hold the bulk of object file information for the linking view: instructions, data, symbol table, relocation information, and so on. Descriptions of special sections appear later in this section. Subsections 3.7 onwards describe segments and the program execution view of the file.
Page 6 of 42
ARM ELF
A program header table, if present, tells the system how to create a process image. Files used to build a process image (execute a program) must have a program header table; re-locatable files do not need one. A section header table contains information describing the files sections. Every section has an entry in the table; each entry gives information such as the section name, the section size, and so on. Files used during linking must have a section header table; other object files may or may not have one. Note Although the figure shows the program header table immediately after the ELF header, and the section header table following the sections, actual files may differ. Moreover, sections and segments have no specified order. Only the ELF header has a fixed position in the file.
All data structures that the object file format defines follow the natural size and alignment guidelines for the relevant class. If necessary, data structures contain explicit padding to ensure 4-byte alignment for 4-byte objects, to force structure sizes to a multiple of 4, and so on. Data also have suitable alignment from the beginning of the file. Thus, for example, a structure containing an Elf32_Addr member will be aligned on a 4-byte boundary within the file. For portability reasons, ELF uses no bit fields.
Character values between 0 and 127 should correspond to the 7-bit ASCII code. That is, character sets with encodings above 127 should include the 7-bit ASCII code as a subset.
Page 7 of 42
ARM ELF
Multi-byte character encodings with values above 127 should contain only bytes with values outside the range of 0 to 127. That is, a character set that uses more than one byte per character should not embed a byte resembling a 7-bit ASCII character within a multi-byte, non-ASCII character. Multi-byte characters should be self-identifying. That allows, for example, any multi-byte character to be inserted between any pair of multi-byte characters, without changing the characters interpretations.
These cautions are particularly relevant for multilingual applications. Note There are naming conventions for ELF constants that have processor ranges specified. Names such as DT_, PT_, for processor specific extensions, incorporate the name of the processor: DT_M32_SPECIAL, for example. However, pre-existing processor extensions not using this convention will be supported.
Pre-existing Extensions
DT_JMP_REL
e_identThe initial bytes mark the file as an object file and provide machine-independent data with which to decode and interpret the files contents. Complete descriptions appear below, in section 3.2.1, ELF Identification. E_typeThis member identifies the object file type. Name ET_NONE ET_REL ET_EXEC ET_DYN Value 0 1 2 3 Meaning No file type Re-locatable file Executable file Shared object file
Page 8 of 42
ARM ELF
Although the core file contents are unspecified, type ET_CORE is reserved to mark the file type. Values from ET_LOPROC through ET_HIPROC (inclusive) are reserved for processor-specific semantics. Other values are reserved and will be assigned to new object file types as necessary. E_machineThis members value specifies the required architecture for an individual file. Name EM_NONE EM_M32 EM_SPARC EM_386 EM_68K EM_88K EM_860 EM_MIPS EM_MIPS_RS4_BE Value 0 1 2 3 4 5 7 8 10 Meaning No machine AT&T WE 32100 SPARC Intel Architecture Motorola 68000 Motorola 88000 Intel 80860 MIPS RS3000 Big-Endian MIPS RS4000 Big-Endian
EM_ARM
40
ARM/Thumb Architecture
Other values are reserved and will be assigned to new machines as necessary. Processor-specific ELF names use the machine name to distinguish them. For example, the flags mentioned below use the prefix EF_; a flag named WIDGET for the EM_XYZ machine would be called EF_XYZ_WIDGET. E_versionThis member identifies the object file version. Name EV_NONE EV_CURRENT Value 0 1 Meaning Invalid version Current version
The value 1 signifies the original file format; extensions will create new versions with higher numbers. The value of EV_CURRENT, though given as 1 above, will change as necessary to reflect the current version number. E_entryThis member gives the virtual address to which the system first transfers control, thus starting the process. If the file has no associated entry point, this member holds zero. E_phoffThis member holds the program header tables file offset in bytes. If the file has no program header table, this member holds zero.
Page 9 of 42
ARM ELF
E_shoffThis member holds the section header tables file offset in bytes. If the file has no section header table, this member holds zero. E_flagsThis member holds processor-specific flags associated with the file. Flag names take the form EF_machine_flag. See section 4.1, ELF header, for definitions of flag values. E_ehsizeThis member holds the ELF headers size in bytes. E_phentsizeThis member holds the size in bytes of one entry in the files program header table; all entries are the same size. E_phnumThis member holds the number of entries in the program header table. Thus the product of
e_phentsize and e_phnum gives the tables size in bytes. If a file has no program header table, e_phnum
holds the value zero. E_shentsizeThis member holds a section headers size in bytes. A section header is one entry in the section header table; all entries are the same size. E_shnumThis member holds the number of entries in the section header table. Thus the product of e_shentsize and e_shnum gives the section header tables size in bytes. If a file has no section header table, e_shnum holds the value zero. E_shstrndxThis member holds the section header table index of the entry associated with the section name string table. If the file has no section name string table, this member holds the value SHN_UNDEF. See section 3.3, Sections and section 3.4, String Table below for more information.
These indexes access bytes that hold the values defined in the following tables.
Page 10 of 42
ARM ELF
EI_MAG0 to EI_MAG3A files first 4 bytes hold a magic number, identifying the file as an ELF object file. Name ELFMAG0 ELFMAG1 ELFMAG2 ELFMAG3 Value 0x7f ASCII E ASCII L ASCII F Meaning e_ident[EI_MAG0] e_ident[EI_MAG1] e_ident[EI_MAG2] e_ident[EI_MAG3]
EI_CLASSThe next byte, e_ident[EI_CLASS], identifies the files class, or capacity. Name ELFCLASSNONE ELFCLASS32 ELFCLASS64 Value 0 1 2 Meaning Invalid class 32-bit objects 64-bit objects
The file format is designed to be portable among machines of various sizes, without imposing the sizes of the largest machine on the smallest. Class ELFCLASS32 supports machines with files and virtual address spaces up to 4 gigabytes; it uses the basic types defined above. Class ELFCLASS64 is incomplete and refers to the 64-bit architectures. Its appearance here shows how the object file may change. Other classes will be defined as necessary, with different basic types and sizes for object file data. EI_DATAByte e_ident[EI_DATA]specifies the data encoding of all data in the object file. The following encodings are currently defined. Name ELFDATANONE ELFDATA2LSB ELFDATA2MSB Value 0 1 2 Meaning Invalid data encoding See Data encodings ELFDATA2LSB, below See Data encodings ELFDATA2MSB, below
1
More information on these encodings appears below in Figure 3-5 and Figure 3-6. Other values are reserved and will be assigned to new encodings as necessary. EI_VERSIONByte e_ident[EI_VERSION] specifies the ELF header version number. Currently, this value must be EV_CURRENT, as explained above for e_version. EI_PADThis value marks the beginning of the unused bytes in e_ident. These bytes are reserved and set to zero; programs that read object files should ignore them. The value of EI_PAD will change in the future if currently unused bytes are given meanings. A files data encoding specifies how to interpret the basic objects in a file. As described above, class ELFCLASS32 files use objects that occupy 1, 2, and 4 bytes. Under the defined encodings, objects are represented as shown below. Byte numbers appear in the upper left corners.
ELF files for embedded targets contain 3 kinds of datadata intended for the target (e.g. code), data intended for the host (e.g. debug tables), and format-related data (e.g. ELF structures). ARM ELF uniformly uses the byte order of the execution environment for each kind. Page 11 of 42
ARM ELF
Figure 3-5, Data encodings ELFDATA2LSB Encoding ELFDATA2LSB specifies 2s complement values, with the least significant byte at the lowest address.
0
0x01
0x01
0x0102
0x02
0x01
0x01020304
0x04
0x03
0x02
0x01
Figure 3-6, Data encodings ELFDATA2MSB Encoding ELFDATA2MSB specifies 2s complement values, with the most significant byte at the lowest address.
0
0x01
0x01
0x0102
0x01
0x02
0x01020304
0x01
0x02
0x03
0x04
3.3 Sections
An object files section header table lets one locate all the files sections. The section header table is an array of Elf32_Shdr structures as described below in Figure 3-8. A section header table index is a subscript into this array. The ELF headers e_shoff member gives the byte offset from the beginning of the file to the section header table; e_shnum tells how many entries the section header table contains; e_shentsize gives the size in bytes of each entry. Some section header table indexes are reserved; an object file will not have sections for these special indexes. Figure 3-7, Special Section Indexes Name SHN_UNDEF SHN_LORESERVE Value 0 0xff00
Page 12 of 42
ARM ELF
Special Section Indexes (continued) SHN_LOPROC SHN_HIPROC SHN_ABS SHN_COMMON SHN_HIRESERVE 0xff00 0xff1f 0xfff1 0xfff2 0xffff
SHN_UNDEFThis value marks an undefined, missing, irrelevant, or otherwise meaningless section reference. For example, a symbol defined relative to section number SHN_UNDEF is an undefined symbol.
Note
Although index 0 is reserved as the undefined value, the section header table contains an entry for it. Consequently, if the e_shnum member of the ELF header says a file has 6 entries in the section header table, they have indexes 0 through 5. The contents of the initial entry are specified in Figure 3-10,below.
SHN_LORESERVEThis value specifies the lower bound of the range of reserved indexes. SHN_LOPROC through SHN_HIPROCValues in this range are reserved for processor-specific semantics. SHN_ABSThis value specifies absolute values for the corresponding reference. For example, symbols defined relative to section number SHN_ABS have absolute values and are not affected by relocation. SHN_COMMONSymbols defined relative to this section are common symbols, such as FORTRAN COMMON or unallocated C external variables. SHN_HIRESERVEThis value specifies the upper bound of the range of reserved indexes. The system reserves indexes between SHN_LORESERVE and SHN_HIRESERVE, inclusive; the values do not refer to the section header table. That is, the section header table does not contain entries for the reserved indexes. Sections contain all information in an object file, except the ELF header, the program header table, and the section header table. Moreover, object files sections satisfy several conditions.
o o o o
Every section in an object file has exactly one section header describing it. Section headers may exist that do not have a section. Each section occupies one contiguous (possibly empty) sequence of bytes within a file. Sections in a file may not overlap. No byte in a file resides in more than one section. An object file may have inactive space. The various headers and the sections might not cover every byte in an object file. The contents of the inactive data are unspecified.
Page 13 of 42
ARM ELF
sh_nameThis member specifies the name of the section. Its value is an index into the section header string table section [see section 3.4, String Table below], giving the location of a null-terminated string. Sh_typeThis member categorizes the sections contents and semantics. Section types and their descriptions appear in Figure 3-9 below. Sh_flagsSections support 1-bit flags that describe miscellaneous attributes. Flag definitions appear in Figure 3-11, below. Sh_addrIf the section will appear in the memory image of a process, this member gives the address at which the sections first byte should reside. Otherwise, the member contains 0. Sh_offsetThis members value gives the byte offset from the beginning of the file to the first byte in the section. One section type, SHT_NOBITS described in Figure 3-9 below, occupies no space in the file, and its sh_offset member locates the conceptual placement in the file. Sh_sizeThis member gives the sections size in bytes. Unless the section type is SHT_NOBITS, the section occupies sh_size bytes in the file. A section of type SHT_NOBITS may have a non-zero size, but it occupies no space in the file. Sh_linkThis member holds a section header table index link, whose interpretation depends on the section type. Figure 3-12 below describes the values. Sh_infoThis member holds extra information, whose interpretation depends on the section type. Figure 3-12 below describes the values. Sh_addralignSome sections have address alignment constraints. For example, if a section holds a doubleword, the system must ensure double-word alignment for the entire section. That is, the value of sh_addr must be congruent to 0, modulo the value of sh_addralign. Currently, only 0 and positive integral powers of two are allowed. Values 0 and 1 mean the section has no alignment constraints. Sh_entsizeSome sections hold a table of fixed-size entries, such as a symbol table. For such a section, this member gives the size in bytes of each entry. The member contains 0 if the section does not hold a table of fixedsize entries. A section headers sh_type member specifies the sections semantics. Figure 3-9, Section Types, sh_type
Name SHT_NULL Value 0 Meaning
This value marks a section header that does not have an associated section. Other members of the section header have undefined values The section holds information defined by the program, whose format and meaning are determined solely by the program. The section holds a symbol table. The section holds a string table. The section holds relocation entries with explicit addends, such as type Elf32_Rela for the 32-bit class of object files. An object file may have multiple relocation sections. See Relocation below for details. The section holds a symbol hash table. The section holds information for dynamic linking. This section holds information that marks the file in some way.
SHT_PROGBITS
2 3 4
5 6 7
Page 14 of 42
ARM ELF
A section of this type occupies no space in the file but otherwise resembles SHT_PROGBITS. Although this section contains no bytes, the sh_offset member contains the conceptual file offset. The section holds relocation entries without explicit addends, such as type Elf32_Rel for the 32-bit class of object files. An object file may have multiple relocation sections. See Relocation below for details. This section type is reserved but has unspecified semantics. The section holds a symbol table. Values in this inclusive range are reserved for processor-specific semantics. Values in this inclusive range are reserved for application programs. Types between SHT_LOUSER and SHT_HIUSER may be used by an application, without conflicting with current or future system-defined section types.
SHT_REL
As mentioned before, the section header for index 0 (SHN_UNDEF) exists, even though the index marks undefined section references. This entry holds the following. Figure 3-10, Section Header Table Entry: Index 0 Name sh_name sh_type sh_flags sh_addr sh_offset sh_size sh_link sh_info sh_addralign sh_entsize Value 0 SHT_NULL 0 0 0 0 SHN_UNDEF 0 0 0 Note No name Inactive No flags No address No file offset No size No link information No auxiliary information No alignment No entries
A section header's sh_flags member holds 1-bit flags that describe the section's attributes. Defined values are shown in Figure 3-11 below; other values are reserved.
Page 15 of 42
ARM ELF
Figure 3-11, Section Attribute Flags, sh_flags Name SHF_WRITE SHF_ALLOC Value 0x1 0x2 Meaning The section contains data that should be writable during process execution The section occupies memory during process execution. Some control sections do not reside in the memory image of an object file; this attribute is off for those sections The section contains executable machine instructions. Bits in this mask are reserved for processor-specific semantics.
SHF_EXECINSTR SHF_MASKPROC
0x4 0xf0000000
If a flag bit is set in sh_flags, the attribute is on for the section. Otherwise, the attribute is off or does not apply. Reserved attributes are set to zero. Two section header members, sh_link and sh_info, hold special information, depending on section type. Figure 3-12, sh_link and sh_info Interpretation sh_type
SHT_DYNAMIC
sh_link The section header index of the string table used by entries in the section. The section header index of the symbol table to which the hash-table applies. The section header index of the associated symbol table. This information is operating system specific. SHN_UNDEF
sh_info 0 0 The section header index of the section to which the relocation applies. This information is operating system specific. 0
SHT_HASH
Other
Static. A set of object files, system libraries and library archives are statically bound, references are resolved, and an executable file is created that is completely self contained. Dynamic. A set of object files, libraries, system shared resources and other shared libraries are linked together to create the executable. When this executable is loaded, other shared resources and dynamic libraries must be made available in the system for the program to run successfully.
Page 16 of 42
ARM ELF
The general method used to resolve references at execution time for a dynamically linked executable file is described in the linkage model used by the operating system, and the actual implementation of this linkage model will contain processor-specific components (see section 4, ARM- and Thumb-Specific Definitions).
There are also sections that support debugging, such as .debug and .line, and program control, including .bss, .data, .data1, .rodata, and .rodata1. Figure 3-13, Special Sections Name .bss .comment .data .data1 .debug .dynamic .hash .line .note .rodata .rodata1 .shstrtab .strtab .symtab .text Type SHT_NOBITS SHT_PROGBITS SHT_PROGBITS SHT_PROGBITS SHT_PROGBITS SHT_DYNAMIC SHT_HASH SHT_PROGBITS SHT_NOTE SHT_PROGBITS SHT_PROGBITS SHT_STRTAB SHT_STRTAB SHT_SYMTAB SHT_PROGBITS Attributes SHF_ALLOC+SHF_WRITE none SHF_ALLOC + SHF_WRITE SHF_ALLOC + SHF_WRITE none see below SHF_ALLOC none None SHF_ALLOC SHF_ALLOC None see below see below SHF_ALLOC + SHF_EXECINSTR
.bssThis section holds uninitialized data that contribute to the program's memory image. By definition, the system initializes the data with zeros when the program begins to run. The section occupies no file space, as indicated by the section type, SHT_NOBITS. .commentThis section holds version control information. .data and .data1These sections hold initialized data that contribute to the program's memory image. .debugThis section holds information for symbolic debugging. The contents are unspecified. All section names with the prefix .debug are reserved for future use. .dynamicThis section holds dynamic linking information and has attributes such as SHF_ALLOC and SHF_WRITE. The operating system and processor determine whether the SHF_WRITE bit is set. .hashThis section holds a symbol hash table. .lineThis section holds line number information for symbolic debugging, which describes the correspondence between the source program and the machine code. The contents are unspecified. .noteThis section holds information in the format that is described in section 3.7.2, Note Section, below.
Page 17 of 42
ARM ELF
.rodata and .rodata1These sections hold read-only data that typically contribute to a non-writable segment in the process image. See Program Header in subsection 3.7.1 for more information. .shstrtabThis section holds section names. .strtabThis section holds strings, most commonly only the strings that represent the names associated with symbol table entries. If a file has a loadable segment that includes the symbol string table, the section's attributes will include the SHF_ALLOC bit; otherwise, that bit will be off. .symtabThis section holds a symbol table, described in section 3.5. If a file has a loadable segment that includes the symbol table, the section's attributes will include the SHF_ALLOC bit; otherwise, that bit will be off. .textThis section holds the text, or executable instructions, of a program. Section names with a dot (.) prefix are reserved for the system, although applications may use these sections if their existing meanings are satisfactory. Applications may use names without the prefix to avoid conflicts with system sections. The object file format lets one define sections not in the list above. An object file may have more than one section with the same name.
Page 18 of 42
ARM ELF
As the example shows, a string table index may refer to any byte in the section. A string may appear more than once; references to sub-strings may exist; and a single string may be referenced multiple times. Unreferenced strings also are allowed.
st_nameThis member holds an index into the object file's symbol string table, which holds the character representations of the symbol names. st_valueThis member gives the value of the associated symbol. Depending on the context this may be an absolute value, an address, and so on; details are given in section 3.5.1, Symbol Values below. st_sizeMany symbols have associated sizes. For example, a data object's size is the number of bytes contained in the object. This member holds 0 if the symbol has no size or an unknown size. st_infoThis member specifies the symbol's type and binding attributes. A list of the values and meanings appears in Figure 3-16 and Figure 3-17, below. The following code shows how to manipulate the values.
#define ELF32_ST_BIND(i) ((i)>>4) #define ELF32_ST_TYPE(i) ((i)&0xf) #define ELF32_ST_INFO(b,t) (((b)<<4)+((t)&0xf))
st_otherThis member currently holds 0 and has no defined meaning. st_shndxEvery symbol table entry is defined in relation to some section; this member holds the relevant section header table index. As Figure 3-7 above and subsection 3.3.1 above describe, some section indexes indicate special meanings. A symbol's binding determines the linkage visibility and behavior. Figure 3-16, Symbol Binding, ELF32_ST_BIND Name
STB_LOCAL STB_GLOBAL STB_WEAK
Value
0 1 2
Page 19 of 42
ARM ELF
STB_LOCALLocal symbols are not visible outside the object file containing their definition. Local symbols of the same name may exist in multiple files without interfering with each other. STB_GLOBALGlobal symbols are visible to all object files being combined. One file's definition of a global symbol will satisfy another file's undefined reference to the same global symbol. STB_WEAKWeak symbols resemble global symbols, but their definitions have lower precedence. Undefined weak symbols (weak references) may have processor- or OS-specific semantics (see, for example, section 4.4.3, Weak symbols). STB_LOPROC through STB_HIPROCValues in this inclusive range are reserved for processor-specific semantics. In each symbol table, all symbols with STB_LOCAL binding precede the weak and global symbols. A symbol's type provides a general classification for the associated entity. Figure 3-17, Symbol Types, ELF32_ST_TYPE Name
STT_NOTYPE STT_OBJECT STT_FUNC STT_SECTION
Value
0 1 2 3
Meaning The symbol's type is not specified. The symbol is associated with a data object, such as a variable, an array, and so on. The symbol is associated with a function or other executable code. The symbol is associated with a section. Symbol table entries of this type exist primarily for relocation and normally have STB_LOCAL binding. A file symbol has STB_LOCAL binding, its section index is SHN_A BS, and it precedes the other STB_LOCAL symbols for the file, if it is present. Values in this inclusive range are reserved for processor-specific semantics. If a symbol's value refers to a specific location within a section, its section index member, st_shndx, holds an index into the section header table. As the section moves during relocation, the symbol's value changes as well, and references to the symbol continue to point to the same location in the program. Some special section index values give other semantics.
STT_FILE
STT_LOPROC STT_HIPROC
13 15
The symbols in ELF object files convey specific information to the linker and loader. See section 4, ARM- and Thumb-Specific Definitions, for a description of the actual linking model used in the system. SHN_ABSThe symbol has an absolute value that will not change because of relocation. SHN_COMMONThe symbol labels a common block that has not yet been allocated. The symbol's value gives alignment constraints, similar to a section's sh_addralign member. That is, the link editor will allocate the storage for the symbol at an address that is a multiple of st_value. The symbol's size tells how many bytes are required. SHN_UNDEFThis section table index means the symbol is undefined. When the link editor combines this object file with another that defines the indicated symbol, this file's references to the symbol will be linked to the actual definition. As mentioned above, the symbol table entry for index 0 (STN_UNDEF) is reserved. It is shown in Figure 3-18.
Page 20 of 42
ARM ELF
Figure 3-18, Symbol Table Entry: Index 0 Name st_name st_value st_size st_info st_other st_shndx Value 0 0 0 0 0 SHN_UNDEF No section Note No name Zero value No size No type, local binding
In relocatable files, st_value holds alignment constraints for a symbol whose section index is SHN_COMMON. In relocatable files, st_value holds a section offset for a defined symbol. That is, st_value is an offset from the beginning of the section that st_shndx identifies. In executable and shared object files, st_value holds a virtual address . To make these files' symbols more useful to the dynamic linker, the section offset (file interpretation) gives way to a virtual address (memory interpretation) for which the section number is irrelevant.
1
Although the symbol table values have similar meanings for different object files, the data allow efficient access by the appropriate programs.
3.6 Relocation
Relocation is the process of connecting symbolic references with symbolic definitions. For example, when a program calls a function, the associated call instruction must transfer control to the proper destination address at execution. In other words, relocatable files must have information that describes how to modify their section contents, thus allowing executable and shared object files to hold the right information for a process's program image. Relocation entries are these data. Figure 3-19 Relocation Entries
typedef struct { Elf32_Addr r_offset; Elf32_Word r_info; } Elf32_Rel; typedef struct { Elf32_Addr r_offset; Elf32_Word r_info; Elf32_Sword r_addend; } Elf32_Rela;
r_offsetThis member gives the location at which to apply the relocation action. For a relocatable file, the value is the byte offset from the beginning of the section to the storage unit affected by the relocation. For an executable file or a shared object, the value is the virtual address of the storage unit affected by the relocation. r_infoThis member gives both the symbol table index with respect to which the relocation must be made, and the type of relocation to apply. For example, a call instruction's relocation entry would hold the symbol table index
1
This virtual address is assigned during static linking. It can differ from the final execution address. Page 21 of 42
ARM ELF
of the function being called. If the index is STN_UNDEF, the undefined symbol index, the relocation uses 0 as the symbol value. Relocation types are processor-specific; descriptions of their behavior appear in section 4.5, Relocation types. When the text in section 4.5 refers to a relocation entry's relocation type or symbol table index, it means the result of applying ELF32_R_TYPE or ELF32_R_SYM, respectively, to the entry's r_info member.
#define ELF32_R_SYM(i) ((i)>>8) #define ELF32_R_TYPE(i) ((unsigned char)(i)) #define ELF32_R_INFO(s,t) (((s)<<8)+(unsigned char)(t))
r_addendThis member specifies a constant addend used to compute the value to be stored into the relocatable field. As shown in Figure 3-19 above, only Elf32_Rela entries contain an explicit addend. Entries of type Elf32_Rel store an implicit addend in the location to be modified. Depending on the processor architecture, one form or the other might be necessary or more convenient. Consequently, an implementation for a particular machine may use one form exclusively or either form depending on context. A relocation section references two other sections: a symbol table and a section to modify. The section header's sh_info and sh_link members, described in section 3.3, Sections, above, specify these relationships. Relocation entries for different object files have slightly different interpretations for the r_offset member.
o o
In re-locatable files, r_offset holds a section offset. That is, the relocation section itself describes how to modify another section in the file; relocation offsets designate a storage unit within the second section. In executable and shared object files, r_offset holds a virtual address . To make these files' relocation entries more useful for the dynamic linker, the section offset (file interpretation) gives way to a virtual address (memory interpretation).
1
Although the interpretation of r_offset changes for different object files to allow efficient access by the relevant programs, the relocation types' meanings stay the same.
This virtual address is assigned during static linking. It can differ from the final execution address. Page 22 of 42
ARM ELF
p_typeThis member tells what kind of segment this array element describes or how to interpret the array element's information. Type values and their meanings are given in Figure 3-21, below. p_offsetThis member gives the offset from the start of the file at which the first byte of the segment resides. p_vaddrThis member gives the virtual address at which the first byte of the segment resides in memory. p_paddrOn systems for which physical addressing is relevant, this member is reserved for the segment's physical address. This member requires operating system specific information. p_fileszThis member gives the number of bytes in the file image of the segment; it may be zero. p_memszThis member gives the number of bytes in the memory image of the segment; it may be zero. p_flagsThis member gives flags relevant to the segment. Defined flag values are given in Figure 3-22, below. p_alignLoadable process segments must have congruent values for p_vaddr and p_offset, modulo the page size. This member gives the value to which the segments are aligned in memory and in the file. Values 0 and 1 mean that no alignment is required. Otherwise, p_align should be a positive, integral power of 2, and p_vaddr should equal p_offset, modulo p_align. Some entries describe process segments; others give supplementary information and do not contribute to the process image. Figure 3-21, Segment Types, p_type Name
PT_NULL
Value 0 1 2 3 4 5 6
Meaning The array element is unused; other members' values are undefined. This type lets the program header table have ignored entries. The array element specifies a loadable segment, described by p_filesz and p_memsz (for additional explanation, see PT_LOAD below). The array element specifies dynamic linking information. See subsection 4.7. The array element specifies the location and size of a null-terminated path name to invoke as an interpreter. The array element specifies the location and size of auxiliary information. This segment type is reserved but has unspecified semantics. The array element, if present, specifies the location and size of the program header table itself (for additional explanation, see PT_ PHDR below).
PT_LOAD
PT_DYNAMIC PT_INTERP
Page 23 of 42
ARM ELF
0x70000000 0x7fffffff
PT_LOADThe bytes from the file are mapped to the beginning of the memory segment. If the segment's memory size (p_memsz) is larger than the file size (p_filesz), the extra bytes are defined to hold the value 0 and to follow the segment's initialized area. The file size may not be larger than the memory size. Loadable segment entries in the program header table appear in ascending order, sorted on the p_vaddr member. PT_PHDRThe array element, if present, specifies the location and size of the program header table itself, both in the file and in the memory image of the program. This segment type may not occur more than once in a file. Moreover, it may occur only if the program header table is part of the memory image of the program. If it is present, it must precede any loadable segment entry.
Note
Unless specifically required elsewhere, all program header segment types are optional. That is, a file's program header table may contain only those elements relevant to its contents.
Figure 3-22, Defined program header flags Name PF_X PF_W PF_R PF_MASKPROC Value 1 2 4 0xf0000000 Purpose The segment may be executed. The segment may be written to. The segment may be read. Reserved for processor-specific purposes (see 4.6, Program headers).
namesz and nameThe first namesz bytes in name contain a null-terminated character representation of the entry's owner or originator. There is no formal mechanism for avoiding name conflicts. By convention, vendors use their own name, such as "XYZ Computer Company,'' as the identifier. If no name is present, namesz contains 0. Padding is present, if necessary, to ensure 4-byte alignment for the descriptor. Padding is not included in namesz.
Page 24 of 42
ARM ELF
descsz and descThe first descsz bytes in desc hold the note descriptor. ELF places no constraints on a descriptor's contents. If no descriptor is present, descsz contains 0. Padding is present, if necessary, to ensure 4byte alignment for the next note entry. Such padding is not included in descsz. typeThis word gives the interpretation of the descriptor. Each originator controls its own types; multiple interpretations of a single type value may exist. Thus, a program must recognize both the name and the type to understand a descriptor. Types currently must be non-negative. ELF does not define what descriptors mean. To illustrate, the note segment shown in Figure 3-24, below, holds two entries.
Note
The system reserves note information with no name (namesz==0) and with a zero-length name (name[0]=='\0') but currently defines no types. All other names must have at least one non-null character. Note information is optional. The presence of note information does not affect a program's TIS ELF conformance, provided the information does not affect the program's execution behavior. Otherwise, the program does not conform to the TIS ELF specification and has undefined behavior.
Note
Page 25 of 42
ARM ELF
Section names reserved for a processor architecture are formed by placing an abbreviation of the architecture name ahead of the section name. The name should be taken from the architecture names used for e_machine. For instance .FOO.psect is the psect section defined by the FOO architecture. Existing extensions are called by their historical names. Figure 3-29, Pre-existing Extensions
. .sbss .gptab .conflict .lit4 .liblist .sdata .lit8 .tdesc .reginfo
Page 26 of 42
ARM ELF
e_machine
Note
The byte order of all data in an ARM ELF file is the byte order of data in the target execution environment, even if that data will only be consumed in the host (static linker) execution environment. The target byte order may differ from the host byte order.
Meaning e_entry contains a program-loader entry point (see section 4.1.1, Entry points, below). Each subsection of the symbol table is sorted by symbol value (see section 4.4.8, Symbol table order, below) Symbols in dynamic symbol tables that are defined in sections included in program segment n have st_shndx = n + 1. (see section 4.4.9, Dynamic symbol table entries, below). Mapping symbols precede other local symbols in the symbol table (see section 4.4.8, Symbol table order, below). This masks an 8-bit version number, the version of the ARM EABI to which this ELF file conforms. This EABI is version 2. A value of 0 denotes unknown conformance.
(0x02)
EF_ARM_SYMSARESORTED
(0x04)
EF_ARM_DYNSYMSUSESEGIDX
(0x8)
EF_ARM_MAPSYMSFIRST
(0x10)
EF_ARM_EABIMASK
Figure 4-3, Interpretation of the entry point Field e_entry (see section 4.1.1, Entry points, below). Value and meaning In an executable ELF file, e_entry is the virtual address of the images unique entry point, or 0 if the image does not have a unique entry point. In a re-locatable ELF file, e_entry is the offset of the entry point in the section flagged by SHF_ENTRYSECT or 0 if there is no entry point.
Page 27 of 42
ARM ELF
The section containing an entry point is flagged by SHF_ENTRYSECT (see section 4.3, Section headers). The ELF header field e_entry gives the offset of the entry point in that section. There can be at most one entry point in a re-locatable ELF file.
In an ARM executable ELF file, several program segments can be mapped at the same virtual address so:
o
The program segment containing the entry address is flagged by PF_ARM_ENTRY (see section4.6, Program headers).
Note Note
Bracketed SHF_ALLOC flags are set only if the section is contained in an executable program segment (one of type PT_LOAD or PT_DYNAMICsee section 4.6, Program headers). There can be many sections with the same name in an ELF file.
Figure 4-4, ARM standard section names and their meanings Name prefix .bss .comment .data .debug .dynamic .dynsym .hash .line .rodata Section type
SHT_NOBITS SHT_PROGBITS
Section attributes
SHF_ALLOC+SHF_WRITE None
Explanation Uninitialized dataset to zero before execution. A comment from the producing toolversion data. Initialized data. Debugging tables (may include line number data). Dynamic linking informationmay not be writable. A symbol table for dynamic linking. A symbol hash table. Line number data for debugging. Initialized read-only data.
SHT_PROGBITS SHT_PROGBITS
SHF_ALLOC+SHF_WRITE None
SHT_DYNAMIC
Page 28 of 42
ARM ELF
ARM standard section names and their meanings (continued) .relname .relaname .shstrtab .strtab .symtab .text
SHT_REL SHT_RELA [SHF_ALLOC]
Relocation data. By convention, the continuation of the name is the name of the section being relocated. The section name string table. A string table for a symbol table. A symbol table for static linking. Program instructions and inline literal data.
All variants of a common section must define the same global symbols. If the section contains code, all variants must have the same functional interface. However, different variants may have a different size, a different content, or be differently relocated. If the section contains data, all variants must have the same size, the same content, and be similarly relocated.
This specification does not define which variant of a common section a linker should retain.
Page 29 of 42
ARM ELF
4.4 Symbols
4.4.1 Symbol value
See also section 3.5.1, Symbol Values. In a re-locatable file:
o o
For a COMMON symbol defined in the SHN_COMMON section, st_value gives its alignment constraint (the allocated address of the symbol must be zero modulo st_value). For a symbol definition, st_value gives its offset within the section identified by st_shndx.
For symbols defined in sections included in executable program segments, st_value is a target-system virtual address assigned when the ELF file is statically linked. Otherwise, st_value is a virtual address in an address space specific to the operating environment (for example, symbols defined in debugging tables).
P + 4 if location P is subject to branch relocation (R_ARM_PC24, .R_ARM_THM_PC22, R_ARM_XPC25, R_ARM_THM_XPC22). P if location P is subject to a PC-relative or SB-relative relocation. Otherwise, 0.
You can think of these values as branch offset 0 (branch to the next instruction), offset 0, and absolute 0, respectively. That is, the value of an undefined weak symbol is always the sort of 0 appropriate to the relocation directive referring to it. A weak symbol definition may coexist with a non-weak definition, but all references to the symbol resolve to the non-weak definition.
Page 30 of 42
ARM ELF
A file may make both a weak reference and a non-weak reference through distinct symbols that have the same name (this can help a linker perform unused section elimination).
A reference to name resolves to the definition of $Sub$$name. A reference to $Super$$name resolves to the definition of name.
Page 31 of 42
ARM ELF
This list of mapping symbols may be extended in the future. Section-relative mapping symbols Mapping symbols defined in a section define a sequence of half-open address intervals that cover the address range of the section. Each interval starts at the address defined by a mapping symbol, and continues up to, but not including, the address defined by the next (in address order) mapping symbol or the end of the section. A corollary is that there must be a mapping symbol defined at the beginning of each section. Consumers can ignore the size of a section-relative mapping symbol. Producers can set it to 0. Absolute mapping symbols Because of the need to crystallize a Thumb address with the Thumb-bit set, absolute symbol of type STT_FUNC (symbols of type STT_FUNC defined in section SHN_ABS) need to be mapped with $a or $t. The extent of a mapping symbol defined in SHN_ABS is [st_value, st_value + st_size), or [st_value, st_value + 1) if st_size = 0, where [x, y) denotes the half-open address range from x, inclusive, to y, exclusive. In the absence of a mapping symbol, a consumer can interpret a function symbol with an odd value as the Thumb code address obtained by clearing the least significant bit of the value. This interpretation is deprecated, and it may not work in the future.
labels the final, PC-modifying instruction of an indirect function call. Its type is STT_FUNC. (An indirect call is a call through a function pointer variable). $p does not label the PC-modifying instruction of a function return sequence. Its size is 2 bytes in Thumb-state, 4 bytes in ARM-state. gives (in its st_value field) the total number of mapping and tagging symbols in the symbol table.
$m
This list of tagging symbols is not exhaustive and others may be defined in the future.
Local symbols
$m Other mapping and tagging symbols sorted in virtual address order Other local symbols sorted in virtual address order (save that each symbol of type STT_FILE should precede all the symbols of type STT_SECTION that are associated with it).
Global symbols.
Page 32 of 42
ARM ELF
If the EF_ARM_MAPSYMSFIRST flag is set in the e_flags field of the ELF header (see section 4.1, ELF header): A consumer can rely on mapping and tagging symbols preceding other local symbols. The first local symbol will have the name $m and its st_value field will be equal to the total number of mapping and tagging symbols (including the $m) in the symbol table. Otherwise, a consumer must assume that mapping symbols are interleaved with other local symbols. If EF_ARM_SYMSARESORTED is set in the e_flags field of the ELF header (see section 4.1, ELF header): Each subsection of the symbol table is sorted by increasing st_value ( symbols of type STT_FILE excepted). Each symbol of type STT_FILE precedes all the symbols of type STT_SECTION associated with it (thus a consuming debugger can easily map each image section to the source file it was created from). Otherwise, a consumer should not assume that symbol table subsections are sorted by address.
A section containing the storage unitbyte, half-word, word, or instructionbeing relocated. An offset within the sectionor the address within an executable programof the storage unit itself. A symbol, the value of which helps to define a new value for the storage unit. A relocation type that defines the computation to be performed. Computations are performed using 2s complement, 32-bit, unsigned arithmetic with silent overflow. An addend, that also helps to define a new value for the storage unit.
The addend may be encoded wholly in a field of the storage unit being relocatedrelocation sort SHT_RELor partly there and partly in the addend field of the relocation directiverelocation sort SHT_RELA. Tables below describe the computation associated with each relocation type, using the following notation: A denotes the addend used to compute the new value of the storage unit being relocated.
It is the value extracted from the storage unit being relocated (relocation directives of sort SHT_REL) or the sum of that value and the r_addend field of the relocation directive (sort SHT_RELA). If it has a unit, the unit is bytes. An encoded address or offset value is converted to bytes on extraction from a storage unit and re-encoded on insertion into a storage unit. denotes the place (section offset or address of the storage unit) being re-located. It is the sum of the r_offset field of the relocation directive and the base address of the section being re-located.
Page 33 of 42
ARM ELF
S B
denotes the value of the symbol whose symbol table index is given in the r_info field of the relocation directive. denotes the base address of the consolidated section in which the symbol is defined. For relocations of type R_ARM_SBREL32, this is the least static data address (the static base).
Computation and meaning No relocation. Encodes dependencies between sections. SP+A S+A SP+A SP+A S+A S+A S+A S+A SB+A S P+ A SP+A ObsoleteSA-1500 only. S+A S+A S P+ A S P+ A
R_ARM_PC24 R_ARM_ABS32 R_ARM_REL32 R_ARM_PC13 R_ARM_ABS16 R_ARM_ABS12 R_ARM_THM_ABS5 R_ARM_ABS8 R_ARM_SBREL32 R_ARM_THM_PC22 R_ARM_THM_PC8 R_ARM_AMP_VCALL9 R_ARM_SWI24 R_ARM_THM_SWI8 R_ARM_XPC25 R_ARM_THM_XPC22
16-bit half-word
ARM LDR/STR Thumb LDR/STR
AMP VCALL ARM SWI Thumb SWI ARM BLX Thumb BLX pair
Note
A relocation directive of type R_ARM_NONE records that the section containing the place to be relocated depends on the section defining the symbol mentioned in the relocation directive in a way otherwise invisible to a static linker. It therefore prevents the removal of sections that might appear to be unused.
Figure 4-8, ARM relocation types 17-31, reserved to ARM Linux Type 17-19 20 21 22
R_ARM_COPY R_ARM_GLOB_DAT R_ARM_JUMP_SLOT
Name
Field
Copy symbol at dynamic link time. Create GOT entry. Create PLT entry.
Page 34 of 42
ARM ELF
Adjust by program base. Offset relative to start of GOT. Insert address of GOT. Entry in GOT. Entry in PLT. Reserved to ARM LINUX
Field ARM ADD/SUB ARM ADD/SUB ARM ADD/SUB ARM LDR/STR ARM ADD/SUB ARM ADD/SUB
Computation and meaning (S P + A) & 0x000000FF (S P + A) & 0x0000FF00 (S P + A) & 0x00FF0000 (S B + A) & 0x00000FFF (S B + A) & 0x000FF000 (S B + A) & 0x0FF00000 Reserved to ARM
Figure 4-10, ARM relocation types 96-111, reserved to g++ Type 96-99 100 101 102 103 104-111
R_ARM_GNU_VTENTRY R_ARM_GNU_VTINHERIT R_ARM_THM_PC11 R_ARM_THM_PC9
Name
Field
Record C++ vtable entry. Record C++ member usage. SP+A SP+A Reserved to ARM g++
Figure 4-11, ARM relocation types 112-127, reserved for private experiments Type 112-127 Name To be defined Field To be defined Computation and meaning Reserved for private experimentsThese values will never clash with relocations defined by ARM, but will always clash with other private experiments.
Page 35 of 42
ARM ELF
Figure 4-12, ARM relocation types 128-248, reserved to ARM Type 128-248 Name Field Computation and meaning Reserved to ARM
S P SB
is the displacement from its statically linked virtual address of the segment containing the symbol definition. is the displacement from its statically linked virtual address of the segment containing the place to be relocated. is the displacement of the segment pointed to by the static base (PF_ARM_SB is set in the p_flags field of this segments program headersee 4.6, Program headers).
Figure 4-13, ARM dynamic relocation types 249-255 Type 249 250 251 252 253 254 255 Name
R_ARM_RXPC25
Field ARM BLX Word Thumb BL/BLX pair Word Word ARM B/BL None
Computation and meaning (S P) + A For calls between program segments. (S SB) + A For an offset from SB, the static base. (S P) + A For calls between program segments. (S P) + A For on offset between two segments.
R_ARM_RSBREL32
R_ARM_THM_RPC22
R_ARM_RREL32
R_ARM_RABS32
R_ARM_RPC24
R_ARM_RBASE
The ARM EABI poses two problems for relocating executables and shared objects encoded in ELF:
o
An executable or shared-object ELF file can contain many program segments that can be placed independently in memory when the file is loaded. To support this, a static linker must either:
Defer until load time relocations that depend on segment addresses. Or, reduce such relocations to a simpler form that depends only on segment addresses (or, equivalently, on the displacements of segments from their statically linked addresses).
Program segments can be overlaid in the target address space. Consequently, a virtual address does not uniquely identify a place to be relocated. Page 36 of 42
ARM ELF
The R_ARM_RBASE type informs a consumer that following relocation directives relocate places in the segment (the source segment) identified by its ELF32_R_SYM field:
o o
If ELF32_R_SYM = n > 0, following relocations apply to source segment (n-1). If ELF32_R_SYM = n = 0, following relocations identify the source segment by virtual address only.
Consumers can ignore the r_offset field. Producers should set it to zero. Prior to the first R_ARM_RBASE directive, relocation directives identify the source segment by virtual address. Displacement-based dynamic relocation types The ARM EABI defines displacement-based dynamic relocation types. Their advantage is that if an ELF file contains only dynamic relocations and each program segment is loaded at its statically linked address, there is no relocation work to do at load time. For the remaining dynamic relocation types:
o o
The r_offset field gives the virtual address of the place being relocated. Its offset in the source segment is the difference between r_offset and the statically linked address of the source segment. ELF32_R_SYM 1 indexes the program segment (the target segment) with respect to which the place is being re-located.
R_ARM_RABS32 directs a consumer to add to the place the displacement of the target segment from its statically linked virtual address. R_ARM_RPC24, R_ARM_RXPC25, R_ARM_RREL32, and R_ARM_THM_RPC22 direct a consumer to add to the place the difference between the displacement of the target segment (from its statically linked virtual address) and the displacement of the source segment (from its statically linked virtual address). R_ARM_RSBREL32 is similar to R_ARM_RREL32, except that the segment addressed by the static base register is used as the source segment (the PF_ARM_SB flag is set in the p_flags field of this program segments header. See section 4.6, Program headers). PC-relative re-location is defined using the difference of two displacements to support the displacement of a program by more than the maximum BL offset. Re-location may fail at load time if program segments are moved apart too muchbeyond the address range of a BL instruction, for example.
ARM ELF
Labeling the least significant bit of a 32-bit ARM instruction word, or 16-bit Thumb instruction word, bit 0, instruction fields to be relocated are given in Figure 4-14 and Figure 4-15, below. Figure 4-14, Re-locatable ARM instruction fields
R_ARM_PC24
Bits 0-23 encode a signed offset, in units of 4-byte instructions (thus 24 bits encode a branch offset of +- 2^25 bytes). Bits 0-11 encode an unsigned byte offset. Bit 23 encodes the direction of the offset0 means to a lower address than P, 1 to a higher address. Bits 0-11 encode an unsigned byte offset. Bits 0-23 encode the ARM SWI number. Bits 0-23 encode a signed offset in units of 4-byte words. Bit 24 encodes bit 1 of the target Thumb address. Bits 0-7 contain the bit value of the selected field. Bits 8-11 contain 0, 0xc, or 0x8, half the rotate-right needed to shift the value to its field position. Bits 23 and 22 encode the sign of the value01 means negative, 10 means positive. Bits 0-11 contain the bit value of the selected field. Bit 23 encodes the sign of the value0 means negative, 1 means positive. Bits 0-7 contain the bit value of the selected field. Bits 8-11 contain 0xa or 0x6, half the rotate-right needed to shift the value to its field position. Bits 23 and 22 encode the sign of the value01 means negative, 10 means positive.
R_ARM_PC13
R_ARM_ALU_SBREL_19_12, R_ARM_ALU_SBREL_27_20
Bits 6-10 encode a 5-bit unsigned offset in units of 4-byte words (Thumb LDRB/LDRH cannot be relocated). Bits 0-10 encode the 11 most significant bits of the branch offset. Bits 0-10 of the next instruction word encode the 11 least significant bits. The unit is 2-byte instructions. Bits 0-7 encode an 8-bit unsigned offset in units of 4-byte words. An initial offset of 255 must be interpreted as an offset of 1 (so the initial offset range is [-1, 254]). Bits 0-7 encodes the Thumb SWI number. Bits 0-10 encode the 11 most significant bits of the branch offset. Bits 1-10 of the next instruction word encode the bits 1-10 of the branch offset. Bit 0 must be set to 0. The unit is 2-byte instructions.
R_ARM_THM_PC22
R_ARM_THM_PC8
R_ARM_THM_SWI8 R_ARM_THM_XPC22
Note
When a Thumb LDR [pc, ] instruction is subject to a REL-sort relocation of type R_ARM_THM_PC8, there must be a way to encode the offset to the place containing the instruction in the initial value of the instruction. Using the value 255 to encode 1 does this.
Page 38 of 42
ARM ELF
Note Note
Figure 4-17, Program header flags Flag Name PF_X PF_R PF_W
PF_ARM_SB PF_ARM_PI PF_ARM_ENTRY
Meaning The program will fetch instructions from the segment. The program will read data from the segment. The program will write to the segment. The segment contains the location addressed by the static base. The segment is position-independent. The segment contains the entry point.
Note
PF_ARM_ENTRY is set in a program header if that program segment contains the entry point virtual address. The meaning is unspecified if PF_ARM_ENTRY is set in more than one program header, or PF_ARM_ENTRY is set in no program header and more than one segment contains the entry point address. Flag settings encode an assertion about the executable segment by its producer. A consumer should grant the least access consistent with the segments requirements. In general, an ARM and Thumb executable segment must also be readable. A limited PC-relative addressing range virtually mandates that instructions and literal data are interleaved in a segment.
Note Note
Page 39 of 42
ARM ELF
Loaded into memory by a program loader. Prepared for ROM by a ROM builder.
List one or more shared objects (shared libraries) with which it should be linked. Refer to symbols defined by these shared objects, the execution environment, or the ROM builder. These references appear as undefined symbols in the dynamic symbol table. Define symbols that can be referred to by these shared objects, the execution environment, or the ROM builder. These symbols are defined in the dynamic symbol table. List locations to be relocated whose values depend on: The actual execution addresses given to program segments. The values of symbols defined during dynamic linking.
In general, some storage units will need to be relocated when symbolic references are resolved.
A dynamic section (see 4.7.3, The dynamic section) that describes the dynamic segment. A string table used by the symbol table and directly by some dynamic section entries (see 3.4, String Table). A dynamic symbol table section. This has the same format as a symbol table (see 3.5, Symbol Table), but may use a different interpretation of st_shndx (see 4.4.9, Dynamic symbol table entries). A section containing relocations (a section of sort SHT_REL and/or SHT_RELA). This has the same format as any other relocation section (see 3.6, Relocation). A hash table that accelerates use of the symbol table (see 4.7.4, The hash table section). SHT_DYNAMICthe dynamic array itself. SHT_STRTABthe string table. SHT_DYNSYMthe symbol table. SHT_REL and/or SHT_RELAthe relocation section(s). SHT_HASHthe symbol hash table.
Optionally, section headers of the following types may describe these sub-sections of the dynamic segment:
o o o o o
Operating environments are free to define their own semantics for these fields. SWS ESPC 0003 B-02 Page 40 of 42
ARM ELF
Each element is self-identifying through its d_tag field. Figure 4-18, Dynamic section tags d_tag 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Tag name
DT_NULL DT_NEEDED DT_PLTRELSZ DT_PLTGOT DT_HASH DT_STRTAB DT_SYMTAB DT_RELA DT_RELASZ DT_RELAENT DT_STRSZ DT_SYMENT DT_INIT DT_FINI DT_SONAME DT_RPATH DT_SYMBOLIC DT_REL DT_RELSZ DT_RELENT DT_PLTREL DT_DEBUG DT_TEXTREL DT_JMPREL DT_BIND_NOW DT_LOPROC DT_HIPROC
The value of d_val and the meaning of the array entry Ignored. This entry marks the end of the dynamic array. Index in the string table of the name of a needed library. These entries are unused by versions 1-2 of the ARM EABI. The offset of the hash table section in the dynamic segment. The offset of the string table section in the dynamic segment. The offset of the symbol table section in the dynamic segment. The offset in the dynamic segment of an SHT_RELA relocation section, Its byte size, and the byte size of an ARM RELA-type relocation entry.
The byte size of the string table section. The byte size of an ARM symbol table entry16. These entries are unused by versions 1-2 of the ARM EABI. The Index in the string table of the name of this shared object. Unused by the ARM EABI. The offset in the dynamic segment of an SHT_REL relocation section, Its byte size, and the byte size of an ARM REL-type relocation entry
unused
0x70000000 0x7fffffff
Note Note
unused
The last entry in the dynamic array must have tag DT_NULL. The relative order of DT_NEEDED entries may be important to a dynamic linker. Otherwise the order of entries in the dynamic array has no significance.
Page 41 of 42
ARM ELF
Note
A DT_SONAME entry is mandatory only for shared objects, not for dynamically linked executables.
A hash table section (see 4.7.4, The hash table section). A symbol table section (called .dynsym in the section viewsee 3.5, Symbol Table). A string table section (see 3.4, String Table). Relocation sections (see 3.6, Relocation).
The order of these sections is unimportant. The offset of each in the dynamic segment is given by the corresponding entry in the dynamic array.
Both bucket and chain hold symbol table indexes. Indexes start at 0. Bucket can have any convenient size. There is one chain entry for each symbol in the symbol table (nChains = number of symbols). Bucket and chain implement a chained overflow hash table access structure for the symbol table. If h is the result of applying the ELF hash function (see Figure 4-19, The ELF hash function) to a symbols name, the start of the chain of symbols that hash to this bucket is given by:
bucket[h % nBuckets]
For each symbol index s, chain[s] gives the index of the next symbol that hashes to the same bucket. Zero indexes the dummy symbol and is used as the end of chain pointer. Figure 4-19, The ELF hash function
unsigned long elf_hash(const unsigned char *name) { unsigned long h, g; for (h = 0; *name != 0; ++name) { h = (h << 4) + *name; g = h & 0xf0000000; if (g != 0) h ^= g >> 24; h &= ~g; } return h; }
Page 42 of 42