1#
2# Copyright (C) 2018 The Android Open Source Project
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8#      http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15#
16"""This file contains ELF constants."""
17
18# e_ident[] indices
19EI_MAG0 = 0         # File identification
20EI_MAG1 = 1         # File identification
21EI_MAG2 = 2         # File identification
22EI_MAG3 = 3         # File identification
23EI_CLASS = 4        # File class
24EI_DATA = 5         # Data encoding
25EI_VERSION = 6      # File version
26EI_OSABI = 7        # Operating system/ABI identification
27EI_ABIVERSION = 8   # ABI version
28EI_PAD = 9          # Start of padding bytes
29EI_NIDENT = 16      # Size of e_ident[]
30
31# EI_MAG0 to EI_MAG3
32ELF_MAGIC_NUMBER = b'\x7fELF'
33
34# EI_CLASS
35ELFCLASSNONE = 0    # Invalid class
36ELFCLASS32 = 1      # 32-bit objects
37ELFCLASS64 = 2      # 64-bit objects
38
39# EI_DATA
40ELFDATANONE = 0     # Invalid data encoding
41ELFDATA2LSB = 1     # Little endian
42ELFDATA2MSB = 2     # Big endian
43
44# e_type
45ET_NONE = 0         # No file type
46ET_REL = 1          # Relocatable file (object file)
47ET_EXEC = 2         # Executable file
48ET_DYN = 3          # Shared object file
49ET_CORE = 4         # Core file
50
51# e_machine
52EM_386 = 3
53EM_X86_64 = 62
54EM_ARM = 40
55EM_AARCH64 = 183
56EM_RISCV = 243
57
58# Relocation types
59R_ARM_ABS32 = 0x02
60R_ARM_RELATIVE = 0x17
61R_AARCH64_ABS64 = 0x101
62R_AARCH64_RELATIVE = 0x403
63R_386_32 = 1
64R_386_RELATIVE = 8
65R_X86_64_64 = 1
66R_X86_64_RELATIVE = 8
67R_RISCV_64 = 2
68R_RISCV_RELATIVE = 3
69
70# Section types
71SHT_NULL = 0
72SHT_PROGBITS = 1
73SHT_SYMTAB = 2
74SHT_STRTAB = 3
75SHT_RELA = 4
76SHT_HASH = 5
77SHT_DYNAMIC = 6
78SHT_NOTE = 7
79SHT_NOBITS = 8
80SHT_REL = 9
81SHT_SHLIB = 10
82SHT_DYNSYM = 11
83SHT_INIT_ARRAY = 14
84SHT_FINI_ARRAY = 15
85SHT_PREINIT_ARRAY = 16
86SHT_GROUP = 17
87SHT_SYMTAB_SHNDX = 18
88SHT_RELR = 19
89SHT_LOOS = 0x60000000
90SHT_ANDROID_REL = SHT_LOOS + 1
91SHT_ANDROID_RELA = SHT_LOOS + 2
92SHT_ANDROID_RELR = SHT_LOOS + 0xfffff00
93
94# Android packed relocation flags
95RELOCATION_GROUPED_BY_INFO_FLAG = 1
96RELOCATION_GROUPED_BY_OFFSET_DELTA_FLAG = 2
97RELOCATION_GROUPED_BY_ADDEND_FLAG = 4
98RELOCATION_GROUP_HAS_ADDEND_FLAG = 8
99
100# Section names
101SYMTAB = '.symtab'
102STRTAB = '.strtab'
103DYNSYM = '.dynsym'
104DYNSTR = '.dynstr'
105
106# Special section indices
107SHN_UNDEF = 0
108SHN_LORESERVE = 0xff00
109SHN_LOPROC = 0xff00
110SHN_HIPROC = 0xff1f
111SHN_LOOS = 0xff20
112SHN_HIOS = 0xff3f
113SHN_ABS = 0xfff1
114SHN_COMMON = 0xfff2
115SHN_XINDEX = 0xffff
116SHN_HIRESERVE = 0xffff
117
118# Symbol bindings
119STB_LOCAL = 0
120STB_GLOBAL = 1
121STB_WEAK = 2
122STB_LOOS = 10
123STB_HIOS = 12
124STB_LOPROC = 13
125STB_HIPROC = 15
126
127# Symbol types
128STT_NOTYPE = 0
129STT_OBJECT = 1
130STT_FUNC = 2
131STT_SECTION = 3
132STT_FILE = 4
133STT_COMMON = 5
134STT_TLS = 6
135STT_LOOS = 10
136STT_HIOS = 12
137STT_LOPROC = 13
138STT_HIPROC = 15
139
140# Segment types
141PT_NULL = 0
142PT_LOAD = 1
143PT_DYNAMIC = 2
144PT_INTERP = 3
145PT_NOTE = 4
146PT_SHLIB = 5
147PT_PHDR = 6
148PT_TLS = 7
149PT_LOOS = 0x60000000
150PT_HIOS = 0x6fffffff
151PT_LOPROC = 0x70000000
152PT_HIPROC = 0x7fffffff
153PT_GNU_EH_FRAME = 0x6474e550
154PT_SUNW_EH_FRAME = 0x6474e550
155PT_SUNW_UNWIND = 0x6464e550
156PT_GNU_STACK = 0x6474e551
157PT_GNU_RELRO = 0x6474e552
158PT_ARM_ARCHEXT = 0x70000000
159PT_ARM_EXIDX = 0x70000001
160PT_ARM_UNWIND = 0x70000001
161
162# Dynamic array tags
163# Name     Value        d_un          Executable  Shared Object
164DT_NULL = 0             # ignored     mandatory   mandatory
165DT_NEEDED = 1           # d_val       optional    optional
166DT_PLTRELSZ = 2         # d_val       optional    optional
167DT_PLTGOT = 3           # d_ptr       optional    optional
168DT_HASH = 4             # d_ptr       mandatory   mandatory
169DT_STRTAB = 5           # d_ptr       mandatory   mandatory
170DT_SYMTAB = 6           # d_ptr       mandatory   mandatory
171DT_RELA = 7             # d_ptr       mandatory   optional
172DT_RELASZ = 8           # d_val       mandatory   optional
173DT_RELAENT = 9          # d_val       mandatory   optional
174DT_STRSZ = 10           # d_val       mandatory   mandatory
175DT_SYMENT = 11          # d_val       mandatory   mandatory
176DT_INIT = 12            # d_ptr       optional    optional
177DT_FINI = 13            # d_ptr       optional    optional
178DT_SONAME = 14          # d_val       ignored     optional
179DT_RPATH = 15           # d_val       optional    ignored
180DT_SYMBOLIC = 16        # ignored     ignored     optional
181DT_REL = 17             # d_ptr       mandatory   optional
182DT_RELSZ = 18           # d_val       mandatory   optional
183DT_RELENT = 19          # d_val       mandatory   optional
184DT_PLTREL = 20          # d_val       optional    optional
185DT_DEBUG = 21           # d_ptr       optional    ignored
186DT_TEXTREL = 22         # ignored     optional    optional
187DT_JMPREL = 23          # d_ptr       optional    optional
188DT_BIND_NOW = 24        # ignored     optional    optional
189DT_INIT_ARRAY = 25      # d_ptr       optional    optional
190DT_FINI_ARRAY = 26      # d_ptr       optional    optional
191DT_INIT_ARRAYSZ = 27    # d_val       optional    optional
192DT_FINI_ARRAYSZ = 28    # d_val       optional    optional
193DT_RUNPATH = 29         # d_val       optional    optional
194DT_FLAGS = 30           # d_val       optional    optional
195DT_ENCODING = 32        # unspecified unspecified unspecified
196DT_LOOS = 0x6000000D    # unspecified unspecified unspecified
197DT_ANDROID_REL = DT_LOOS + 2      # d_ptr
198DT_ANDROID_RELSZ = DT_LOOS + 3    # d_val
199DT_ANRDOID_RELA = DT_LOOS + 4     # d_ptr
200DT_ANRDOID_RELASZ = DT_LOOS + 5   # d_val
201DT_RELR = 0x6fffe000              # d_ptr
202DT_RELRSZ = 0x6fffe001            # d_val
203DT_RELRENT = 0x6fffe003           # d_val
204