6f83a5ff9b
For proper crashpad integration, we need to generate a build ID, as the build ID generated by crashpad if there is not one will be a simple XOR of the first text page, which rarely changes for Dart snapshots. Assembly snapshots already have a build ID included by the assembler, so we currently only do this for ELF snapshots. Currently the build ID is a 128-bit hash value that is four separate 32-bit hash values concatenated together. Those hash values come from the contents of the VM and isolate .text and .rodata sections. This change also contains work to separate out the concepts of sections and segments in the ELF builder. Now, consecutive allocated sections with the same write and execute flags are combined into a single PT_LOAD segment when possible, which reduces the padding needed to ensure that segments start on page boundaries in ELF snapshots. Bug: https://github.com/dart-lang/sdk/issues/42020 Change-Id: I42a837dae665a3902d881b8d151b49ede87d6c67 Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-linux-release-x64-try,vm-kernel-precomp-linux-product-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-release-simarm_x64-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/150625 Commit-Queue: Tess Strickland <sstrickl@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com>
202 lines
4.1 KiB
C++
202 lines
4.1 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,
|
|
};
|
|
|
|
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 const intptr_t EI_DATA = 5;
|
|
static const intptr_t ELFDATA2LSB = 1;
|
|
|
|
static const intptr_t ELFOSABI_SYSV = 0;
|
|
|
|
static const 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 const intptr_t EV_CURRENT = 1;
|
|
|
|
static const intptr_t PF_X = 1;
|
|
static const intptr_t PF_W = 2;
|
|
static const intptr_t PF_R = 4;
|
|
|
|
static const intptr_t SHF_WRITE = 0x1;
|
|
static const intptr_t SHF_ALLOC = 0x2;
|
|
static const intptr_t SHF_EXECINSTR = 0x4;
|
|
|
|
static const intptr_t SHN_UNDEF = 0;
|
|
|
|
static const intptr_t STN_UNDEF = 0;
|
|
|
|
static const intptr_t STB_LOCAL = 0;
|
|
static const intptr_t STB_GLOBAL = 1;
|
|
|
|
static const intptr_t STT_OBJECT = 1; // I.e., data.
|
|
static const intptr_t STT_FUNC = 2;
|
|
static const intptr_t STT_SECTION = 3;
|
|
|
|
static constexpr const char* ELF_NOTE_GNU = "GNU";
|
|
|
|
} // namespace elf
|
|
} // namespace dart
|
|
|
|
#endif // RUNTIME_PLATFORM_ELF_H_
|