#
# Copyright (C) 2018 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
"""This file contains ELF constants."""

# e_ident[] indices
EI_MAG0 = 0         # File identification
EI_MAG1 = 1         # File identification
EI_MAG2 = 2         # File identification
EI_MAG3 = 3         # File identification
EI_CLASS = 4        # File class
EI_DATA = 5         # Data encoding
EI_VERSION = 6      # File version
EI_OSABI = 7        # Operating system/ABI identification
EI_ABIVERSION = 8   # ABI version
EI_PAD = 9          # Start of padding bytes
EI_NIDENT = 16      # Size of e_ident[]

# EI_MAG0 to EI_MAG3
ELF_MAGIC_NUMBER = b'\x7fELF'

# EI_CLASS
ELFCLASSNONE = 0    # Invalid class
ELFCLASS32 = 1      # 32-bit objects
ELFCLASS64 = 2      # 64-bit objects

# EI_DATA
ELFDATANONE = 0     # Invalid data encoding
ELFDATA2LSB = 1     # Little endian
ELFDATA2MSB = 2     # Big endian

# e_type
ET_NONE = 0         # No file type
ET_REL = 1          # Relocatable file (object file)
ET_EXEC = 2         # Executable file
ET_DYN = 3          # Shared object file
ET_CORE = 4         # Core file

# e_machine
EM_386 = 3
EM_X86_64 = 62
EM_ARM = 40
EM_AARCH64 = 183
EM_RISCV = 243

# Relocation types
R_ARM_ABS32 = 0x02
R_ARM_RELATIVE = 0x17
R_AARCH64_ABS64 = 0x101
R_AARCH64_RELATIVE = 0x403
R_386_32 = 1
R_386_RELATIVE = 8
R_X86_64_64 = 1
R_X86_64_RELATIVE = 8
R_RISCV_64 = 2
R_RISCV_RELATIVE = 3

# Section types
SHT_NULL = 0
SHT_PROGBITS = 1
SHT_SYMTAB = 2
SHT_STRTAB = 3
SHT_RELA = 4
SHT_HASH = 5
SHT_DYNAMIC = 6
SHT_NOTE = 7
SHT_NOBITS = 8
SHT_REL = 9
SHT_SHLIB = 10
SHT_DYNSYM = 11
SHT_INIT_ARRAY = 14
SHT_FINI_ARRAY = 15
SHT_PREINIT_ARRAY = 16
SHT_GROUP = 17
SHT_SYMTAB_SHNDX = 18
SHT_RELR = 19
SHT_LOOS = 0x60000000
SHT_ANDROID_REL = SHT_LOOS + 1
SHT_ANDROID_RELA = SHT_LOOS + 2
SHT_ANDROID_RELR = SHT_LOOS + 0xfffff00

# Android packed relocation flags
RELOCATION_GROUPED_BY_INFO_FLAG = 1
RELOCATION_GROUPED_BY_OFFSET_DELTA_FLAG = 2
RELOCATION_GROUPED_BY_ADDEND_FLAG = 4
RELOCATION_GROUP_HAS_ADDEND_FLAG = 8

# Section names
SYMTAB = '.symtab'
STRTAB = '.strtab'
DYNSYM = '.dynsym'
DYNSTR = '.dynstr'

# Special section indices
SHN_UNDEF = 0
SHN_LORESERVE = 0xff00
SHN_LOPROC = 0xff00
SHN_HIPROC = 0xff1f
SHN_LOOS = 0xff20
SHN_HIOS = 0xff3f
SHN_ABS = 0xfff1
SHN_COMMON = 0xfff2
SHN_XINDEX = 0xffff
SHN_HIRESERVE = 0xffff

# Symbol bindings
STB_LOCAL = 0
STB_GLOBAL = 1
STB_WEAK = 2
STB_LOOS = 10
STB_HIOS = 12
STB_LOPROC = 13
STB_HIPROC = 15

