mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-03-01 14:58:18 +00:00

Integrating MTE globals on Android revealed a lot of cases where libraries are built as both archives and DSOs, and they're linked into fully static and dynamic executables respectively. MTE globals doesn't work for fully static executables. They need a dynamic loader to process the special R_AARCH64_RELATIVE relocation semantics with the encoded offset. Fully static executables that had out-of-bounds derived symbols (like 'int* foo_end = foo[16]') crash under MTE globals w/ static executables. So, LLD in its current form simply errors out when you try and compile a fully static executable that has a single MTE global variable in it. It seems like a much better idea to simply have LLD not do the special work for MTE globals in fully static contexts, and to drop any unnecessary metadata. This means that you can build archives with MTE globals and link them into both fully-static and dynamic executables.
64 lines
1.7 KiB
C++
64 lines
1.7 KiB
C++
//===- Writer.h -------------------------------------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLD_ELF_WRITER_H
|
|
#define LLD_ELF_WRITER_H
|
|
|
|
#include "Config.h"
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include <cstdint>
|
|
|
|
namespace lld::elf {
|
|
class InputFile;
|
|
class OutputSection;
|
|
void copySectionsIntoPartitions();
|
|
template <class ELFT> void createSyntheticSections();
|
|
template <class ELFT> void writeResult();
|
|
|
|
// This describes a program header entry.
|
|
// Each contains type, access flags and range of output sections that will be
|
|
// placed in it.
|
|
struct PhdrEntry {
|
|
PhdrEntry(unsigned type, unsigned flags)
|
|
: p_align(type == llvm::ELF::PT_LOAD ? config->maxPageSize : 0),
|
|
p_type(type), p_flags(flags) {}
|
|
void add(OutputSection *sec);
|
|
|
|
uint64_t p_paddr = 0;
|
|
uint64_t p_vaddr = 0;
|
|
uint64_t p_memsz = 0;
|
|
uint64_t p_filesz = 0;
|
|
uint64_t p_offset = 0;
|
|
uint32_t p_align = 0;
|
|
uint32_t p_type = 0;
|
|
uint32_t p_flags = 0;
|
|
|
|
OutputSection *firstSec = nullptr;
|
|
OutputSection *lastSec = nullptr;
|
|
bool hasLMA = false;
|
|
|
|
uint64_t lmaOffset = 0;
|
|
};
|
|
|
|
void addReservedSymbols();
|
|
bool includeInSymtab(const Symbol &b);
|
|
|
|
template <class ELFT> uint32_t calcMipsEFlags();
|
|
|
|
uint8_t getMipsFpAbiFlag(uint8_t oldFlag, uint8_t newFlag,
|
|
llvm::StringRef fileName);
|
|
|
|
bool isMipsN32Abi(const InputFile *f);
|
|
bool isMicroMips();
|
|
bool isMipsR6();
|
|
|
|
bool canHaveMemtagGlobals();
|
|
} // namespace lld::elf
|
|
|
|
#endif
|