mirror of
https://github.com/dart-lang/sdk
synced 2024-09-04 16:03:44 +00:00
![Ryan Macnak](/assets/img/avatar_default.png)
TEST=build Change-Id: I61ebb04f414d36813a99b424fb1bcdb440f68ad5 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/293801 Commit-Queue: Ryan Macnak <rmacnak@google.com> Reviewed-by: Alexander Aprelev <aam@google.com>
222 lines
4.9 KiB
C++
222 lines
4.9 KiB
C++
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
#ifndef RUNTIME_PLATFORM_ELF_H_
|
|
#define RUNTIME_PLATFORM_ELF_H_
|
|
|
|
#include "platform/globals.h"
|
|
|
|
namespace dart {
|
|
namespace elf {
|
|
|
|
#pragma pack(push, 1)
|
|
|
|
struct ElfHeader {
|
|
uint8_t ident[16];
|
|
uint16_t type;
|
|
uint16_t machine;
|
|
uint32_t version;
|
|
#if defined(TARGET_ARCH_IS_32_BIT)
|
|
uint32_t entry_point;
|
|
uint32_t program_table_offset;
|
|
uint32_t section_table_offset;
|
|
#else
|
|
uint64_t entry_point;
|
|
uint64_t program_table_offset;
|
|
uint64_t section_table_offset;
|
|
#endif
|
|
uint32_t flags;
|
|
uint16_t header_size;
|
|
uint16_t program_table_entry_size;
|
|
uint16_t num_program_headers;
|
|
uint16_t section_table_entry_size;
|
|
uint16_t num_section_headers;
|
|
uint16_t shstrtab_section_index;
|
|
};
|
|
|
|
enum class ProgramHeaderType : uint32_t {
|
|
PT_NULL = 0,
|
|
PT_LOAD = 1,
|
|
PT_DYNAMIC = 2,
|
|
PT_NOTE = 4,
|
|
PT_PHDR = 6,
|
|
PT_GNU_STACK = 0x6474e551,
|
|
};
|
|
|
|
struct ProgramHeader {
|
|
#if defined(TARGET_ARCH_IS_32_BIT)
|
|
ProgramHeaderType type;
|
|
uint32_t file_offset;
|
|
uint32_t memory_offset;
|
|
uint32_t physical_memory_offset;
|
|
uint32_t file_size;
|
|
uint32_t memory_size;
|
|
uint32_t flags;
|
|
uint32_t alignment;
|
|
#else
|
|
ProgramHeaderType type;
|
|
uint32_t flags;
|
|
uint64_t file_offset;
|
|
uint64_t memory_offset;
|
|
uint64_t physical_memory_offset;
|
|
uint64_t file_size;
|
|
uint64_t memory_size;
|
|
uint64_t alignment;
|
|
#endif
|
|
};
|
|
|
|
enum class SectionHeaderType : uint32_t {
|
|
SHT_NULL = 0,
|
|
SHT_PROGBITS = 1,
|
|
SHT_SYMTAB = 2,
|
|
SHT_STRTAB = 3,
|
|
SHT_HASH = 5,
|
|
SHT_NOTE = 7,
|
|
SHT_NOBITS = 8,
|
|
SHT_DYNAMIC = 6,
|
|
SHT_DYNSYM = 11,
|
|
};
|
|
|
|
struct SectionHeader {
|
|
#if defined(TARGET_ARCH_IS_32_BIT)
|
|
uint32_t name;
|
|
SectionHeaderType type;
|
|
uint32_t flags;
|
|
uint32_t memory_offset;
|
|
uint32_t file_offset;
|
|
uint32_t file_size;
|
|
uint32_t link;
|
|
uint32_t info;
|
|
uint32_t alignment;
|
|
uint32_t entry_size;
|
|
#else
|
|
uint32_t name;
|
|
SectionHeaderType type;
|
|
uint64_t flags;
|
|
uint64_t memory_offset;
|
|
uint64_t file_offset;
|
|
uint64_t file_size;
|
|
uint32_t link;
|
|
uint32_t info;
|
|
uint64_t alignment;
|
|
uint64_t entry_size;
|
|
#endif
|
|
};
|
|
|
|
struct Symbol {
|
|
#if defined(TARGET_ARCH_IS_32_BIT)
|
|
uint32_t name;
|
|
uint32_t value;
|
|
uint32_t size;
|
|
uint8_t info;
|
|
uint8_t other; // Reserved by ELF.
|
|
uint16_t section;
|
|
#else
|
|
uint32_t name;
|
|
uint8_t info;
|
|
uint8_t other; // Reserved by ELF.
|
|
uint16_t section;
|
|
uint64_t value;
|
|
uint64_t size;
|
|
#endif
|
|
};
|
|
|
|
enum class DynamicEntryType : uint32_t {
|
|
DT_NULL = 0,
|
|
DT_HASH = 4,
|
|
DT_STRTAB = 5,
|
|
DT_SYMTAB = 6,
|
|
DT_STRSZ = 10,
|
|
DT_SYMENT = 11,
|
|
};
|
|
|
|
struct DynamicEntry {
|
|
#if defined(TARGET_ARCH_IS_32_BIT)
|
|
uint32_t tag;
|
|
uint32_t value;
|
|
#else
|
|
uint64_t tag;
|
|
uint64_t value;
|
|
#endif
|
|
};
|
|
|
|
enum class NoteType : uint32_t {
|
|
NT_GNU_BUILD_ID = 3,
|
|
};
|
|
|
|
struct Note {
|
|
uint32_t name_size;
|
|
uint32_t description_size;
|
|
NoteType type;
|
|
uint8_t data[];
|
|
};
|
|
|
|
#pragma pack(pop)
|
|
|
|
static constexpr intptr_t ELFCLASS32 = 1;
|
|
static constexpr intptr_t ELFCLASS64 = 2;
|
|
|
|
static constexpr intptr_t EI_DATA = 5;
|
|
static constexpr intptr_t ELFDATA2LSB = 1;
|
|
|
|
static constexpr intptr_t ELFOSABI_SYSV = 0;
|
|
|
|
static constexpr intptr_t ET_DYN = 3;
|
|
|
|
static constexpr intptr_t EF_ARM_ABI_FLOAT_HARD = 0x00000400;
|
|
static constexpr intptr_t EF_ARM_ABI_FLOAT_SOFT = 0x00000200;
|
|
static constexpr intptr_t EF_ARM_ABI = 0x05000000;
|
|
|
|
static constexpr intptr_t EM_386 = 3;
|
|
static constexpr intptr_t EM_ARM = 40;
|
|
static constexpr intptr_t EM_X86_64 = 62;
|
|
static constexpr intptr_t EM_AARCH64 = 183;
|
|
static constexpr intptr_t EM_RISCV = 243;
|
|
|
|
static constexpr intptr_t EV_CURRENT = 1;
|
|
|
|
static constexpr intptr_t PF_X = 1;
|
|
static constexpr intptr_t PF_W = 2;
|
|
static constexpr intptr_t PF_R = 4;
|
|
|
|
static constexpr intptr_t SHF_WRITE = 0x1;
|
|
static constexpr intptr_t SHF_ALLOC = 0x2;
|
|
static constexpr intptr_t SHF_EXECINSTR = 0x4;
|
|
|
|
static constexpr intptr_t SHN_UNDEF = 0;
|
|
|
|
static constexpr intptr_t STN_UNDEF = 0;
|
|
|
|
static constexpr intptr_t STB_LOCAL = 0;
|
|
static constexpr intptr_t STB_GLOBAL = 1;
|
|
|
|
static constexpr intptr_t STT_NOTYPE = 0;
|
|
static constexpr intptr_t STT_OBJECT = 1; // I.e., data.
|
|
static constexpr intptr_t STT_FUNC = 2;
|
|
static constexpr intptr_t STT_SECTION = 3;
|
|
|
|
static constexpr const char ELF_NOTE_GNU[] = "GNU";
|
|
|
|
// Creates symbol info from the given STB and STT values.
|
|
constexpr decltype(Symbol::info) SymbolInfo(intptr_t binding, intptr_t type) {
|
|
// Take the low nibble of each value in case, though the upper bits should
|
|
// all be zero as long as STB/STT constants are used.
|
|
return (binding & 0xf) << 4 | (type & 0xf);
|
|
}
|
|
|
|
// Retrieves the STB binding value for the given symbol info.
|
|
constexpr intptr_t SymbolBinding(const decltype(Symbol::info) info) {
|
|
return (info >> 4) & 0xf;
|
|
}
|
|
|
|
// Retrieves the STT type value for the given symbol info.
|
|
constexpr intptr_t SymbolType(const decltype(Symbol::info) info) {
|
|
return info & 0xf;
|
|
}
|
|
|
|
} // namespace elf
|
|
} // namespace dart
|
|
|
|
#endif // RUNTIME_PLATFORM_ELF_H_
|