# Symbol types
STT_NOTYPE = 0
STT_OBJECT = 1
STT_FUNC = 2
STT_SECTION = 3
STT_FILE = 4
STT_COMMON = 5
STT_TLS = 6
STT_LOOS = 10
STT_HIOS = 12
STT_LOPROC = 13
STT_HIPROC = 15

# Segment types
PT_NULL = 0
PT_LOAD = 1
PT_DYNAMIC = 2
PT_INTERP = 3
PT_NOTE = 4
PT_SHLIB = 5
PT_PHDR = 6
PT_TLS = 7
PT_LOOS = 0x60000000
PT_HIOS = 0x6fffffff
PT_LOPROC = 0x70000000
PT_HIPROC = 0x7fffffff
PT_GNU_EH_FRAME = 0x6474e550
PT_SUNW_EH_FRAME = 0x6474e550
PT_SUNW_UNWIND = 0x6464e550
PT_GNU_STACK = 0x6474e551
PT_GNU_RELRO = 0x6474e552
PT_ARM_ARCHEXT = 0x70000000
PT_ARM_EXIDX = 0x70000001
PT_ARM_UNWIND = 0x70000001

# Dynamic array tags
# Name     Value        d_un          Executable  Shared Object
DT_NULL = 0             # ignored     mandatory   mandatory
DT_NEEDED = 1           # d_val       optional    optional
DT_PLTRELSZ = 2         # d_val       optional    optional
DT_PLTGOT = 3           # d_ptr       optional    optional
DT_HASH = 4             # d_ptr       mandatory   mandatory
DT_STRTAB = 5           # d_ptr       mandatory   mandatory
DT_SYMTAB = 6           # d_ptr       mandatory   mandatory
DT_RELA = 7             # d_ptr       mandatory   optional
DT_RELASZ = 8           # d_val       mandatory   optional
DT_RELAENT = 9          # d_val       mandatory   optional
DT_STRSZ = 10           # d_val       mandatory   mandatory
DT_SYMENT = 11          # d_val       mandatory   mandatory
DT_INIT = 12            # d_ptr       optional    optional
DT_FINI = 13            # d_ptr       optional    optional
DT_SONAME = 14          # d_val       ignored     optional
DT_RPATH = 15           # d_val       optional    ignored
DT_SYMBOLIC = 16        # ignored     ignored     optional
DT_REL = 17             # d_ptr       mandatory   optional
DT_RELSZ = 18           # d_val       mandatory   optional
DT_RELENT = 19          # d_val       mandatory   optional
DT_PLTREL = 20          # d_val       optional    optional
DT_DEBUG = 21           # d_ptr       optional    ignored
DT_TEXTREL = 22         # ignored     optional    optional
DT_JMPREL = 23          # d_ptr       optional    optional
DT_BIND_NOW = 24        # ignored     optional    optional
DT_INIT_ARRAY = 25      # d_ptr       optional    optional
DT_FINI_ARRAY = 26      # d_ptr       optional    optional
DT_INIT_ARRAYSZ = 27    # d_val       optional    optional
DT_FINI_ARRAYSZ = 28    # d_val       optional    optional
DT_RUNPATH = 29         # d_val       optional    optional
DT_FLAGS = 30           # d_val       optional    optional
DT_ENCODING = 32        # unspecified unspecified unspecified
DT_LOOS = 0x6000000D    # unspecified unspecified unspecified
DT_ANDROID_REL = DT_LOOS + 2      # d_ptr
DT_ANDROID_RELSZ = DT_LOOS + 3    # d_val
DT_ANRDOID_RELA = DT_LOOS + 4     # d_ptr
DT_ANRDOID_RELASZ = DT_LOOS + 5   # d_val
DT_RELR = 0x6fffe000              # d_ptr
DT_RELRSZ = 0x6fffe001            # d_val
DT_RELRENT = 0x6fffe003           # d_val
