Vendor import of lld release_40 branch r292009:

https://llvm.org/svn/llvm-project/lld/branches/release_40@292009
This commit is contained in:
Dimitry Andric 2017-01-14 15:39:25 +00:00
parent b047fead11
commit 1eafc0458f
119 changed files with 1641 additions and 1183 deletions

View File

@ -12,6 +12,7 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
endif()
execute_process(COMMAND "${LLVM_CONFIG_PATH}" "--obj-root" "--includedir"
"--cmakedir"
RESULT_VARIABLE HAD_ERROR
OUTPUT_VARIABLE LLVM_CONFIG_OUTPUT
OUTPUT_STRIP_TRAILING_WHITESPACE)
@ -23,12 +24,12 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
list(GET LLVM_CONFIG_OUTPUT 0 OBJ_ROOT)
list(GET LLVM_CONFIG_OUTPUT 1 MAIN_INCLUDE_DIR)
list(GET LLVM_CONFIG_OUTPUT 2 LLVM_CMAKE_PATH)
set(LLVM_OBJ_ROOT ${OBJ_ROOT} CACHE PATH "path to LLVM build tree")
set(LLVM_MAIN_INCLUDE_DIR ${MAIN_INCLUDE_DIR} CACHE PATH "path to llvm/include")
file(TO_CMAKE_PATH ${LLVM_OBJ_ROOT} LLVM_BINARY_DIR)
set(LLVM_CMAKE_PATH "${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}/cmake/llvm")
if(NOT EXISTS "${LLVM_CMAKE_PATH}/LLVMConfig.cmake")
message(FATAL_ERROR "LLVMConfig.cmake not found")

View File

@ -14,8 +14,12 @@
#include "SymbolTable.h"
#include "Symbols.h"
#include "llvm/DebugInfo/CodeView/CVDebugRecord.h"
#include "llvm/DebugInfo/CodeView/CVTypeDumper.h"
#include "llvm/DebugInfo/CodeView/SymbolDumper.h"
#include "llvm/DebugInfo/CodeView/TypeDumper.h"
#include "llvm/DebugInfo/CodeView/TypeDatabase.h"
#include "llvm/DebugInfo/CodeView/TypeDumpVisitor.h"
#include "llvm/DebugInfo/CodeView/TypeStreamMerger.h"
#include "llvm/DebugInfo/CodeView/TypeTableBuilder.h"
#include "llvm/DebugInfo/MSF/ByteStream.h"
#include "llvm/DebugInfo/MSF/MSFBuilder.h"
#include "llvm/DebugInfo/MSF/MSFCommon.h"
@ -61,44 +65,75 @@ static SectionChunk *findByName(std::vector<SectionChunk *> &Sections,
return nullptr;
}
static ArrayRef<uint8_t> getDebugT(ObjectFile *File) {
SectionChunk *Sec = findByName(File->getDebugChunks(), ".debug$T");
static ArrayRef<uint8_t> getDebugSection(ObjectFile *File, StringRef SecName) {
SectionChunk *Sec = findByName(File->getDebugChunks(), SecName);
if (!Sec)
return {};
// First 4 bytes are section magic.
ArrayRef<uint8_t> Data = Sec->getContents();
if (Data.size() < 4)
fatal(".debug$T too short");
fatal(SecName + " too short");
if (read32le(Data.data()) != COFF::DEBUG_SECTION_MAGIC)
fatal(".debug$T has an invalid magic");
fatal(SecName + " has an invalid magic");
return Data.slice(4);
}
// Merge .debug$T sections and returns it.
static std::vector<uint8_t> mergeDebugT(SymbolTable *Symtab) {
ScopedPrinter W(outs());
// Visit all .debug$T sections to add them to Builder.
codeview::TypeTableBuilder Builder(BAlloc);
for (ObjectFile *File : Symtab->ObjectFiles) {
ArrayRef<uint8_t> Data = getDebugSection(File, ".debug$T");
if (Data.empty())
continue;
msf::ByteStream Stream(Data);
codeview::CVTypeArray Types;
msf::StreamReader Reader(Stream);
if (auto EC = Reader.readArray(Types, Reader.getLength()))
fatal(EC, "Reader::readArray failed");
if (!codeview::mergeTypeStreams(Builder, Types))
fatal("codeview::mergeTypeStreams failed");
}
// Construct section contents.
std::vector<uint8_t> V;
Builder.ForEachRecord([&](TypeIndex TI, ArrayRef<uint8_t> Rec) {
V.insert(V.end(), Rec.begin(), Rec.end());
});
return V;
}
static void dumpDebugT(ScopedPrinter &W, ObjectFile *File) {
ArrayRef<uint8_t> Data = getDebugT(File);
ListScope LS(W, "DebugT");
ArrayRef<uint8_t> Data = getDebugSection(File, ".debug$T");
if (Data.empty())
return;
msf::ByteStream Stream(Data);
CVTypeDumper TypeDumper(&W, false);
if (auto EC = TypeDumper.dump(Data))
TypeDatabase TDB;
TypeDumpVisitor TDV(TDB, &W, false);
CVTypeDumper TypeDumper(TDB);
if (auto EC = TypeDumper.dump(Data, TDV))
fatal(EC, "CVTypeDumper::dump failed");
}
static void dumpDebugS(ScopedPrinter &W, ObjectFile *File) {
SectionChunk *Sec = findByName(File->getDebugChunks(), ".debug$S");
if (!Sec)
ListScope LS(W, "DebugS");
ArrayRef<uint8_t> Data = getDebugSection(File, ".debug$S");
if (Data.empty())
return;
msf::ByteStream Stream(Sec->getContents());
msf::ByteStream Stream(Data);
CVSymbolArray Symbols;
msf::StreamReader Reader(Stream);
if (auto EC = Reader.readArray(Symbols, Reader.getLength()))
fatal(EC, "StreamReader.readArray<CVSymbolArray> failed");
CVTypeDumper TypeDumper(&W, false);
CVSymbolDumper SymbolDumper(W, TypeDumper, nullptr, false);
TypeDatabase TDB;
CVSymbolDumper SymbolDumper(W, TDB, nullptr, false);
if (auto EC = SymbolDumper.dump(Symbols))
fatal(EC, "CVSymbolDumper::dump failed");
}
@ -113,21 +148,15 @@ static void dumpCodeView(SymbolTable *Symtab) {
}
}
static void addTypeInfo(SymbolTable *Symtab,
pdb::TpiStreamBuilder &TpiBuilder) {
for (ObjectFile *File : Symtab->ObjectFiles) {
ArrayRef<uint8_t> Data = getDebugT(File);
if (Data.empty())
continue;
msf::ByteStream Stream(Data);
codeview::CVTypeArray Records;
msf::StreamReader Reader(Stream);
if (auto EC = Reader.readArray(Records, Reader.getLength()))
fatal(EC, "Reader.readArray failed");
for (const codeview::CVType &Rec : Records)
TpiBuilder.addTypeRecord(Rec);
}
static void addTypeInfo(pdb::TpiStreamBuilder &TpiBuilder,
ArrayRef<uint8_t> Data) {
msf::ByteStream Stream(Data);
codeview::CVTypeArray Records;
msf::StreamReader Reader(Stream);
if (auto EC = Reader.readArray(Records, Reader.getLength()))
fatal(EC, "Reader.readArray failed");
for (const codeview::CVType &Rec : Records)
TpiBuilder.addTypeRecord(Rec);
}
// Creates a PDB file.
@ -162,8 +191,11 @@ void coff::createPDB(StringRef Path, SymbolTable *Symtab,
// Add an empty TPI stream.
auto &TpiBuilder = Builder.getTpiBuilder();
TpiBuilder.setVersionHeader(pdb::PdbTpiV80);
if (Config->DebugPdb)
addTypeInfo(Symtab, TpiBuilder);
std::vector<uint8_t> TpiData;
if (Config->DebugPdb) {
TpiData = mergeDebugT(Symtab);
addTypeInfo(TpiBuilder, TpiData);
}
// Add an empty IPI stream.
auto &IpiBuilder = Builder.getIpiBuilder();

View File

@ -24,6 +24,7 @@
#include "lld/Driver/Driver.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Object/Decompressor.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/TarWriter.h"
@ -815,7 +816,7 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &Args) {
[](InputSectionBase<ELFT> *S) {
if (!S->Live)
return;
if (S->isCompressed())
if (Decompressor::isCompressedELFSection(S->Flags, S->Name))
S->uncompress();
if (auto *MS = dyn_cast<MergeInputSection<ELFT>>(S))
MS->splitIntoPieces();

View File

@ -103,4 +103,8 @@ void elf::fatal(std::error_code EC, const Twine &Prefix) {
fatal(Prefix + ": " + EC.message());
}
void elf::fatal(Error &E, const Twine &Prefix) {
fatal(Prefix + ": " + llvm::toString(std::move(E)));
}
} // namespace lld

View File

@ -44,6 +44,7 @@ void error(std::error_code EC, const Twine &Prefix);
LLVM_ATTRIBUTE_NORETURN void exitLld(int Val);
LLVM_ATTRIBUTE_NORETURN void fatal(const Twine &Msg);
LLVM_ATTRIBUTE_NORETURN void fatal(std::error_code EC, const Twine &Prefix);
LLVM_ATTRIBUTE_NORETURN void fatal(Error &E, const Twine &Prefix);
// check() functions are convenient functions to strip errors
// from error-or-value objects.
@ -55,11 +56,7 @@ template <class T> T check(ErrorOr<T> E) {
template <class T> T check(Expected<T> E) {
if (!E)
handleAllErrors(std::move(E.takeError()),
[](llvm::ErrorInfoBase &EIB) -> Error {
fatal(EIB.message());
return Error::success();
});
fatal(llvm::toString(E.takeError()));
return std::move(*E);
}

View File

@ -857,8 +857,8 @@ template <class ELFT> void BinaryFile::parse() {
StringRef EndName = Saver.save(Twine(Filename) + "_end");
StringRef SizeName = Saver.save(Twine(Filename) + "_size");
auto *Section =
make<InputSection<ELFT>>(SHF_ALLOC, SHT_PROGBITS, 8, Data, ".data");
auto *Section = make<InputSection<ELFT>>(SHF_ALLOC | SHF_WRITE, SHT_PROGBITS,
8, Data, ".data");
Sections.push_back(Section);
elf::Symtab<ELFT>::X->addRegular(StartName, STV_DEFAULT, STT_OBJECT, 0, 0,

View File

@ -19,6 +19,7 @@
#include "SyntheticSections.h"
#include "Target.h"
#include "Thunks.h"
#include "llvm/Object/Decompressor.h"
#include "llvm/Support/Compression.h"
#include "llvm/Support/Endian.h"
#include <mutex>
@ -35,7 +36,10 @@ using namespace lld::elf;
// Returns a string to construct an error message.
template <class ELFT>
std::string lld::toString(const InputSectionBase<ELFT> *Sec) {
return (Sec->getFile()->getName() + ":(" + Sec->Name + ")").str();
// File can be absent if section is synthetic.
std::string FileName =
Sec->getFile() ? Sec->getFile()->getName() : "<internal>";
return (FileName + ":(" + Sec->Name + ")").str();
}
template <class ELFT>
@ -102,11 +106,6 @@ template <class ELFT> size_t InputSectionBase<ELFT>::getSize() const {
return Data.size();
}
// Returns a string for an error message.
template <class SectionT> static std::string getName(SectionT *Sec) {
return (Sec->getFile()->getName() + ":(" + Sec->Name + ")").str();
}
template <class ELFT>
typename ELFT::uint InputSectionBase<ELFT>::getOffset(uintX_t Offset) const {
switch (kind()) {
@ -128,71 +127,23 @@ typename ELFT::uint InputSectionBase<ELFT>::getOffset(uintX_t Offset) const {
llvm_unreachable("invalid section kind");
}
template <class ELFT> bool InputSectionBase<ELFT>::isCompressed() const {
return (Flags & SHF_COMPRESSED) || Name.startswith(".zdebug");
}
// Returns compressed data and its size when uncompressed.
template <class ELFT>
std::pair<ArrayRef<uint8_t>, uint64_t>
InputSectionBase<ELFT>::getElfCompressedData(ArrayRef<uint8_t> Data) {
// Compressed section with Elf_Chdr is the ELF standard.
if (Data.size() < sizeof(Elf_Chdr))
fatal(toString(this) + ": corrupted compressed section");
auto *Hdr = reinterpret_cast<const Elf_Chdr *>(Data.data());
if (Hdr->ch_type != ELFCOMPRESS_ZLIB)
fatal(toString(this) + ": unsupported compression type");
return {Data.slice(sizeof(*Hdr)), Hdr->ch_size};
}
// Returns compressed data and its size when uncompressed.
template <class ELFT>
std::pair<ArrayRef<uint8_t>, uint64_t>
InputSectionBase<ELFT>::getRawCompressedData(ArrayRef<uint8_t> Data) {
// Compressed sections without Elf_Chdr header contain this header
// instead. This is a GNU extension.
struct ZlibHeader {
char Magic[4]; // Should be "ZLIB"
char Size[8]; // Uncompressed size in big-endian
};
if (Data.size() < sizeof(ZlibHeader))
fatal(toString(this) + ": corrupted compressed section");
auto *Hdr = reinterpret_cast<const ZlibHeader *>(Data.data());
if (memcmp(Hdr->Magic, "ZLIB", 4))
fatal(toString(this) + ": broken ZLIB-compressed section");
return {Data.slice(sizeof(*Hdr)), read64be(Hdr->Size)};
}
// Uncompress section contents. Note that this function is called
// from parallel_for_each, so it must be thread-safe.
template <class ELFT> void InputSectionBase<ELFT>::uncompress() {
if (!zlib::isAvailable())
fatal(toString(this) +
": build lld with zlib to enable compressed sections support");
Decompressor Decompressor = check(Decompressor::create(
Name, toStringRef(Data), ELFT::TargetEndianness == llvm::support::little,
ELFT::Is64Bits));
// This section is compressed. Here we decompress it. Ideally, all
// compressed sections have SHF_COMPRESSED bit and their contents
// start with headers of Elf_Chdr type. However, sections whose
// names start with ".zdebug_" don't have the bit and contains a raw
// ZLIB-compressed data (which is a bad thing because section names
// shouldn't be significant in ELF.) We need to be able to read both.
ArrayRef<uint8_t> Buf; // Compressed data
size_t Size; // Uncompressed size
if (Flags & SHF_COMPRESSED)
std::tie(Buf, Size) = getElfCompressedData(Data);
else
std::tie(Buf, Size) = getRawCompressedData(Data);
// Uncompress Buf.
size_t Size = Decompressor.getDecompressedSize();
char *OutputBuf;
{
static std::mutex Mu;
std::lock_guard<std::mutex> Lock(Mu);
OutputBuf = BAlloc.Allocate<char>(Size);
}
if (zlib::uncompress(toStringRef(Buf), OutputBuf, Size) != zlib::StatusOK)
fatal(toString(this) + ": error while uncompressing section");
if (Error E = Decompressor.decompress({OutputBuf, Size}))
fatal(E, toString(this));
Data = ArrayRef<uint8_t>((uint8_t *)OutputBuf, Size);
}

View File

@ -138,22 +138,12 @@ public:
// section.
uintX_t getOffset(uintX_t Offset) const;
// ELF supports ZLIB-compressed section.
// Returns true if the section is compressed.
bool isCompressed() const;
void uncompress();
// Returns a source location string. Used to construct an error message.
std::string getLocation(uintX_t Offset);
void relocate(uint8_t *Buf, uint8_t *BufEnd);
private:
std::pair<ArrayRef<uint8_t>, uint64_t>
getElfCompressedData(ArrayRef<uint8_t> Data);
std::pair<ArrayRef<uint8_t>, uint64_t>
getRawCompressedData(ArrayRef<uint8_t> Data);
};
// SectionPiece represents a piece of splittable section contents.

View File

@ -1014,6 +1014,7 @@ private:
void readAnonymousDeclaration();
void readVersionDeclaration(StringRef VerStr);
std::vector<SymbolVersion> readSymbols();
void readLocals();
ScriptConfiguration &Opt = *ScriptConfig;
bool IsUnderSysroot;
@ -1861,19 +1862,24 @@ void ScriptParser::readAnonymousDeclaration() {
if (consume("global:") || peek() != "local:")
Config->VersionScriptGlobals = readSymbols();
// Next, read local symbols.
if (consume("local:")) {
if (consume("*")) {
Config->DefaultSymbolVersion = VER_NDX_LOCAL;
expect(";");
} else {
setError("local symbol list for anonymous version is not supported");
}
}
readLocals();
expect("}");
expect(";");
}
void ScriptParser::readLocals() {
if (!consume("local:"))
return;
std::vector<SymbolVersion> Locals = readSymbols();
for (SymbolVersion V : Locals) {
if (V.Name == "*") {
Config->DefaultSymbolVersion = VER_NDX_LOCAL;
continue;
}
Config->VersionScriptLocals.push_back(V);
}
}
// Reads a list of symbols, e.g. "VerStr { global: foo; bar; local: *; };".
void ScriptParser::readVersionDeclaration(StringRef VerStr) {
// Identifiers start at 2 because 0 and 1 are reserved
@ -1885,16 +1891,7 @@ void ScriptParser::readVersionDeclaration(StringRef VerStr) {
if (consume("global:") || peek() != "local:")
Config->VersionDefinitions.back().Globals = readSymbols();
// Read local symbols.
if (consume("local:")) {
if (consume("*")) {
Config->DefaultSymbolVersion = VER_NDX_LOCAL;
expect(";");
} else {
for (SymbolVersion V : readSymbols())
Config->VersionScriptLocals.push_back(V);
}
}
readLocals();
expect("}");
// Each version may have a parent version. For example, "Ver2"

View File

@ -636,7 +636,12 @@ OutputSectionFactory<ELFT>::create(const SectionKey &Key,
if (getIncompatibleFlags(Sec->Flags) != getIncompatibleFlags(C->Flags))
error("Section has flags incompatible with others with the same name " +
toString(C));
if (Sec->Type != C->Type)
// Convert notbits to progbits if they are mixed. This happens is some
// linker scripts.
if (Sec->Type == SHT_NOBITS && C->Type == SHT_PROGBITS)
Sec->Type = SHT_PROGBITS;
if (Sec->Type != C->Type &&
!(Sec->Type == SHT_PROGBITS && C->Type == SHT_NOBITS))
error("Section has different type from others with the same name " +
toString(C));
Sec->Flags |= Flags;

View File

@ -206,6 +206,7 @@ template <class ELFT> struct Out {
static uint8_t First;
static EhOutputSection<ELFT> *EhFrame;
static OutputSection<ELFT> *Bss;
static OutputSection<ELFT> *BssRelRo;
static OutputSectionBase *Opd;
static uint8_t *OpdBuf;
static PhdrEntry *TlsPhdr;
@ -252,6 +253,7 @@ template <class ELFT> uint64_t getHeaderSize() {
template <class ELFT> uint8_t Out<ELFT>::First;
template <class ELFT> EhOutputSection<ELFT> *Out<ELFT>::EhFrame;
template <class ELFT> OutputSection<ELFT> *Out<ELFT>::Bss;
template <class ELFT> OutputSection<ELFT> *Out<ELFT>::BssRelRo;
template <class ELFT> OutputSectionBase *Out<ELFT>::Opd;
template <class ELFT> uint8_t *Out<ELFT>::OpdBuf;
template <class ELFT> PhdrEntry *Out<ELFT>::TlsPhdr;

View File

@ -399,7 +399,21 @@ template <class ELFT> static uint32_t getAlignment(SharedSymbol<ELFT> *SS) {
return 1 << TrailingZeros;
}
// Reserve space in .bss for copy relocation.
template <class ELFT> static bool isReadOnly(SharedSymbol<ELFT> *SS) {
typedef typename ELFT::uint uintX_t;
typedef typename ELFT::Phdr Elf_Phdr;
// Determine if the symbol is read-only by scanning the DSO's program headers.
uintX_t Value = SS->Sym.st_value;
for (const Elf_Phdr &Phdr : check(SS->file()->getObj().program_headers()))
if ((Phdr.p_type == ELF::PT_LOAD || Phdr.p_type == ELF::PT_GNU_RELRO) &&
!(Phdr.p_flags & ELF::PF_W) && Value >= Phdr.p_vaddr &&
Value < Phdr.p_vaddr + Phdr.p_memsz)
return true;
return false;
}
// Reserve space in .bss or .bss.rel.ro for copy relocation.
template <class ELFT> static void addCopyRelSymbol(SharedSymbol<ELFT> *SS) {
typedef typename ELFT::uint uintX_t;
typedef typename ELFT::Sym Elf_Sym;
@ -409,10 +423,16 @@ template <class ELFT> static void addCopyRelSymbol(SharedSymbol<ELFT> *SS) {
if (SymSize == 0)
fatal("cannot create a copy relocation for symbol " + toString(*SS));
// See if this symbol is in a read-only segment. If so, preserve the symbol's
// memory protection by reserving space in the .bss.rel.ro section.
bool IsReadOnly = isReadOnly(SS);
OutputSection<ELFT> *CopySec =
IsReadOnly ? Out<ELFT>::BssRelRo : Out<ELFT>::Bss;
uintX_t Alignment = getAlignment(SS);
uintX_t Off = alignTo(Out<ELFT>::Bss->Size, Alignment);
Out<ELFT>::Bss->Size = Off + SymSize;
Out<ELFT>::Bss->updateAlignment(Alignment);
uintX_t Off = alignTo(CopySec->Size, Alignment);
CopySec->Size = Off + SymSize;
CopySec->updateAlignment(Alignment);
uintX_t Shndx = SS->Sym.st_shndx;
uintX_t Value = SS->Sym.st_value;
// Look through the DSO's dynamic symbol table for aliases and create a
@ -425,12 +445,12 @@ template <class ELFT> static void addCopyRelSymbol(SharedSymbol<ELFT> *SS) {
Symtab<ELFT>::X->find(check(S.getName(SS->file()->getStringTable()))));
if (!Alias)
continue;
Alias->OffsetInBss = Off;
Alias->CopyIsInBssRelRo = IsReadOnly;
Alias->CopyOffset = Off;
Alias->NeedsCopyOrPltAddr = true;
Alias->symbol()->IsUsedInRegularObj = true;
}
In<ELFT>::RelaDyn->addReloc(
{Target->CopyRel, Out<ELFT>::Bss, SS->OffsetInBss, false, SS, 0});
In<ELFT>::RelaDyn->addReloc({Target->CopyRel, CopySec, Off, false, SS, 0});
}
template <class ELFT>

View File

@ -605,19 +605,16 @@ SymbolTable<ELFT>::findAllByVersion(SymbolVersion Ver) {
// If there's only one anonymous version definition in a version
// script file, the script does not actually define any symbol version,
// but just specifies symbols visibilities. We assume that the script was
// in the form of { global: foo; bar; local *; }. So, local is default.
// In this function, we make specified symbols global.
// but just specifies symbols visibilities.
template <class ELFT> void SymbolTable<ELFT>::handleAnonymousVersion() {
for (SymbolVersion &Ver : Config->VersionScriptGlobals) {
if (Ver.HasWildcard) {
for (SymbolBody *B : findAllByVersion(Ver))
B->symbol()->VersionId = VER_NDX_GLOBAL;
continue;
}
for (SymbolBody *B : findByVersion(Ver))
B->symbol()->VersionId = VER_NDX_GLOBAL;
}
for (SymbolVersion &Ver : Config->VersionScriptGlobals)
assignExactVersion(Ver, VER_NDX_GLOBAL, "global");
for (SymbolVersion &Ver : Config->VersionScriptGlobals)
assignWildcardVersion(Ver, VER_NDX_GLOBAL);
for (SymbolVersion &Ver : Config->VersionScriptLocals)
assignExactVersion(Ver, VER_NDX_LOCAL, "local");
for (SymbolVersion &Ver : Config->VersionScriptLocals)
assignWildcardVersion(Ver, VER_NDX_LOCAL);
}
// Set symbol versions to symbols. This function handles patterns
@ -673,10 +670,7 @@ template <class ELFT> void SymbolTable<ELFT>::scanVersionScript() {
Sym->body()->parseSymbolVersion();
// Handle edge cases first.
if (!Config->VersionScriptGlobals.empty()) {
handleAnonymousVersion();
return;
}
handleAnonymousVersion();
if (Config->VersionDefinitions.empty())
return;
@ -687,8 +681,6 @@ template <class ELFT> void SymbolTable<ELFT>::scanVersionScript() {
// First, we assign versions to exact matching symbols,
// i.e. version definitions not containing any glob meta-characters.
for (SymbolVersion &Ver : Config->VersionScriptLocals)
assignExactVersion(Ver, VER_NDX_LOCAL, "local");
for (VersionDefinition &V : Config->VersionDefinitions)
for (SymbolVersion &Ver : V.Globals)
assignExactVersion(Ver, V.Id, V.Name);
@ -697,8 +689,6 @@ template <class ELFT> void SymbolTable<ELFT>::scanVersionScript() {
// i.e. version definitions containing glob meta-characters.
// Note that because the last match takes precedence over previous matches,
// we iterate over the definitions in the reverse order.
for (SymbolVersion &Ver : Config->VersionScriptLocals)
assignWildcardVersion(Ver, VER_NDX_LOCAL);
for (VersionDefinition &V : llvm::reverse(Config->VersionDefinitions))
for (SymbolVersion &Ver : V.Globals)
assignWildcardVersion(Ver, V.Id);

View File

@ -81,7 +81,7 @@ static typename ELFT::uint getSymVA(const SymbolBody &Body,
return 0;
if (SS.isFunc())
return Body.getPltVA<ELFT>();
return Out<ELFT>::Bss->Addr + SS.OffsetInBss;
return SS.getBssSectionForCopy()->Addr + SS.CopyOffset;
}
case SymbolBody::UndefinedKind:
return 0;
@ -97,7 +97,8 @@ SymbolBody::SymbolBody(Kind K, StringRefZ Name, bool IsLocal, uint8_t StOther,
uint8_t Type)
: SymbolKind(K), NeedsCopyOrPltAddr(false), IsLocal(IsLocal),
IsInGlobalMipsGot(false), Is32BitMipsGot(false), IsInIplt(false),
IsInIgot(false), Type(Type), StOther(StOther), Name(Name) {}
IsInIgot(false), CopyIsInBssRelRo(false), Type(Type), StOther(StOther),
Name(Name) {}
// Returns true if a symbol can be replaced at load-time by a symbol
// with the same name defined in other ELF executable or DSO.
@ -245,6 +246,12 @@ Undefined<ELFT>::Undefined(StringRefZ Name, bool IsLocal, uint8_t StOther,
this->File = File;
}
template <typename ELFT>
OutputSection<ELFT> *SharedSymbol<ELFT>::getBssSectionForCopy() const {
assert(needsCopy());
return CopyIsInBssRelRo ? Out<ELFT>::BssRelRo : Out<ELFT>::Bss;
}
DefinedCommon::DefinedCommon(StringRef Name, uint64_t Size, uint64_t Alignment,
uint8_t StOther, uint8_t Type, InputFile *File)
: Defined(SymbolBody::DefinedCommonKind, Name, /*IsLocal=*/false, StOther,
@ -287,10 +294,22 @@ InputFile *LazyObject::fetch() {
return createObjectFile(MBRef);
}
bool Symbol::includeInDynsym() const {
uint8_t Symbol::computeBinding() const {
if (Config->Relocatable)
return Binding;
if (Visibility != STV_DEFAULT && Visibility != STV_PROTECTED)
return STB_LOCAL;
if (VersionId == VER_NDX_LOCAL && !body()->isUndefined())
return STB_LOCAL;
if (Config->NoGnuUnique && Binding == STB_GNU_UNIQUE)
return STB_GLOBAL;
return Binding;
}
bool Symbol::includeInDynsym() const {
if (computeBinding() == STB_LOCAL)
return false;
return (ExportDynamic && VersionId != VER_NDX_LOCAL) || body()->isShared() ||
return ExportDynamic || body()->isShared() ||
(body()->isUndefined() && Config->Shared);
}
@ -366,6 +385,11 @@ template class elf::Undefined<ELF32BE>;
template class elf::Undefined<ELF64LE>;
template class elf::Undefined<ELF64BE>;
template class elf::SharedSymbol<ELF32LE>;
template class elf::SharedSymbol<ELF32BE>;
template class elf::SharedSymbol<ELF64LE>;
template class elf::SharedSymbol<ELF64BE>;
template class elf::DefinedRegular<ELF32LE>;
template class elf::DefinedRegular<ELF32BE>;
template class elf::DefinedRegular<ELF64LE>;

View File

@ -123,6 +123,11 @@ public:
// True if this symbol is in the Igot sub-section of the .got.plt or .got.
unsigned IsInIgot : 1;
// True if this is a shared symbol in a read-only segment which requires a
// copy relocation. This causes space for the symbol to be allocated in the
// .bss.rel.ro section.
unsigned CopyIsInBssRelRo : 1;
// The following fields have the same meaning as the ELF symbol attributes.
uint8_t Type; // symbol type
uint8_t StOther; // st_other field value
@ -282,13 +287,15 @@ public:
// This field is a pointer to the symbol's version definition.
const Elf_Verdef *Verdef;
// OffsetInBss is significant only when needsCopy() is true.
uintX_t OffsetInBss = 0;
// CopyOffset is significant only when needsCopy() is true.
uintX_t CopyOffset = 0;
// If non-null the symbol has a Thunk that may be used as an alternative
// destination for callers of this Symbol.
Thunk<ELFT> *ThunkData = nullptr;
bool needsCopy() const { return this->NeedsCopyOrPltAddr && !this->isFunc(); }
OutputSection<ELFT> *getBssSectionForCopy() const;
};
// This class represents a symbol defined in an archive file. It is
@ -413,6 +420,7 @@ struct Symbol {
unsigned InVersionScript : 1;
bool includeInDynsym() const;
uint8_t computeBinding() const;
bool isWeak() const { return Binding == llvm::ELF::STB_WEAK; }
// This field is used to store the Symbol's SymbolBody. This instantiation of

View File

@ -1060,18 +1060,6 @@ static bool sortMipsSymbols(const SymbolBody *L, const SymbolBody *R) {
return L->GotIndex < R->GotIndex;
}
static uint8_t getSymbolBinding(SymbolBody *Body) {
Symbol *S = Body->symbol();
if (Config->Relocatable)
return S->Binding;
uint8_t Visibility = S->Visibility;
if (Visibility != STV_DEFAULT && Visibility != STV_PROTECTED)
return STB_LOCAL;
if (Config->NoGnuUnique && S->Binding == STB_GNU_UNIQUE)
return STB_GLOBAL;
return S->Binding;
}
template <class ELFT> void SymbolTableSection<ELFT>::finalize() {
this->OutSec->Link = this->Link = StrTabSec.OutSec->SectionIndex;
this->OutSec->Info = this->Info = NumLocals + 1;
@ -1085,11 +1073,12 @@ template <class ELFT> void SymbolTableSection<ELFT>::finalize() {
}
if (!StrTabSec.isDynamic()) {
std::stable_sort(Symbols.begin(), Symbols.end(),
[](const SymbolTableEntry &L, const SymbolTableEntry &R) {
return getSymbolBinding(L.Symbol) == STB_LOCAL &&
getSymbolBinding(R.Symbol) != STB_LOCAL;
});
std::stable_sort(
Symbols.begin(), Symbols.end(),
[](const SymbolTableEntry &L, const SymbolTableEntry &R) {
return L.Symbol->symbol()->computeBinding() == STB_LOCAL &&
R.Symbol->symbol()->computeBinding() != STB_LOCAL;
});
return;
}
if (In<ELFT>::GnuHashTab)
@ -1159,7 +1148,7 @@ void SymbolTableSection<ELFT>::writeGlobalSymbols(uint8_t *Buf) {
uint8_t Type = Body->Type;
uintX_t Size = Body->getSize<ELFT>();
ESym->setBindingAndType(getSymbolBinding(Body), Type);
ESym->setBindingAndType(Body->symbol()->computeBinding(), Type);
ESym->st_size = Size;
ESym->st_name = StrOff;
ESym->setVisibility(Body->symbol()->Visibility);
@ -1201,10 +1190,12 @@ SymbolTableSection<ELFT>::getOutputSection(SymbolBody *Sym) {
}
case SymbolBody::DefinedCommonKind:
return In<ELFT>::Common->OutSec;
case SymbolBody::SharedKind:
if (cast<SharedSymbol<ELFT>>(Sym)->needsCopy())
return Out<ELFT>::Bss;
case SymbolBody::SharedKind: {
auto &SS = cast<SharedSymbol<ELFT>>(*Sym);
if (SS.needsCopy())
return SS.getBssSectionForCopy();
break;
}
case SymbolBody::UndefinedKind:
case SymbolBody::LazyArchiveKind:
case SymbolBody::LazyObjectKind:

View File

@ -356,7 +356,9 @@ X86TargetInfo::X86TargetInfo() {
RelExpr X86TargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const {
switch (Type) {
default:
case R_386_16:
case R_386_32:
case R_386_TLS_LDO_32:
return R_ABS;
case R_386_TLS_GD:
return R_TLSGD;
@ -381,6 +383,12 @@ RelExpr X86TargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const {
return R_TLS;
case R_386_TLS_LE_32:
return R_NEG_TLS;
case R_386_NONE:
return R_HINT;
default:
error("do not know how to handle relocation '" + toString(Type) + "' (" +
Twine(Type) + ")");
return R_HINT;
}
}
@ -623,7 +631,11 @@ template <class ELFT>
RelExpr X86_64TargetInfo<ELFT>::getRelExpr(uint32_t Type,
const SymbolBody &S) const {
switch (Type) {
default:
case R_X86_64_32:
case R_X86_64_32S:
case R_X86_64_64:
case R_X86_64_DTPOFF32:
case R_X86_64_DTPOFF64:
return R_ABS;
case R_X86_64_TPOFF32:
return R_TLS;
@ -649,6 +661,10 @@ RelExpr X86_64TargetInfo<ELFT>::getRelExpr(uint32_t Type,
return R_GOT_PC;
case R_X86_64_NONE:
return R_HINT;
default:
error("do not know how to handle relocation '" + toString(Type) + "' (" +
Twine(Type) + ")");
return R_HINT;
}
}
@ -870,7 +886,7 @@ void X86_64TargetInfo<ELFT>::relocateOne(uint8_t *Loc, uint32_t Type,
write64le(Loc, Val);
break;
default:
error(getErrorLocation(Loc) + "unrecognized reloc " + Twine(Type));
llvm_unreachable("unexpected relocation");
}
}

View File

@ -250,6 +250,8 @@ template <class ELFT> void Writer<ELFT>::createSyntheticSections() {
// Create singleton output sections.
Out<ELFT>::Bss =
make<OutputSection<ELFT>>(".bss", SHT_NOBITS, SHF_ALLOC | SHF_WRITE);
Out<ELFT>::BssRelRo = make<OutputSection<ELFT>>(".bss.rel.ro", SHT_NOBITS,
SHF_ALLOC | SHF_WRITE);
In<ELFT>::DynStrTab = make<StringTableSection<ELFT>>(".dynstr", true);
In<ELFT>::Dynamic = make<DynamicSection<ELFT>>();
Out<ELFT>::EhFrame = make<EhOutputSection<ELFT>>();
@ -498,6 +500,8 @@ template <class ELFT> bool elf::isRelroSection(const OutputSectionBase *Sec) {
return true;
if (In<ELFT>::MipsGot && Sec == In<ELFT>::MipsGot->OutSec)
return true;
if (Sec == Out<ELFT>::BssRelRo)
return true;
StringRef S = Sec->getName();
return S == ".data.rel.ro" || S == ".ctors" || S == ".dtors" || S == ".jcr" ||
S == ".eh_frame" || S == ".openbsd.randomdata";
@ -557,30 +561,38 @@ static bool compareSectionsNonScript(const OutputSectionBase *A,
// If we got here we know that both A and B are in the same PT_LOAD.
// The TLS initialization block needs to be a single contiguous block in a R/W
// PT_LOAD, so stick TLS sections directly before R/W sections. The TLS NOBITS
// sections are placed here as they don't take up virtual address space in the
// PT_LOAD.
bool AIsTls = A->Flags & SHF_TLS;
bool BIsTls = B->Flags & SHF_TLS;
if (AIsTls != BIsTls)
return AIsTls;
// The next requirement we have is to put nobits sections last. The
// reason is that the only thing the dynamic linker will see about
// them is a p_memsz that is larger than p_filesz. Seeing that it
// zeros the end of the PT_LOAD, so that has to correspond to the
// nobits sections.
bool AIsNoBits = A->Type == SHT_NOBITS;
bool BIsNoBits = B->Type == SHT_NOBITS;
if (AIsNoBits != BIsNoBits)
return BIsNoBits;
// We place RelRo section before plain r/w ones.
// The first requirement we have is to put (non-TLS) nobits sections last. The
// reason is that the only thing the dynamic linker will see about them is a
// p_memsz that is larger than p_filesz. Seeing that it zeros the end of the
// PT_LOAD, so that has to correspond to the nobits sections.
bool AIsNonTlsNoBits = AIsNoBits && !AIsTls;
bool BIsNonTlsNoBits = BIsNoBits && !BIsTls;
if (AIsNonTlsNoBits != BIsNonTlsNoBits)
return BIsNonTlsNoBits;
// We place nobits RelRo sections before plain r/w ones, and non-nobits RelRo
// sections after r/w ones, so that the RelRo sections are contiguous.
bool AIsRelRo = isRelroSection<ELFT>(A);
bool BIsRelRo = isRelroSection<ELFT>(B);
if (AIsRelRo != BIsRelRo)
return AIsRelRo;
return AIsNonTlsNoBits ? AIsRelRo : BIsRelRo;
// The TLS initialization block needs to be a single contiguous block in a R/W
// PT_LOAD, so stick TLS sections directly before the other RelRo R/W
// sections. The TLS NOBITS sections are placed here as they don't take up
// virtual address space in the PT_LOAD.
if (AIsTls != BIsTls)
return AIsTls;
// Within the TLS initialization block, the non-nobits sections need to appear
// first.
if (AIsNoBits != BIsNoBits)
return BIsNoBits;
// Some architectures have additional ordering restrictions for sections
// within the same PT_LOAD.
@ -1071,6 +1083,8 @@ template <class ELFT> void Writer<ELFT>::finalizeSections() {
template <class ELFT> void Writer<ELFT>::addPredefinedSections() {
if (Out<ELFT>::Bss->Size > 0)
OutputSections.push_back(Out<ELFT>::Bss);
if (Out<ELFT>::BssRelRo->Size > 0)
OutputSections.push_back(Out<ELFT>::BssRelRo);
auto OS = dyn_cast_or_null<OutputSection<ELFT>>(findSection(".ARM.exidx"));
if (OS && !OS->Sections.empty() && !Config->Relocatable)
@ -1272,8 +1286,9 @@ void Writer<ELFT>::addPtArmExid(std::vector<PhdrEntry> &Phdrs) {
Phdrs.push_back(ARMExidx);
}
// The first section of each PT_LOAD and the first section after PT_GNU_RELRO
// have to be page aligned so that the dynamic linker can set the permissions.
// The first section of each PT_LOAD, the first section in PT_GNU_RELRO and the
// first section after PT_GNU_RELRO have to be page aligned so that the dynamic
// linker can set the permissions.
template <class ELFT> void Writer<ELFT>::fixSectionAlignments() {
for (const PhdrEntry &P : Phdrs)
if (P.p_type == PT_LOAD && P.First)
@ -1282,6 +1297,8 @@ template <class ELFT> void Writer<ELFT>::fixSectionAlignments() {
for (const PhdrEntry &P : Phdrs) {
if (P.p_type != PT_GNU_RELRO)
continue;
if (P.First)
P.First->PageAlign = true;
// Find the first section after PT_GNU_RELRO. If it is in a PT_LOAD we
// have to align it to a page.
auto End = OutputSections.end();
@ -1635,10 +1652,12 @@ static void unlinkAsync(StringRef Path) {
// Path as a new file. If we do that in a different thread, the new
// thread can remove the new file.
SmallString<128> TempPath;
if (auto EC = sys::fs::createUniqueFile(Path + "tmp%%%%%%%%", TempPath))
fatal(EC, "createUniqueFile failed");
if (auto EC = sys::fs::rename(Path, TempPath))
fatal(EC, "rename failed");
if (sys::fs::createUniqueFile(Path + "tmp%%%%%%%%", TempPath))
return;
if (sys::fs::rename(Path, TempPath)) {
sys::fs::remove(TempPath);
return;
}
// Remove TempPath in background.
std::thread([=] { ::remove(TempPath.str().str().c_str()); }).detach();

172
test/COFF/Inputs/pdb1.yaml Normal file
View File

@ -0,0 +1,172 @@
--- !COFF
header:
Machine: IMAGE_FILE_MACHINE_AMD64
Characteristics: [ ]
sections:
- Name: .drectve
Characteristics: [ IMAGE_SCN_LNK_INFO, IMAGE_SCN_LNK_REMOVE ]
Alignment: 1
SectionData: 2020202F44454641554C544C49423A224C4942434D5422202F44454641554C544C49423A224F4C444E414D45532220
- Name: '.debug$S'
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
Alignment: 1
SectionData: 04000000F1000000580000001A00011100000000443A5C625C72657434322D6D61696E2E6F626A003A003C1100600000D00013000000F259000013000000F25900004D6963726F736F667420285229204F7074696D697A696E6720436F6D70696C657200F10000004E0000002A0047110000000000000000000000000E000000040000000900000005100000000000000000006D61696E001C001210280000000000000000000000000000000000000000000042110002004F110000F20000002000000000000000000000000E0000000000000001000000140000000000000002000080F400000018000000010000001001C538722F63570DF6705DDE06FE96E5D10000F30000001300000000643A5C625C72657434322D6D61696E2E630000F10000000800000006004C110E100000
Relocations:
- VirtualAddress: 140
SymbolName: main
Type: IMAGE_REL_AMD64_SECREL
- VirtualAddress: 144
SymbolName: main
Type: IMAGE_REL_AMD64_SECTION
- VirtualAddress: 196
SymbolName: main
Type: IMAGE_REL_AMD64_SECREL
- VirtualAddress: 200
SymbolName: main
Type: IMAGE_REL_AMD64_SECTION
- Name: '.debug$T'
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
Alignment: 1
SectionData: 0400000006000112000000000E0008107400000000000000001000000A000210011000000C0001000A00011201000000000000000E0008107400000000000000031000001200011600000000041000006D61696E00F3F2F10E0001160000000001100000666F6F000E00051600000000443A5C6200F3F2F12200051600000000433A5C767331345C56435C42494E5C616D6436345C636C2E6578650002010516000000002D5A37202D63202D4D54202D49433A5C767331345C56435C494E434C554445202D49433A5C767331345C56435C41544C4D46435C494E434C554445202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C31305C696E636C7564655C31302E302E31303135302E305C7563727422202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C4E4554465853444B5C342E365C696E636C7564655C756D22202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C382E315C696E636C7564655C73686172656422000A0004160100000009100000820005160A100000202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C382E315C696E636C7564655C756D22202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C382E315C696E636C7564655C77696E727422202D5443202D5800F3F2F1160005160000000072657434322D6D61696E2E6300F3F2F11600051600000000443A5C625C76633134302E70646200F11A000316050007100000081000000C1000000D1000000B100000F2F1
- Name: '.text$mn'
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
Alignment: 16
SectionData: 4883EC28E8000000004883C428C3
Relocations:
- VirtualAddress: 5
SymbolName: foo
Type: IMAGE_REL_AMD64_REL32
- Name: .xdata
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
Alignment: 4
SectionData: '0104010004420000'
- Name: .pdata
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
Alignment: 4
SectionData: '000000000E00000000000000'
Relocations:
- VirtualAddress: 0
SymbolName: '$LN3'
Type: IMAGE_REL_AMD64_ADDR32NB
- VirtualAddress: 4
SymbolName: '$LN3'
Type: IMAGE_REL_AMD64_ADDR32NB
- VirtualAddress: 8
SymbolName: '$unwind$main'
Type: IMAGE_REL_AMD64_ADDR32NB
symbols:
- Name: '@comp.id'
Value: 17062386
SectionNumber: -1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
- Name: '@feat.00'
Value: 2147484048
SectionNumber: -1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
- Name: .drectve
Value: 0
SectionNumber: 1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 47
NumberOfRelocations: 0
NumberOfLinenumbers: 0
CheckSum: 0
Number: 0
- Name: '.debug$S'
Value: 0
SectionNumber: 2
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 304
NumberOfRelocations: 4
NumberOfLinenumbers: 0
CheckSum: 0
Number: 0
- Name: '.debug$T'
Value: 0
SectionNumber: 3
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 636
NumberOfRelocations: 0
NumberOfLinenumbers: 0
CheckSum: 0
Number: 0
- Name: '.text$mn'
Value: 0
SectionNumber: 4
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 14
NumberOfRelocations: 1
NumberOfLinenumbers: 0
CheckSum: 1682752513
Number: 0
- Name: foo
Value: 0
SectionNumber: 0
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_FUNCTION
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
- Name: main
Value: 0
SectionNumber: 4
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_FUNCTION
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
- Name: '$LN3'
Value: 0
SectionNumber: 4
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_LABEL
- Name: .xdata
Value: 0
SectionNumber: 5
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 8
NumberOfRelocations: 0
NumberOfLinenumbers: 0
CheckSum: 264583633
Number: 0
- Name: '$unwind$main'
Value: 0
SectionNumber: 5
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
- Name: .pdata
Value: 0
SectionNumber: 6
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 12
NumberOfRelocations: 3
NumberOfLinenumbers: 0
CheckSum: 361370162
Number: 0
- Name: '$pdata$main'
Value: 0
SectionNumber: 6
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
...

102
test/COFF/Inputs/pdb2.yaml Normal file
View File

@ -0,0 +1,102 @@
--- !COFF
header:
Machine: IMAGE_FILE_MACHINE_AMD64
Characteristics: [ ]
sections:
- Name: .drectve
Characteristics: [ IMAGE_SCN_LNK_INFO, IMAGE_SCN_LNK_REMOVE ]
Alignment: 1
SectionData: 2020202F44454641554C544C49423A224C4942434D5422202F44454641554C544C49423A224F4C444E414D45532220
- Name: '.debug$S'
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
Alignment: 1
SectionData: 04000000F1000000570000001900011100000000443A5C625C72657434322D7375622E6F626A003A003C1100600000D00013000000F259000013000000F25900004D6963726F736F667420285229204F7074696D697A696E6720436F6D70696C65720000F10000004D000000290047110000000000000000000000000600000000000000050000000210000000000000000000666F6F001C001210000000000000000000000000000000000000000000000042110002004F11000000F2000000200000000000000000000000060000000000000001000000140000000000000001000080F400000018000000010000001001EC2D89EFF5A1FEB6B74EE4D79074072F0000F30000001200000000643A5C625C72657434322D7375622E63000000F10000000800000006004C110A100000
Relocations:
- VirtualAddress: 140
SymbolName: foo
Type: IMAGE_REL_AMD64_SECREL
- VirtualAddress: 144
SymbolName: foo
Type: IMAGE_REL_AMD64_SECTION
- VirtualAddress: 196
SymbolName: foo
Type: IMAGE_REL_AMD64_SECREL
- VirtualAddress: 200
SymbolName: foo
Type: IMAGE_REL_AMD64_SECTION
- Name: '.debug$T'
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
Alignment: 1
SectionData: 0400000006000112000000000E0008107400000000000000001000000E0001160000000001100000666F6F000E00051600000000443A5C6200F3F2F12200051600000000433A5C767331345C56435C42494E5C616D6436345C636C2E6578650002010516000000002D5A37202D63202D4D54202D49433A5C767331345C56435C494E434C554445202D49433A5C767331345C56435C41544C4D46435C494E434C554445202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C31305C696E636C7564655C31302E302E31303135302E305C7563727422202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C4E4554465853444B5C342E365C696E636C7564655C756D22202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C382E315C696E636C7564655C73686172656422000A00041601000000051000008200051606100000202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C382E315C696E636C7564655C756D22202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C382E315C696E636C7564655C77696E727422202D5443202D5800F3F2F1120005160000000072657434322D7375622E63001600051600000000443A5C625C76633134302E70646200F11A00031605000310000004100000081000000910000007100000F2F1
- Name: '.text$mn'
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
Alignment: 16
SectionData: B82A000000C3
symbols:
- Name: '@comp.id'
Value: 17062386
SectionNumber: -1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
- Name: '@feat.00'
Value: 2147484048
SectionNumber: -1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
- Name: .drectve
Value: 0
SectionNumber: 1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 47
NumberOfRelocations: 0
NumberOfLinenumbers: 0
CheckSum: 0
Number: 0
- Name: '.debug$S'
Value: 0
SectionNumber: 2
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 304
NumberOfRelocations: 4
NumberOfLinenumbers: 0
CheckSum: 0
Number: 0
- Name: '.debug$T'
Value: 0
SectionNumber: 3
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 572
NumberOfRelocations: 0
NumberOfLinenumbers: 0
CheckSum: 0
Number: 0
- Name: '.text$mn'
Value: 0
SectionNumber: 4
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 6
NumberOfRelocations: 0
NumberOfLinenumbers: 0
CheckSum: 2139436471
Number: 0
- Name: foo
Value: 0
SectionNumber: 4
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_FUNCTION
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
...

View File

@ -1,181 +0,0 @@
# RUN: yaml2obj %s > %t.obj
# RUN: lld-link /debug /pdb:%t.pdb /dumppdb /dll /out:%t.dll /entry:main \
# RUN: /nodefaultlib %t.obj | FileCheck %s
# CHECK: ArgList (0x1000) {
# CHECK-NEXT: TypeLeafKind: LF_ARGLIST (0x1201)
# CHECK-NEXT: NumArgs: 1
# CHECK-NEXT: Arguments [
# CHECK-NEXT: ArgType: 0x0
# CHECK-NEXT: ]
# CHECK-NEXT: }
# CHECK-NEXT: Procedure (0x1001) {
# CHECK-NEXT: TypeLeafKind: LF_PROCEDURE (0x1008)
# CHECK-NEXT: ReturnType: int (0x74)
# CHECK-NEXT: CallingConvention: NearC (0x0)
# CHECK-NEXT: FunctionOptions [ (0x0)
# CHECK-NEXT: ]
# CHECK-NEXT: NumParameters: 0
# CHECK-NEXT: ArgListType: (<no type>) (0x1000)
# CHECK-NEXT: }
# CHECK-NEXT: FuncId (0x1002) {
# CHECK-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601)
# CHECK-NEXT: ParentScope: 0x0
# CHECK-NEXT: FunctionType: int (<no type>) (0x1001)
# CHECK-NEXT: Name: main
# CHECK-NEXT: }
# CHECK-NEXT: StringId (0x1003) {
# CHECK-NEXT: TypeLeafKind: LF_STRING_ID (0x1605)
# CHECK-NEXT: Id: 0x0
# CHECK-NEXT: StringData: D:\b
# CHECK-NEXT: }
# CHECK-NEXT: StringId (0x1004) {
# CHECK-NEXT: TypeLeafKind: LF_STRING_ID (0x1605)
# CHECK-NEXT: Id: 0x0
# CHECK-NEXT: StringData: C:\vs14\VC\BIN\amd64\cl.exe
# CHECK-NEXT: }
# CHECK-NEXT: StringId (0x1005) {
# CHECK-NEXT: TypeLeafKind: LF_STRING_ID (0x1605)
# CHECK-NEXT: Id: 0x0
# CHECK-NEXT: StringData: -Z7 -c -MT -IC:\vs14\VC\INCLUDE -IC:\vs14\VC\ATLMFC\INCLUDE -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10150.0\ucrt" -I"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared"
# CHECK-NEXT: }
# CHECK-NEXT: StringList (0x1006) {
# CHECK-NEXT: TypeLeafKind: LF_SUBSTR_LIST (0x1604)
# CHECK-NEXT: NumArgs: 1
# CHECK-NEXT: Arguments [
# CHECK-NEXT: ArgType: -Z7 -c -MT -IC:\vs14\VC\INCLUDE -IC:\vs14\VC\ATLMFC\INCLUDE -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10150.0\ucrt" -I"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared" (0x1005)
# CHECK-NEXT: ]
# CHECK-NEXT: }
# CHECK-NEXT: StringId (0x1007) {
# CHECK-NEXT: TypeLeafKind: LF_STRING_ID (0x1605)
# CHECK-NEXT: Id: (-Z7 -c -MT -IC:\vs14\VC\INCLUDE -IC:\vs14\VC\ATLMFC\INCLUDE -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10150.0\ucrt" -I"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared") (0x1006)
# CHECK-NEXT: StringData: -I"C:\Program Files (x86)\Windows Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" -TC -X
# CHECK-NEXT: }
# CHECK-NEXT: StringId (0x1008) {
# CHECK-NEXT: TypeLeafKind: LF_STRING_ID (0x1605)
# CHECK-NEXT: Id: 0x0
# CHECK-NEXT: StringData: ret42.c
# CHECK-NEXT: }
# CHECK-NEXT: StringId (0x1009) {
# CHECK-NEXT: TypeLeafKind: LF_STRING_ID (0x1605)
# CHECK-NEXT: Id: 0x0
# CHECK-NEXT: StringData: D:\b\vc140.pdb
# CHECK-NEXT: }
# CHECK-NEXT: BuildInfo (0x100A) {
# CHECK-NEXT: TypeLeafKind: LF_BUILDINFO (0x1603)
# CHECK-NEXT: NumArgs: 5
# CHECK-NEXT: Arguments [
# CHECK-NEXT: ArgType: D:\b (0x1003)
# CHECK-NEXT: ArgType: C:\vs14\VC\BIN\amd64\cl.exe (0x1004)
# CHECK-NEXT: ArgType: ret42.c (0x1008)
# CHECK-NEXT: ArgType: D:\b\vc140.pdb (0x1009)
# CHECK-NEXT: ArgType: -I"C:\Program Files (x86)\Windows Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" -TC -X (0x1007)
# CHECK-NEXT: ]
# CHECK-NEXT: }
# CHECK-NEXT: UnknownSym {
# CHECK-NEXT: Kind: 0x0
# CHECK-NEXT: Length: 6
# CHECK-NEXT: }
--- !COFF
header:
Machine: IMAGE_FILE_MACHINE_AMD64
Characteristics: [ ]
sections:
- Name: .drectve
Characteristics: [ IMAGE_SCN_LNK_INFO, IMAGE_SCN_LNK_REMOVE ]
Alignment: 1
SectionData: 2020202F44454641554C544C49423A224C4942434D5422202F44454641554C544C49423A224F4C444E414D45532220
- Name: '.debug$S'
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
Alignment: 1
SectionData: 04000000F1000000530000001500011100000000443A5C625C72657434322E6F626A003A003C1100600000D00013000000F259000013000000F25900004D6963726F736F667420285229204F7074696D697A696E6720436F6D70696C65720000F10000004E0000002A00471100000000000000000000000006000000000000000500000002100000000000000000006D61696E001C001210000000000000000000000000000000000000000000000042110002004F110000F2000000200000000000000000000000060000000000000001000000140000000000000001000080F4000000180000000100000010010BFC79AA614B536E3D64B110330D1E580000F30000000E00000000643A5C625C72657434322E63000000F10000000800000006004C110A100000
Relocations:
- VirtualAddress: 136
SymbolName: main
Type: IMAGE_REL_AMD64_SECREL
- VirtualAddress: 140
SymbolName: main
Type: IMAGE_REL_AMD64_SECTION
- VirtualAddress: 192
SymbolName: main
Type: IMAGE_REL_AMD64_SECREL
- VirtualAddress: 196
SymbolName: main
Type: IMAGE_REL_AMD64_SECTION
- Name: '.debug$T'
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
Alignment: 1
SectionData: 040000000A00011201000000000000000E0008107400000000000000001000001200011600000000011000006D61696E00F3F2F10E00051600000000443A5C6200F3F2F12200051600000000433A5C767331345C56435C42494E5C616D6436345C636C2E6578650002010516000000002D5A37202D63202D4D54202D49433A5C767331345C56435C494E434C554445202D49433A5C767331345C56435C41544C4D46435C494E434C554445202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C31305C696E636C7564655C31302E302E31303135302E305C7563727422202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C4E4554465853444B5C342E365C696E636C7564655C756D22202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C382E315C696E636C7564655C73686172656422000A00041601000000051000008200051606100000202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C382E315C696E636C7564655C756D22202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C382E315C696E636C7564655C77696E727422202D5443202D5800F3F2F10E0005160000000072657434322E63001600051600000000443A5C625C76633134302E70646200F11A00031605000310000004100000081000000910000007100000F2F1
- Name: '.text$mn'
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
Alignment: 16
SectionData: B82A000000C3
symbols:
- Name: '@comp.id'
Value: 17062386
SectionNumber: -1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
- Name: '@feat.00'
Value: 2147484048
SectionNumber: -1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
- Name: .drectve
Value: 0
SectionNumber: 1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 47
NumberOfRelocations: 0
NumberOfLinenumbers: 0
CheckSum: 0
Number: 0
- Name: '.debug$S'
Value: 0
SectionNumber: 2
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 296
NumberOfRelocations: 4
NumberOfLinenumbers: 0
CheckSum: 0
Number: 0
- Name: '.debug$T'
Value: 0
SectionNumber: 3
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 576
NumberOfRelocations: 0
NumberOfLinenumbers: 0
CheckSum: 0
Number: 0
- Name: '.text$mn'
Value: 0
SectionNumber: 4
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 6
NumberOfRelocations: 0
NumberOfLinenumbers: 0
CheckSum: 2139436471
Number: 0
- Name: main
Value: 0
SectionNumber: 4
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_FUNCTION
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
...

View File

@ -1,16 +1,15 @@
# RUN: yaml2obj %s > %t.obj
# RUN: yaml2obj < %p/Inputs/pdb1.yaml > %t1.obj
# RUN: yaml2obj < %p/Inputs/pdb2.yaml > %t2.obj
# RUN: lld-link /debug /pdb:%t.pdb /dll /out:%t.dll /entry:main /nodefaultlib \
# RUN: /debugpdb %t.obj
# RUN: /debugpdb %t1.obj %t2.obj
# RUN: llvm-pdbdump pdb2yaml -stream-metadata -stream-directory -pdb-stream \
# RUN: -dbi-stream -ipi-stream -tpi-stream %t.pdb | FileCheck %s
# RUN: llvm-pdbdump raw -modules -section-map -section-headers -section-contribs \
# RUN: -tpi-records %t.pdb | FileCheck -check-prefix RAW %s
# CHECK: MSF:
# CHECK-NEXT: SuperBlock:
# CHECK-NEXT: BlockSize: 4096
# CHECK-NEXT: FreeBlockMap:
# CHECK-NEXT: FreeBlockMap: 1
# CHECK-NEXT: NumBlocks: 10
# CHECK-NEXT: NumDirectoryBytes: 48
# CHECK-NEXT: Unknown1: 0
@ -19,7 +18,7 @@
# CHECK-NEXT: DirectoryBlocks: [ 9 ]
# CHECK-NEXT: NumStreams: 6
# CHECK-NEXT: FileSize: 40960
# CHECK-NEXT: StreamSizes: [ 0, 48, 628, 266, 56, 80 ]
# CHECK-NEXT: StreamSizes: [ 0, 48, 736, 390, 56, 160 ]
# CHECK-NEXT: StreamMap:
# CHECK-NEXT: - Stream: [ ]
# CHECK-NEXT: - Stream: [ 5 ]
@ -28,13 +27,8 @@
# CHECK-NEXT: - Stream: [ 8 ]
# CHECK-NEXT: - Stream: [ 4 ]
# CHECK-NEXT: PdbStream:
# Ensure that the Guid matches the RSDS record:
# PDBSignature: 0x53445352
# PDBGUID (38 9A CC F2 14 A4 7F A2 6C F0 08 04 47 CF 5C 48)
# PDBAge: 1
# CHECK-NEXT: Age: 1
# Guid: '{389ACCF2-14A4-7FA2-6CF0-080447CF5C48}'
# CHECK-NEXT: Guid: '{{.*}}'
# CHECK-NEXT: Guid:
# CHECK-NEXT: Signature: 0
# CHECK-NEXT: Version: VC70
# CHECK-NEXT: NamedStreams:
@ -51,7 +45,7 @@
# CHECK-NEXT: Records:
# CHECK-NEXT: - Kind: LF_ARGLIST
# CHECK-NEXT: ArgList:
# CHECK-NEXT: ArgIndices: [ 0 ]
# CHECK-NEXT: ArgIndices: [ ]
# CHECK-NEXT: - Kind: LF_PROCEDURE
# CHECK-NEXT: Procedure:
# CHECK-NEXT: ReturnType: 116
@ -59,11 +53,30 @@
# CHECK-NEXT: Options: [ None ]
# CHECK-NEXT: ParameterCount: 0
# CHECK-NEXT: ArgumentList: 4096
# CHECK-NEXT: - Kind: LF_POINTER
# CHECK-NEXT: Pointer:
# CHECK-NEXT: ReferentType: 4097
# CHECK-NEXT: Attrs: 65548
# CHECK-NEXT: - Kind: LF_ARGLIST
# CHECK-NEXT: ArgList:
# CHECK-NEXT: ArgIndices: [ 0 ]
# CHECK-NEXT: - Kind: LF_PROCEDURE
# CHECK-NEXT: Procedure:
# CHECK-NEXT: ReturnType: 116
# CHECK-NEXT: CallConv: NearC
# CHECK-NEXT: Options: [ None ]
# CHECK-NEXT: ParameterCount: 0
# CHECK-NEXT: ArgumentList: 4099
# CHECK-NEXT: - Kind: LF_FUNC_ID
# CHECK-NEXT: FuncId:
# CHECK-NEXT: ParentScope: 0
# CHECK-NEXT: FunctionType: 4100
# CHECK-NEXT: Name: main
# CHECK-NEXT: - Kind: LF_FUNC_ID
# CHECK-NEXT: FuncId:
# CHECK-NEXT: ParentScope: 0
# CHECK-NEXT: FunctionType: 4097
# CHECK-NEXT: Name: main
# CHECK-NEXT: Name: foo
# CHECK-NEXT: - Kind: LF_STRING_ID
# CHECK-NEXT: StringId:
# CHECK-NEXT: Id: 0
@ -78,37 +91,79 @@
# CHECK-NEXT: String: '-Z7 -c -MT -IC:\vs14\VC\INCLUDE -IC:\vs14\VC\ATLMFC\INCLUDE -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10150.0\ucrt" -I"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared"'
# CHECK-NEXT: - Kind: LF_SUBSTR_LIST
# CHECK-NEXT: ArgList:
# CHECK-NEXT: ArgIndices: [ 4101 ]
# CHECK-NEXT: ArgIndices: [ 4105 ]
# CHECK-NEXT: - Kind: LF_STRING_ID
# CHECK-NEXT: StringId:
# CHECK-NEXT: Id: 4102
# CHECK-NEXT: Id: 4106
# CHECK-NEXT: String: ' -I"C:\Program Files (x86)\Windows Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" -TC -X'
# CHECK-NEXT: - Kind: LF_STRING_ID
# CHECK-NEXT: StringId:
# CHECK-NEXT: Id: 0
# CHECK-NEXT: String: ret42.c
# CHECK-NEXT: String: ret42-main.c
# CHECK-NEXT: - Kind: LF_STRING_ID
# CHECK-NEXT: StringId:
# CHECK-NEXT: Id: 0
# CHECK-NEXT: String: 'D:\b\vc140.pdb'
# CHECK-NEXT: - Kind: LF_BUILDINFO
# CHECK-NEXT: BuildInfo:
# CHECK-NEXT: ArgIndices: [ 4099, 4100, 4104, 4105, 4103 ]
# CHECK-NEXT: ArgIndices: [ 4103, 4104, 4108, 4109, 4107 ]
# CHECK-NEXT: - Kind: LF_STRING_ID
# CHECK-NEXT: StringId:
# CHECK-NEXT: Id: 0
# CHECK-NEXT: String: ret42-sub.c
# CHECK-NEXT: - Kind: LF_BUILDINFO
# CHECK-NEXT: BuildInfo:
# CHECK-NEXT: ArgIndices: [ 4103, 4104, 4111, 4109, 4107 ]
# CHECK-NEXT: IpiStream:
# CHECK-NEXT: Version: VC80
# CHECK-NEXT: Records:
# CHECK-NEXT: ...
# RAW: Type Info Stream (TPI) {
# RAW: FileHeaders {
# RAW-NEXT: BlockSize: 4096
# RAW-NEXT: FreeBlockMap: 1
# RAW-NEXT: NumBlocks: 10
# RAW-NEXT: NumDirectoryBytes: 48
# RAW-NEXT: Unknown1: 0
# RAW-NEXT: BlockMapAddr: 3
# RAW-NEXT: NumDirectoryBlocks: 1
# RAW-NEXT: DirectoryBlocks: [9]
# RAW-NEXT: NumStreams: 6
# RAW-NEXT: }
# RAW-NEXT: Streams [
# RAW-NEXT: Stream 0: [Old MSF Directory] (0 bytes)
# RAW-NEXT: Stream 1: [PDB Stream] (48 bytes)
# RAW-NEXT: Stream 2: [TPI Stream] (736 bytes)
# RAW-NEXT: Stream 3: [DBI Stream] (390 bytes)
# RAW-NEXT: Stream 4: [IPI Stream] (56 bytes)
# RAW-NEXT: Stream 5: [Section Header Data] (160 bytes)
# RAW-NEXT: ]
# RAW-NEXT: Msf Free Pages: []
# RAW-NEXT: Orphaned Pages: []
# RAW-NEXT: Multiply Used Pages: []
# RAW-NEXT: Use After Free Pages: []
# RAW-NEXT: StreamBlocks [
# RAW-NEXT: Stream 0: []
# RAW-NEXT: Stream 1: [5]
# RAW-NEXT: Stream 2: [7]
# RAW-NEXT: Stream 3: [6]
# RAW-NEXT: Stream 4: [8]
# RAW-NEXT: Stream 5: [4]
# RAW-NEXT: ]
# RAW-NEXT: PDB Stream {
# RAW-NEXT: Version: 20000404
# RAW-NEXT: Signature: 0x0
# RAW-NEXT: Age: 1
# RAW-NEXT: Guid: {7EBCCC79-C488-0267-C898-06D7E94A8A10}
# RAW-NEXT: }
# RAW-NEXT: Type Info Stream (TPI) {
# RAW-NEXT: TPI Version: 20040203
# RAW-NEXT: Record count: 11
# RAW-NEXT: Record count: 17
# RAW-NEXT: Records [
# RAW-NEXT: {
# RAW-NEXT: ArgList (0x1000) {
# RAW-NEXT: TypeLeafKind: LF_ARGLIST (0x1201)
# RAW-NEXT: NumArgs: 1
# RAW-NEXT: NumArgs: 0
# RAW-NEXT: Arguments [
# RAW-NEXT: ArgType: 0x0
# RAW-NEXT: ]
# RAW-NEXT: }
# RAW-NEXT: }
@ -120,81 +175,163 @@
# RAW-NEXT: FunctionOptions [ (0x0)
# RAW-NEXT: ]
# RAW-NEXT: NumParameters: 0
# RAW-NEXT: ArgListType: (<no type>) (0x1000)
# RAW-NEXT: ArgListType: () (0x1000)
# RAW-NEXT: }
# RAW-NEXT: }
# RAW-NEXT: {
# RAW-NEXT: FuncId (0x1002) {
# RAW-NEXT: Pointer (0x1002) {
# RAW-NEXT: TypeLeafKind: LF_POINTER (0x1002)
# RAW-NEXT: PointeeType: int () (0x1001)
# RAW-NEXT: PointerAttributes: 0x1000C
# RAW-NEXT: PtrType: Near64 (0xC)
# RAW-NEXT: PtrMode: Pointer (0x0)
# RAW-NEXT: IsFlat: 0
# RAW-NEXT: IsConst: 0
# RAW-NEXT: IsVolatile: 0
# RAW-NEXT: IsUnaligned: 0
# RAW-NEXT: SizeOf: 8
# RAW-NEXT: }
# RAW-NEXT: }
# RAW-NEXT: {
# RAW-NEXT: ArgList (0x1003) {
# RAW-NEXT: TypeLeafKind: LF_ARGLIST (0x1201)
# RAW-NEXT: NumArgs: 1
# RAW-NEXT: Arguments [
# RAW-NEXT: ArgType: 0x0
# RAW-NEXT: ]
# RAW-NEXT: }
# RAW-NEXT: }
# RAW-NEXT: {
# RAW-NEXT: Procedure (0x1004) {
# RAW-NEXT: TypeLeafKind: LF_PROCEDURE (0x1008)
# RAW-NEXT: ReturnType: int (0x74)
# RAW-NEXT: CallingConvention: NearC (0x0)
# RAW-NEXT: FunctionOptions [ (0x0)
# RAW-NEXT: ]
# RAW-NEXT: NumParameters: 0
# RAW-NEXT: ArgListType: (<no type>) (0x1003)
# RAW-NEXT: }
# RAW-NEXT: }
# RAW-NEXT: {
# RAW-NEXT: FuncId (0x1005) {
# RAW-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601)
# RAW-NEXT: ParentScope: 0x0
# RAW-NEXT: FunctionType: int (<no type>) (0x1001)
# RAW-NEXT: FunctionType: int (<no type>) (0x1004)
# RAW-NEXT: Name: main
# RAW-NEXT: }
# RAW-NEXT: }
# RAW-NEXT: {
# RAW-NEXT: StringId (0x1003) {
# RAW-NEXT: FuncId (0x1006) {
# RAW-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601)
# RAW-NEXT: ParentScope: 0x0
# RAW-NEXT: FunctionType: int () (0x1001)
# RAW-NEXT: Name: foo
# RAW-NEXT: }
# RAW-NEXT: }
# RAW-NEXT: {
# RAW-NEXT: StringId (0x1007) {
# RAW-NEXT: TypeLeafKind: LF_STRING_ID (0x1605)
# RAW-NEXT: Id: 0x0
# RAW-NEXT: StringData: D:\b
# RAW-NEXT: }
# RAW-NEXT: }
# RAW-NEXT: {
# RAW-NEXT: StringId (0x1004) {
# RAW-NEXT: StringId (0x1008) {
# RAW-NEXT: TypeLeafKind: LF_STRING_ID (0x1605)
# RAW-NEXT: Id: 0x0
# RAW-NEXT: StringData: C:\vs14\VC\BIN\amd64\cl.exe
# RAW-NEXT: }
# RAW-NEXT: }
# RAW-NEXT: {
# RAW-NEXT: StringId (0x1005) {
# RAW-NEXT: StringId (0x1009) {
# RAW-NEXT: TypeLeafKind: LF_STRING_ID (0x1605)
# RAW-NEXT: Id: 0x0
# RAW-NEXT: StringData: -Z7 -c -MT -IC:\vs14\VC\INCLUDE -IC:\vs14\VC\ATLMFC\INCLUDE -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10150.0\ucrt" -I"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared"
# RAW-NEXT: }
# RAW-NEXT: }
# RAW-NEXT: {
# RAW-NEXT: StringList (0x1006) {
# RAW-NEXT: StringList (0x100A) {
# RAW-NEXT: TypeLeafKind: LF_SUBSTR_LIST (0x1604)
# RAW-NEXT: NumArgs: 1
# RAW-NEXT: Arguments [
# RAW-NEXT: ArgType: -Z7 -c -MT -IC:\vs14\VC\INCLUDE -IC:\vs14\VC\ATLMFC\INCLUDE -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10150.0\ucrt" -I"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared" (0x1005)
# RAW-NEXT: ArgType: -Z7 -c -MT -IC:\vs14\VC\INCLUDE -IC:\vs14\VC\ATLMFC\INCLUDE -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10150.0\ucrt" -I"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared" (0x1009)
# RAW-NEXT: ]
# RAW-NEXT: }
# RAW-NEXT: }
# RAW-NEXT: {
# RAW-NEXT: StringId (0x1007) {
# RAW-NEXT: StringId (0x100B) {
# RAW-NEXT: TypeLeafKind: LF_STRING_ID (0x1605)
# RAW-NEXT: Id: (-Z7 -c -MT -IC:\vs14\VC\INCLUDE -IC:\vs14\VC\ATLMFC\INCLUDE -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10150.0\ucrt" -I"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared") (0x1006)
# RAW-NEXT: Id: (-Z7 -c -MT -IC:\vs14\VC\INCLUDE -IC:\vs14\VC\ATLMFC\INCLUDE -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.10150.0\ucrt" -I"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\shared") (0x100A)
# RAW-NEXT: StringData: -I"C:\Program Files (x86)\Windows Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" -TC -X
# RAW-NEXT: }
# RAW-NEXT: }
# RAW-NEXT: {
# RAW-NEXT: StringId (0x1008) {
# RAW-NEXT: StringId (0x100C) {
# RAW-NEXT: TypeLeafKind: LF_STRING_ID (0x1605)
# RAW-NEXT: Id: 0x0
# RAW-NEXT: StringData: ret42.c
# RAW-NEXT: StringData: ret42-main.c
# RAW-NEXT: }
# RAW-NEXT: }
# RAW-NEXT: {
# RAW-NEXT: StringId (0x1009) {
# RAW-NEXT: StringId (0x100D) {
# RAW-NEXT: TypeLeafKind: LF_STRING_ID (0x1605)
# RAW-NEXT: Id: 0x0
# RAW-NEXT: StringData: D:\b\vc140.pdb
# RAW-NEXT: }
# RAW-NEXT: }
# RAW-NEXT: {
# RAW-NEXT: BuildInfo (0x100A) {
# RAW-NEXT: BuildInfo (0x100E) {
# RAW-NEXT: TypeLeafKind: LF_BUILDINFO (0x1603)
# RAW-NEXT: NumArgs: 5
# RAW-NEXT: Arguments [
# RAW-NEXT: ArgType: D:\b (0x1003)
# RAW-NEXT: ArgType: C:\vs14\VC\BIN\amd64\cl.exe (0x1004)
# RAW-NEXT: ArgType: ret42.c (0x1008)
# RAW-NEXT: ArgType: D:\b\vc140.pdb (0x1009)
# RAW-NEXT: ArgType: -I"C:\Program Files (x86)\Windows Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" -TC -X (0x1007)
# RAW-NEXT: ArgType: D:\b (0x1007)
# RAW-NEXT: ArgType: C:\vs14\VC\BIN\amd64\cl.exe (0x1008)
# RAW-NEXT: ArgType: ret42-main.c (0x100C)
# RAW-NEXT: ArgType: D:\b\vc140.pdb (0x100D)
# RAW-NEXT: ArgType: -I"C:\Program Files (x86)\Windows Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" -TC -X (0x100B)
# RAW-NEXT: ]
# RAW-NEXT: }
# RAW-NEXT: }
# RAW-NEXT: {
# RAW-NEXT: StringId (0x100F) {
# RAW-NEXT: TypeLeafKind: LF_STRING_ID (0x1605)
# RAW-NEXT: Id: 0x0
# RAW-NEXT: StringData: ret42-sub.c
# RAW-NEXT: }
# RAW-NEXT: }
# RAW-NEXT: {
# RAW-NEXT: BuildInfo (0x1010) {
# RAW-NEXT: TypeLeafKind: LF_BUILDINFO (0x1603)
# RAW-NEXT: NumArgs: 5
# RAW-NEXT: Arguments [
# RAW-NEXT: ArgType: D:\b (0x1007)
# RAW-NEXT: ArgType: C:\vs14\VC\BIN\amd64\cl.exe (0x1008)
# RAW-NEXT: ArgType: ret42-sub.c (0x100F)
# RAW-NEXT: ArgType: D:\b\vc140.pdb (0x100D)
# RAW-NEXT: ArgType: -I"C:\Program Files (x86)\Windows Kits\8.1\include\um" -I"C:\Program Files (x86)\Windows Kits\8.1\include\winrt" -TC -X (0x100B)
# RAW-NEXT: ]
# RAW-NEXT: }
# RAW-NEXT: }
# RAW-NEXT: Hash {
# RAW-NEXT: Number of Hash Buckets: 4096
# RAW-NEXT: Hash Key Size: 4
# RAW-NEXT: Values: []
# RAW-NEXT: Type Index Offsets: []
# RAW-NEXT: Hash Adjustments: []
# RAW-NEXT: }
# RAW-NEXT: ]
# RAW-NEXT: }
# RAW-NEXT: Type Info Stream (IPI) {
# RAW-NEXT: IPI Version: 20040203
# RAW-NEXT: Record count: 0
# RAW-NEXT: Records [
# RAW-NEXT: Hash {
# RAW-NEXT: Number of Hash Buckets: 4096
# RAW-NEXT: Hash Key Size: 4
# RAW-NEXT: Values: []
# RAW-NEXT: Type Index Offsets: []
# RAW-NEXT: Hash Adjustments: []
# RAW-NEXT: }
# RAW-NEXT: ]
# RAW-NEXT: }
# RAW-NEXT: DBI Stream {
@ -222,13 +359,64 @@
# RAW-NEXT: Symbol Byte Size: 0
# RAW-NEXT: Type Server Index: 0
# RAW-NEXT: Has EC Info: No
# RAW-NEXT: 0 Contributing Source Files [
# RAW-NEXT: ]
# RAW-NEXT: }
# RAW-NEXT: ]
# RAW-NEXT: }
# RAW-NEXT: Section Contributions [
# RAW-NEXT: Contribution {
# RAW-NEXT: ISect: 0
# RAW-NEXT: Off: 1140
# RAW-NEXT: Off: 1288
# RAW-NEXT: Size: 14
# RAW-NEXT: Characteristics [ (0x60500020)
# RAW-NEXT: IMAGE_SCN_ALIGN_16BYTES (0x500000)
# RAW-NEXT: IMAGE_SCN_CNT_CODE (0x20)
# RAW-NEXT: IMAGE_SCN_MEM_EXECUTE (0x20000000)
# RAW-NEXT: IMAGE_SCN_MEM_READ (0x40000000)
# RAW-NEXT: ]
# RAW-NEXT: Module {
# RAW-NEXT: Index: 0
# RAW-NEXT: Name: * Linker *
# RAW-NEXT: }
# RAW-NEXT: Data CRC: 0
# RAW-NEXT: Reloc CRC: 0
# RAW-NEXT: }
# RAW-NEXT: Contribution {
# RAW-NEXT: ISect: 0
# RAW-NEXT: Off: 1312
# RAW-NEXT: Size: 8
# RAW-NEXT: Characteristics [ (0x40300040)
# RAW-NEXT: IMAGE_SCN_ALIGN_4BYTES (0x300000)
# RAW-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
# RAW-NEXT: IMAGE_SCN_MEM_READ (0x40000000)
# RAW-NEXT: ]
# RAW-NEXT: Module {
# RAW-NEXT: Index: 0
# RAW-NEXT: Name: * Linker *
# RAW-NEXT: }
# RAW-NEXT: Data CRC: 0
# RAW-NEXT: Reloc CRC: 0
# RAW-NEXT: }
# RAW-NEXT: Contribution {
# RAW-NEXT: ISect: 0
# RAW-NEXT: Off: 1320
# RAW-NEXT: Size: 12
# RAW-NEXT: Characteristics [ (0x40300040)
# RAW-NEXT: IMAGE_SCN_ALIGN_4BYTES (0x300000)
# RAW-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
# RAW-NEXT: IMAGE_SCN_MEM_READ (0x40000000)
# RAW-NEXT: ]
# RAW-NEXT: Module {
# RAW-NEXT: Index: 0
# RAW-NEXT: Name: * Linker *
# RAW-NEXT: }
# RAW-NEXT: Data CRC: 0
# RAW-NEXT: Reloc CRC: 0
# RAW-NEXT: }
# RAW-NEXT: Contribution {
# RAW-NEXT: ISect: 0
# RAW-NEXT: Off: 1144
# RAW-NEXT: Size: 6
# RAW-NEXT: Characteristics [ (0x60500020)
# RAW-NEXT: IMAGE_SCN_ALIGN_16BYTES (0x500000)
@ -246,9 +434,8 @@
# RAW-NEXT: ]
# RAW-NEXT: Section Map [
# RAW-NEXT: Entry {
# RAW-NEXT: Flags [ (0x10D)
# RAW-NEXT: Flags [ (0x109)
# RAW-NEXT: AddressIs32Bit (0x8)
# RAW-NEXT: Execute (0x4)
# RAW-NEXT: IsSelector (0x100)
# RAW-NEXT: Read (0x1)
# RAW-NEXT: ]
@ -258,11 +445,12 @@
# RAW-NEXT: SecName: 65535
# RAW-NEXT: ClassName: 65535
# RAW-NEXT: Offset: 0
# RAW-NEXT: SecByteLength: 6
# RAW-NEXT: SecByteLength: 12
# RAW-NEXT: }
# RAW-NEXT: Entry {
# RAW-NEXT: Flags [ (0x109)
# RAW-NEXT: Flags [ (0x10D)
# RAW-NEXT: AddressIs32Bit (0x8)
# RAW-NEXT: Execute (0x4)
# RAW-NEXT: IsSelector (0x100)
# RAW-NEXT: Read (0x1)
# RAW-NEXT: ]
@ -272,7 +460,35 @@
# RAW-NEXT: SecName: 65535
# RAW-NEXT: ClassName: 65535
# RAW-NEXT: Offset: 0
# RAW-NEXT: SecByteLength:
# RAW-NEXT: SecByteLength: 22
# RAW-NEXT: }
# RAW-NEXT: Entry {
# RAW-NEXT: Flags [ (0x109)
# RAW-NEXT: AddressIs32Bit (0x8)
# RAW-NEXT: IsSelector (0x100)
# RAW-NEXT: Read (0x1)
# RAW-NEXT: ]
# RAW-NEXT: Ovl: 0
# RAW-NEXT: Group: 0
# RAW-NEXT: Frame: 3
# RAW-NEXT: SecName: 65535
# RAW-NEXT: ClassName: 65535
# RAW-NEXT: Offset: 0
# RAW-NEXT: SecByteLength: 8
# RAW-NEXT: }
# RAW-NEXT: Entry {
# RAW-NEXT: Flags [ (0x109)
# RAW-NEXT: AddressIs32Bit (0x8)
# RAW-NEXT: IsSelector (0x100)
# RAW-NEXT: Read (0x1)
# RAW-NEXT: ]
# RAW-NEXT: Ovl: 0
# RAW-NEXT: Group: 0
# RAW-NEXT: Frame: 4
# RAW-NEXT: SecName: 65535
# RAW-NEXT: ClassName: 65535
# RAW-NEXT: Offset: 0
# RAW-NEXT: SecByteLength: 101
# RAW-NEXT: }
# RAW-NEXT: Entry {
# RAW-NEXT: Flags [ (0x208)
@ -281,35 +497,21 @@
# RAW-NEXT: ]
# RAW-NEXT: Ovl: 0
# RAW-NEXT: Group: 0
# RAW-NEXT: Frame: 3
# RAW-NEXT: Frame: 5
# RAW-NEXT: SecName: 65535
# RAW-NEXT: ClassName: 65535
# RAW-NEXT: Offset: 0
# RAW-NEXT: SecByteLength: 4294967295
# RAW-NEXT: }
# RAW-NEXT: ]
# RAW-NEXT: Globals Stream not present
# RAW-NEXT: Publics Stream not present
# RAW-NEXT: Section Headers [
# RAW-NEXT: {
# RAW-NEXT: Name: .text
# RAW-NEXT: Virtual Size: 6
# RAW-NEXT: Name: .pdata
# RAW-NEXT: Virtual Size: 12
# RAW-NEXT: Virtual Address: 4096
# RAW-NEXT: Size of Raw Data: 512
# RAW-NEXT: File Pointer to Raw Data: 512
# RAW-NEXT: File Pointer to Relocations: 0
# RAW-NEXT: File Pointer to Linenumbers: 0
# RAW-NEXT: Number of Relocations: 0
# RAW-NEXT: Number of Linenumbers: 0
# RAW-NEXT: Characteristics [ (0x60000020)
# RAW-NEXT: IMAGE_SCN_CNT_CODE (0x20)
# RAW-NEXT: IMAGE_SCN_MEM_EXECUTE (0x20000000)
# RAW-NEXT: IMAGE_SCN_MEM_READ (0x40000000)
# RAW-NEXT: ]
# RAW-NEXT: }
# RAW-NEXT: {
# RAW-NEXT: Name: .rdata
# RAW-NEXT: Virtual Size:
# RAW-NEXT: Virtual Address: 8192
# RAW-NEXT: Size of Raw Data: 512
# RAW-NEXT: File Pointer to Raw Data: 1024
# RAW-NEXT: File Pointer to Relocations: 0
# RAW-NEXT: File Pointer to Linenumbers: 0
@ -320,107 +522,52 @@
# RAW-NEXT: IMAGE_SCN_MEM_READ (0x40000000)
# RAW-NEXT: ]
# RAW-NEXT: }
# RAW-NEXT: {
# RAW-NEXT: Name: .text
# RAW-NEXT: Virtual Size: 22
# RAW-NEXT: Virtual Address: 8192
# RAW-NEXT: Size of Raw Data: 512
# RAW-NEXT: File Pointer to Raw Data: 1536
# RAW-NEXT: File Pointer to Relocations: 0
# RAW-NEXT: File Pointer to Linenumbers: 0
# RAW-NEXT: Number of Relocations: 0
# RAW-NEXT: Number of Linenumbers: 0
# RAW-NEXT: Characteristics [ (0x60000020)
# RAW-NEXT: IMAGE_SCN_CNT_CODE (0x20)
# RAW-NEXT: IMAGE_SCN_MEM_EXECUTE (0x20000000)
# RAW-NEXT: IMAGE_SCN_MEM_READ (0x40000000)
# RAW-NEXT: ]
# RAW-NEXT: }
# RAW-NEXT: {
# RAW-NEXT: Name: .xdata
# RAW-NEXT: Virtual Size: 8
# RAW-NEXT: Virtual Address: 12288
# RAW-NEXT: Size of Raw Data: 512
# RAW-NEXT: File Pointer to Raw Data: 2048
# RAW-NEXT: File Pointer to Relocations: 0
# RAW-NEXT: File Pointer to Linenumbers: 0
# RAW-NEXT: Number of Relocations: 0
# RAW-NEXT: Number of Linenumbers: 0
# RAW-NEXT: Characteristics [ (0x40000040)
# RAW-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
# RAW-NEXT: IMAGE_SCN_MEM_READ (0x40000000)
# RAW-NEXT: ]
# RAW-NEXT: }
# RAW-NEXT: {
# RAW-NEXT: Name: .rdata
# RAW-NEXT: Virtual Size: 101
# RAW-NEXT: Virtual Address: 16384
# RAW-NEXT: Size of Raw Data: 512
# RAW-NEXT: File Pointer to Raw Data: 2560
# RAW-NEXT: File Pointer to Relocations: 0
# RAW-NEXT: File Pointer to Linenumbers: 0
# RAW-NEXT: Number of Relocations: 0
# RAW-NEXT: Number of Linenumbers: 0
# RAW-NEXT: Characteristics [ (0x40000040)
# RAW-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
# RAW-NEXT: IMAGE_SCN_MEM_READ (0x40000000)
# RAW-NEXT: ]
# RAW-NEXT: }
# RAW-NEXT: ]
# RAW-NEXT: New FPO [
# RAW-NEXT: ]
--- !COFF
header:
Machine: IMAGE_FILE_MACHINE_AMD64
Characteristics: [ ]
sections:
- Name: .drectve
Characteristics: [ IMAGE_SCN_LNK_INFO, IMAGE_SCN_LNK_REMOVE ]
Alignment: 1
SectionData: 2020202F44454641554C544C49423A224C4942434D5422202F44454641554C544C49423A224F4C444E414D45532220
- Name: '.debug$S'
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
Alignment: 1
SectionData: 04000000F1000000530000001500011100000000443A5C625C72657434322E6F626A003A003C1100600000D00013000000F259000013000000F25900004D6963726F736F667420285229204F7074696D697A696E6720436F6D70696C65720000F10000004E0000002A00471100000000000000000000000006000000000000000500000002100000000000000000006D61696E001C001210000000000000000000000000000000000000000000000042110002004F110000F2000000200000000000000000000000060000000000000001000000140000000000000001000080F4000000180000000100000010010BFC79AA614B536E3D64B110330D1E580000F30000000E00000000643A5C625C72657434322E63000000F10000000800000006004C110A100000
Relocations:
- VirtualAddress: 136
SymbolName: main
Type: IMAGE_REL_AMD64_SECREL
- VirtualAddress: 140
SymbolName: main
Type: IMAGE_REL_AMD64_SECTION
- VirtualAddress: 192
SymbolName: main
Type: IMAGE_REL_AMD64_SECREL
- VirtualAddress: 196
SymbolName: main
Type: IMAGE_REL_AMD64_SECTION
- Name: '.debug$T'
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
Alignment: 1
SectionData: 040000000A00011201000000000000000E0008107400000000000000001000001200011600000000011000006D61696E00F3F2F10E00051600000000443A5C6200F3F2F12200051600000000433A5C767331345C56435C42494E5C616D6436345C636C2E6578650002010516000000002D5A37202D63202D4D54202D49433A5C767331345C56435C494E434C554445202D49433A5C767331345C56435C41544C4D46435C494E434C554445202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C31305C696E636C7564655C31302E302E31303135302E305C7563727422202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C4E4554465853444B5C342E365C696E636C7564655C756D22202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C382E315C696E636C7564655C73686172656422000A00041601000000051000008200051606100000202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C382E315C696E636C7564655C756D22202D4922433A5C50726F6772616D2046696C65732028783836295C57696E646F7773204B6974735C382E315C696E636C7564655C77696E727422202D5443202D5800F3F2F10E0005160000000072657434322E63001600051600000000443A5C625C76633134302E70646200F11A00031605000310000004100000081000000910000007100000F2F1
- Name: '.text$mn'
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
Alignment: 16
SectionData: B82A000000C3
symbols:
- Name: '@comp.id'
Value: 17062386
SectionNumber: -1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
- Name: '@feat.00'
Value: 2147484048
SectionNumber: -1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
- Name: .drectve
Value: 0
SectionNumber: 1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 47
NumberOfRelocations: 0
NumberOfLinenumbers: 0
CheckSum: 0
Number: 0
- Name: '.debug$S'
Value: 0
SectionNumber: 2
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 296
NumberOfRelocations: 4
NumberOfLinenumbers: 0
CheckSum: 0
Number: 0
- Name: '.debug$T'
Value: 0
SectionNumber: 3
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 576
NumberOfRelocations: 0
NumberOfLinenumbers: 0
CheckSum: 0
Number: 0
- Name: '.text$mn'
Value: 0
SectionNumber: 4
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 6
NumberOfRelocations: 0
NumberOfLinenumbers: 0
CheckSum: 2139436471
Number: 0
- Name: main
Value: 0
SectionNumber: 4
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_FUNCTION
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
...

View File

@ -1,9 +1,11 @@
.data
.global foo
.type foo, @object
.size foo, 4
foo:
.long 0
.text
.global bar
.type bar, @function
bar:

View File

@ -0,0 +1,13 @@
.rodata
.globl a
.size a, 4
.type a, @object
a:
.word 1
.section .data.rel.ro,"aw",%progbits
.globl b
.size b, 4
.type b, @object
b:
.word 2

View File

@ -0,0 +1,2 @@
.global und
und:

View File

@ -36,8 +36,8 @@
#DSOREL-NEXT: SHF_ALLOC
#DSOREL-NEXT: SHF_WRITE
#DSOREL-NEXT: ]
#DSOREL-NEXT: Address: 0x30000
#DSOREL-NEXT: Offset: 0x30000
#DSOREL-NEXT: Address: 0x20000
#DSOREL-NEXT: Offset: 0x20000
#DSOREL-NEXT: Size: 48
#DSOREL-NEXT: Link: 0
#DSOREL-NEXT: Info: 0
@ -46,9 +46,9 @@
#DSOREL-NEXT: }
#DSOREL: Relocations [
#DSOREL-NEXT: Section ({{.*}}) .rela.plt {
#DSOREL-NEXT: 0x30018 R_AARCH64_JUMP_SLOT _foo
#DSOREL-NEXT: 0x30020 R_AARCH64_JUMP_SLOT _bar
#DSOREL-NEXT: 0x30028 R_AARCH64_JUMP_SLOT _dah
#DSOREL-NEXT: 0x20018 R_AARCH64_JUMP_SLOT _foo
#DSOREL-NEXT: 0x20020 R_AARCH64_JUMP_SLOT _bar
#DSOREL-NEXT: 0x20028 R_AARCH64_JUMP_SLOT _dah
#DSOREL-NEXT: }
#DSOREL-NEXT:]
@ -72,22 +72,22 @@
#DSO-NEXT: Disassembly of section .plt:
#DSO-NEXT: .plt:
#DSO-NEXT: 10030: {{.*}} stp x16, x30, [sp, #-16]!
#DSO-NEXT: 10034: {{.*}} adrp x16, #131072
#DSO-NEXT: 10034: {{.*}} adrp x16, #65536
#DSO-NEXT: 10038: {{.*}} ldr x17, [x16, #16]
#DSO-NEXT: 1003c: {{.*}} add x16, x16, #16
#DSO-NEXT: 10040: {{.*}} br x17
#DSO-NEXT: 10044: {{.*}} nop
#DSO-NEXT: 10048: {{.*}} nop
#DSO-NEXT: 1004c: {{.*}} nop
#DSO-NEXT: 10050: {{.*}} adrp x16, #131072
#DSO-NEXT: 10050: {{.*}} adrp x16, #65536
#DSO-NEXT: 10054: {{.*}} ldr x17, [x16, #24]
#DSO-NEXT: 10058: {{.*}} add x16, x16, #24
#DSO-NEXT: 1005c: {{.*}} br x17
#DSO-NEXT: 10060: {{.*}} adrp x16, #131072
#DSO-NEXT: 10060: {{.*}} adrp x16, #65536
#DSO-NEXT: 10064: {{.*}} ldr x17, [x16, #32]
#DSO-NEXT: 10068: {{.*}} add x16, x16, #32
#DSO-NEXT: 1006c: {{.*}} br x17
#DSO-NEXT: 10070: {{.*}} adrp x16, #131072
#DSO-NEXT: 10070: {{.*}} adrp x16, #65536
#DSO-NEXT: 10074: {{.*}} ldr x17, [x16, #40]
#DSO-NEXT: 10078: {{.*}} add x16, x16, #40
#DSO-NEXT: 1007c: {{.*}} br x17

View File

@ -10,19 +10,19 @@
// Check that the IRELATIVE relocations are after the JUMP_SLOT in the plt
// CHECK: Relocations [
// CHECK-NEXT: Section (4) .rela.plt {
// CHECK: 0x40018 R_AARCH64_JUMP_SLOT bar2 0x0
// CHECK-NEXT: 0x40020 R_AARCH64_JUMP_SLOT zed2 0x0
// CHECK-NEXT: 0x40028 R_AARCH64_IRELATIVE - 0x20000
// CHECK-NEXT: 0x40030 R_AARCH64_IRELATIVE - 0x20004
// CHECK: 0x30018 R_AARCH64_JUMP_SLOT bar2 0x0
// CHECK-NEXT: 0x30020 R_AARCH64_JUMP_SLOT zed2 0x0
// CHECK-NEXT: 0x30028 R_AARCH64_IRELATIVE - 0x20000
// CHECK-NEXT: 0x30030 R_AARCH64_IRELATIVE - 0x20004
// CHECK-NEXT: }
// CHECK-NEXT: ]
// Check that .got.plt entries point back to PLT header
// GOTPLT: Contents of section .got.plt:
// GOTPLT-NEXT: 40000 00000000 00000000 00000000 00000000
// GOTPLT-NEXT: 40010 00000000 00000000 20000200 00000000
// GOTPLT-NEXT: 40020 20000200 00000000 20000200 00000000
// GOTPLT-NEXT: 40030 20000200 00000000
// GOTPLT-NEXT: 30000 00000000 00000000 00000000 00000000
// GOTPLT-NEXT: 30010 00000000 00000000 20000200 00000000
// GOTPLT-NEXT: 30020 20000200 00000000 20000200 00000000
// GOTPLT-NEXT: 30030 20000200 00000000
// Check that the PLTRELSZ tag includes the IRELATIVE relocations
// CHECK: DynamicSection [
@ -31,40 +31,40 @@
// Check that a PLT header is written and the ifunc entries appear last
// DISASM: Disassembly of section .text:
// DISASM-NEXT: foo:
// DISASM-NEXT: 20000: c0 03 5f d6 ret
// DISASM-NEXT: 20000: {{.*}} ret
// DISASM: bar:
// DISASM-NEXT: 20004: c0 03 5f d6 ret
// DISASM-NEXT: 20004: {{.*}} ret
// DISASM: _start:
// DISASM-NEXT: 20008: 16 00 00 94 bl #88
// DISASM-NEXT: 2000c: 19 00 00 94 bl #100
// DISASM-NEXT: 20010: 0c 00 00 94 bl #48
// DISASM-NEXT: 20014: 0f 00 00 94 bl #60
// DISASM-NEXT: 20008: {{.*}} bl #88
// DISASM-NEXT: 2000c: {{.*}} bl #100
// DISASM-NEXT: 20010: {{.*}} bl #48
// DISASM-NEXT: 20014: {{.*}} bl #60
// DISASM-NEXT: Disassembly of section .plt:
// DISASM-NEXT: .plt:
// DISASM-NEXT: 20020: f0 7b bf a9 stp x16, x30, [sp, #-16]!
// DISASM-NEXT: 20024: 10 01 00 90 adrp x16, #131072
// DISASM-NEXT: 20028: 11 0a 40 f9 ldr x17, [x16, #16]
// DISASM-NEXT: 2002c: 10 42 00 91 add x16, x16, #16
// DISASM-NEXT: 20030: 20 02 1f d6 br x17
// DISASM-NEXT: 20034: 1f 20 03 d5 nop
// DISASM-NEXT: 20038: 1f 20 03 d5 nop
// DISASM-NEXT: 2003c: 1f 20 03 d5 nop
// DISASM-NEXT: 20040: 10 01 00 90 adrp x16, #131072
// DISASM-NEXT: 20044: 11 0e 40 f9 ldr x17, [x16, #24]
// DISASM-NEXT: 20048: 10 62 00 91 add x16, x16, #24
// DISASM-NEXT: 2004c: 20 02 1f d6 br x17
// DISASM-NEXT: 20050: 10 01 00 90 adrp x16, #131072
// DISASM-NEXT: 20054: 11 12 40 f9 ldr x17, [x16, #32]
// DISASM-NEXT: 20058: 10 82 00 91 add x16, x16, #32
// DISASM-NEXT: 2005c: 20 02 1f d6 br x17
// DISASM-NEXT: 20060: 10 01 00 90 adrp x16, #131072
// DISASM-NEXT: 20064: 11 16 40 f9 ldr x17, [x16, #40]
// DISASM-NEXT: 20068: 10 a2 00 91 add x16, x16, #40
// DISASM-NEXT: 2006c: 20 02 1f d6 br x17
// DISASM-NEXT: 20070: 10 01 00 90 adrp x16, #131072
// DISASM-NEXT: 20074: 11 1a 40 f9 ldr x17, [x16, #48]
// DISASM-NEXT: 20078: 10 c2 00 91 add x16, x16, #48
// DISASM-NEXT: 2007c: 20 02 1f d6 br x17
// DISASM-NEXT: 20020: {{.*}} stp x16, x30, [sp, #-16]!
// DISASM-NEXT: 20024: {{.*}} adrp x16, #65536
// DISASM-NEXT: 20028: {{.*}} ldr x17, [x16, #16]
// DISASM-NEXT: 2002c: {{.*}} add x16, x16, #16
// DISASM-NEXT: 20030: {{.*}} br x17
// DISASM-NEXT: 20034: {{.*}} nop
// DISASM-NEXT: 20038: {{.*}} nop
// DISASM-NEXT: 2003c: {{.*}} nop
// DISASM-NEXT: 20040: {{.*}} adrp x16, #65536
// DISASM-NEXT: 20044: {{.*}} ldr x17, [x16, #24]
// DISASM-NEXT: 20048: {{.*}} add x16, x16, #24
// DISASM-NEXT: 2004c: {{.*}} br x17
// DISASM-NEXT: 20050: {{.*}} adrp x16, #65536
// DISASM-NEXT: 20054: {{.*}} ldr x17, [x16, #32]
// DISASM-NEXT: 20058: {{.*}} add x16, x16, #32
// DISASM-NEXT: 2005c: {{.*}} br x17
// DISASM-NEXT: 20060: {{.*}} adrp x16, #65536
// DISASM-NEXT: 20064: {{.*}} ldr x17, [x16, #40]
// DISASM-NEXT: 20068: {{.*}} add x16, x16, #40
// DISASM-NEXT: 2006c: {{.*}} br x17
// DISASM-NEXT: 20070: {{.*}} adrp x16, #65536
// DISASM-NEXT: 20074: {{.*}} ldr x17, [x16, #48]
// DISASM-NEXT: 20078: {{.*}} add x16, x16, #48
// DISASM-NEXT: 2007c: {{.*}} br x17
.text
.type foo STT_GNU_IFUNC

View File

@ -35,8 +35,8 @@
#DSOREL-NEXT: SHF_ALLOC
#DSOREL-NEXT: SHF_WRITE
#DSOREL-NEXT: ]
#DSOREL-NEXT: Address: 0x30000
#DSOREL-NEXT: Offset: 0x30000
#DSOREL-NEXT: Address: 0x20000
#DSOREL-NEXT: Offset: 0x20000
#DSOREL-NEXT: Size: 40
#DSOREL-NEXT: Link: 0
#DSOREL-NEXT: Info: 0
@ -45,8 +45,8 @@
#DSOREL-NEXT: }
#DSOREL: Relocations [
#DSOREL-NEXT: Section ({{.*}}) .rela.plt {
#DSOREL-NEXT: 0x30018 R_AARCH64_JUMP_SLOT _foo
#DSOREL-NEXT: 0x30020 R_AARCH64_JUMP_SLOT _bar
#DSOREL-NEXT: 0x20018 R_AARCH64_JUMP_SLOT _foo
#DSOREL-NEXT: 0x20020 R_AARCH64_JUMP_SLOT _bar
#DSOREL-NEXT: }
#DSOREL-NEXT:]
@ -72,18 +72,18 @@
#DSO-NEXT: Disassembly of section .plt:
#DSO-NEXT: .plt:
#DSO-NEXT: 10030: {{.*}} stp x16, x30, [sp, #-16]!
#DSO-NEXT: 10034: {{.*}} adrp x16, #131072
#DSO-NEXT: 10034: {{.*}} adrp x16, #65536
#DSO-NEXT: 10038: {{.*}} ldr x17, [x16, #16]
#DSO-NEXT: 1003c: {{.*}} add x16, x16, #16
#DSO-NEXT: 10040: {{.*}} br x17
#DSO-NEXT: 10044: {{.*}} nop
#DSO-NEXT: 10048: {{.*}} nop
#DSO-NEXT: 1004c: {{.*}} nop
#DSO-NEXT: 10050: {{.*}} adrp x16, #131072
#DSO-NEXT: 10050: {{.*}} adrp x16, #65536
#DSO-NEXT: 10054: {{.*}} ldr x17, [x16, #24]
#DSO-NEXT: 10058: {{.*}} add x16, x16, #24
#DSO-NEXT: 1005c: {{.*}} br x17
#DSO-NEXT: 10060: {{.*}} adrp x16, #131072
#DSO-NEXT: 10060: {{.*}} adrp x16, #65536
#DSO-NEXT: 10064: {{.*}} ldr x17, [x16, #32]
#DSO-NEXT: 10068: {{.*}} add x16, x16, #32
#DSO-NEXT: 1006c: {{.*}} br x17

View File

@ -89,5 +89,5 @@ ptr:
# CHECK-NEXT: ]
# OBJDUMP: Contents of section nonalloc:
# OBJDUMP-NEXT: 0000 00000000 14380000 00000000 18340000
# OBJDUMP-NEXT: 00000000 1c300000
# OBJDUMP-NEXT: 0000 00000000 04480000 00000000 08440000
# OBJDUMP-NEXT: 00000000 0c400000

View File

@ -18,8 +18,8 @@ bar:
// RUN: llvm-readobj -symbols -dyn-relocations %t.so | FileCheck %s
// CHECK: Dynamic Relocations {
// CHECK-NEXT: 0x2004 R_ARM_RELATIVE
// CHECK-NEXT: 0x2000 R_ARM_ABS32 foo 0x0
// CHECK-NEXT: 0x1004 R_ARM_RELATIVE
// CHECK-NEXT: 0x1000 R_ARM_ABS32 foo 0x0
// CHECK-NEXT: }
// CHECK: Symbols [

View File

@ -38,7 +38,7 @@ __aeabi_unwind_cpp_pr0:
// CHECK: Relocations [
// CHECK-NEXT: Section (6) .rel.plt {
// CHECK-NEXT: 0x300C R_ARM_JUMP_SLOT __gxx_personality_v0
// CHECK-NEXT: 0x200C R_ARM_JUMP_SLOT __gxx_personality_v0
// CHECK-EXTAB: Contents of section .ARM.extab.text.func2:
// 014c + 0ed8 = 0x1024 = __gxx_personality_v0(PLT)

View File

@ -36,7 +36,7 @@ val:
// CHECK-NEXT: SHF_ALLOC
// CHECK-NEXT: SHF_WRITE
// CHECK-NEXT: ]
// CHECK-NEXT: Address: 0x12000
// CHECK-NEXT: Address: 0x13000
// CHECK-NEXT: Offset:
// CHECK-NEXT: Size: 4
// CHECK-NEXT: Link:
@ -45,7 +45,7 @@ val:
// CHECK-NEXT: EntrySize:
// SYMBOLS: Name: val
// SYMBOLS-NEXT: Value: 0x13000
// SYMBOLS-NEXT: Value: 0x12000
// SYMBOLS-NEXT: Size: 4
// SYMBOLS-NEXT: Binding: Global
// SYMBOLS-NEXT: Type: Object
@ -59,5 +59,5 @@ val:
// CODE-NEXT: 11008: 00 00 90 e5 ldr r0, [r0]
// CODE-NEXT: 1100c: 1e ff 2f e1 bx lr
// CODE: $d.1:
// 0x11004 + 0x0ff4 + 8 = 0x12000 = .got
// CODE-NEXT: 11010: f4 0f 00 00
// 0x11004 + 0x1ff4 + 8 = 0x13000 = .got
// CODE-NEXT: 11010: f4 1f 00 00

View File

@ -10,23 +10,23 @@
// Check that the IRELATIVE relocations are last in the .got
// CHECK: Relocations [
// CHECK-NEXT: Section (4) .rel.dyn {
// CHECK-NEXT: 0x12078 R_ARM_GLOB_DAT bar2 0x0
// CHECK-NEXT: 0x1207C R_ARM_GLOB_DAT zed2 0x0
// CHECK-NEXT: 0x12080 R_ARM_IRELATIVE - 0x0
// CHECK-NEXT: 0x12084 R_ARM_IRELATIVE - 0x0
// CHECK-NEXT: 0x13078 R_ARM_GLOB_DAT bar2 0x0
// CHECK-NEXT: 0x1307C R_ARM_GLOB_DAT zed2 0x0
// CHECK-NEXT: 0x13080 R_ARM_IRELATIVE - 0x0
// CHECK-NEXT: 0x13084 R_ARM_IRELATIVE - 0x0
// CHECK-NEXT: }
// CHECK-NEXT: Section (5) .rel.plt {
// CHECK-NEXT: 0x1300C R_ARM_JUMP_SLOT bar2 0x0
// CHECK-NEXT: 0x13010 R_ARM_JUMP_SLOT zed2 0x0
// CHECK-NEXT: 0x1200C R_ARM_JUMP_SLOT bar2 0x0
// CHECK-NEXT: 0x12010 R_ARM_JUMP_SLOT zed2 0x0
// CHECK-NEXT: }
// CHECK-NEXT: ]
// Check that the GOT entries refer back to the ifunc resolver
// GOTPLT: Contents of section .got.plt:
// GOTPLT-NEXT: 12000 00000000 00000000 00000000 20100100
// GOTPLT-NEXT: 12010 20100100
// GOTPLT: Contents of section .got:
// GOTPLT-NEXT: 12078 00000000 00000000 00100100 04100100
// GOTPLT-NEXT: Contents of section .got.plt:
// GOTPLT-NEXT: 13000 00000000 00000000 00000000 20100100
// GOTPLT-NEXT: 13010 20100100
// GOTPLT-NEXT: 13078 00000000 00000000 00100100 04100100
// DISASM: Disassembly of section .text:
// DISASM-NEXT: foo:
@ -46,15 +46,15 @@
// DISASM-NEXT: 11024: 04 e0 9f e5 ldr lr, [pc, #4]
// DISASM-NEXT: 11028: 0e e0 8f e0 add lr, pc, lr
// DISASM-NEXT: 1102c: 08 f0 be e5 ldr pc, [lr, #8]!
// DISASM-NEXT: 11030: d0 1f 00 00
// DISASM-NEXT: 11030: d0 0f 00 00
// DISASM-NEXT: 11034: 04 c0 9f e5 ldr r12, [pc, #4]
// DISASM-NEXT: 11038: 0f c0 8c e0 add r12, r12, pc
// DISASM-NEXT: 1103c: 00 f0 9c e5 ldr pc, [r12]
// DISASM-NEXT: 11040: cc 1f 00 00
// DISASM-NEXT: 11040: cc 0f 00 00
// DISASM-NEXT: 11044: 04 c0 9f e5 ldr r12, [pc, #4]
// DISASM-NEXT: 11048: 0f c0 8c e0 add r12, r12, pc
// DISASM-NEXT: 1104c: 00 f0 9c e5 ldr pc, [r12]
// DISASM-NEXT: 11050: c0 1f 00 00
// DISASM-NEXT: 11050: c0 0f 00 00
// Alignment to 16 byte boundary not strictly necessary on ARM, but harmless
// DISASM-NEXT: 11054: 00 00 00 00 andeq r0, r0, r0
// DISASM-NEXT: 11058: 00 00 00 00 andeq r0, r0, r0
@ -62,11 +62,11 @@
// DISASM-NEXT: 11060: 04 c0 9f e5 ldr r12, [pc, #4]
// DISASM-NEXT: 11064: 0f c0 8c e0 add r12, r12, pc
// DISASM-NEXT: 11068: 00 f0 9c e5 ldr pc, [r12]
// DISASM-NEXT: 1106c: 14 10 00 00
// DISASM-NEXT: 1106c: 14 20 00 00
// DISASM-NEXT: 11070: 04 c0 9f e5 ldr r12, [pc, #4]
// DISASM-NEXT: 11074: 0f c0 8c e0 add r12, r12, pc
// DISASM-NEXT: 11078: 00 f0 9c e5 ldr pc, [r12]
// DISASM-NEXT: 1107c: 08 10 00 00
// DISASM-NEXT: 1107c: 08 20 00 00
.syntax unified

View File

@ -19,7 +19,7 @@ sym:
// CHECK: Relocations [
// CHECK-NEXT: Section (4) .rel.dyn {
// CHECK-NEXT: 0x2058 R_ARM_RELATIVE
// CHECK-NEXT: 0x3058 R_ARM_RELATIVE
// GOT: Contents of section .got:
// GOT-NEXT: 2058 00300000
// GOT-NEXT: 3058 00200000

View File

@ -52,23 +52,23 @@ _start:
// DSO-NEXT: 1024: 04 e0 9f e5 ldr lr, [pc, #4]
// DSO-NEXT: 1028: 0e e0 8f e0 add lr, pc, lr
// DSO-NEXT: 102c: 08 f0 be e5 ldr pc, [lr, #8]!
// 0x1028 + 8 + 1fd0 = 0x3000
// DSO-NEXT: 1030: d0 1f 00 00
// 0x1028 + 8 + 0fd0 = 0x2000
// DSO-NEXT: 1030: d0 0f 00 00
// DSO-NEXT: 1034: 04 c0 9f e5 ldr r12, [pc, #4]
// DSO-NEXT: 1038: 0f c0 8c e0 add r12, r12, pc
// DSO-NEXT: 103c: 00 f0 9c e5 ldr pc, [r12]
// 0x1038 + 8 + 1fcc = 0x300c
// DSO-NEXT: 1040: cc 1f 00 00
// 0x1038 + 8 + 0fcc = 0x200c
// DSO-NEXT: 1040: cc 0f 00 00
// DSO-NEXT: 1044: 04 c0 9f e5 ldr r12, [pc, #4]
// DSO-NEXT: 1048: 0f c0 8c e0 add r12, r12, pc
// DSO-NEXT: 104c: 00 f0 9c e5 ldr pc, [r12]
// 0x1048 + 8 + 1fc0 = 0x3010
// DSO-NEXT: 1050: c0 1f 00 00
// 0x1048 + 8 + 0fc0 = 0x2010
// DSO-NEXT: 1050: c0 0f 00 00
// DSO-NEXT: 1054: 04 c0 9f e5 ldr r12, [pc, #4]
// DSO-NEXT: 1058: 0f c0 8c e0 add r12, r12, pc
// DSO-NEXT: 105c: 00 f0 9c e5 ldr pc, [r12]
// 0x1058 + 8 + 1fb4 = 0x3014
// DSO-NEXT: 1060: b4 1f 00 00
// 0x1058 + 8 + 0fb4 = 0x2014
// DSO-NEXT: 1060: b4 0f 00 00
// DSOREL: Name: .got.plt
// DSOREL-NEXT: Type: SHT_PROGBITS
@ -76,7 +76,7 @@ _start:
// DSOREL-NEXT: SHF_ALLOC
// DSOREL-NEXT: SHF_WRITE
// DSOREL-NEXT: ]
// DSOREL-NEXT: Address: 0x3000
// DSOREL-NEXT: Address: 0x2000
// DSOREL-NEXT: Offset:
// DSOREL-NEXT: Size: 24
// DSOREL-NEXT: Link:
@ -85,6 +85,6 @@ _start:
// DSOREL-NEXT: EntrySize:
// DSOREL: Relocations [
// DSOREL-NEXT: Section (4) .rel.plt {
// DSOREL-NEXT: 0x300C R_ARM_JUMP_SLOT func1 0x0
// DSOREL-NEXT: 0x3010 R_ARM_JUMP_SLOT func2 0x0
// DSOREL-NEXT: 0x3014 R_ARM_JUMP_SLOT func3 0x0
// DSOREL-NEXT: 0x200C R_ARM_JUMP_SLOT func1 0x0
// DSOREL-NEXT: 0x2010 R_ARM_JUMP_SLOT func2 0x0
// DSOREL-NEXT: 0x2014 R_ARM_JUMP_SLOT func3 0x0

View File

@ -33,12 +33,12 @@ sym1:
// PLT-NEXT: 1024: 04 e0 9f e5 ldr lr, [pc, #4]
// PLT-NEXT: 1028: 0e e0 8f e0 add lr, pc, lr
// PLT-NEXT: 102c: 08 f0 be e5 ldr pc, [lr, #8]!
// PLT-NEXT: 1030: d0 1f 00 00
// PLT-NEXT: 1030: d0 0f 00 00
// PLT-NEXT: 1034: 04 c0 9f e5 ldr r12, [pc, #4]
// PLT-NEXT: 1038: 0f c0 8c e0 add r12, r12, pc
// PLT-NEXT: 103c: 00 f0 9c e5 ldr pc, [r12]
// PLT-NEXT: 1040: cc 1f 00 00
// PLT-NEXT: 1040: cc 0f 00 00
// PLT-NEXT: 1044: 04 c0 9f e5 ldr r12, [pc, #4]
// PLT-NEXT: 1048: 0f c0 8c e0 add r12, r12, pc
// PLT-NEXT: 104c: 00 f0 9c e5 ldr pc, [r12]
// PLT-NEXT: 1050: c0 1f 00 00
// PLT-NEXT: 1050: c0 0f 00 00

View File

@ -63,23 +63,23 @@ _start:
// DSOARM-NEXT: 1024: 04 e0 9f e5 ldr lr, [pc, #4]
// DSOARM-NEXT: 1028: 0e e0 8f e0 add lr, pc, lr
// DSOARM-NEXT: 102c: 08 f0 be e5 ldr pc, [lr, #8]!
// DSOARM-NEXT: 1030: d0 1f 00 00
// 0x1028 + 8 + 1fd0 = 0x3000
// DSOARM-NEXT: 1030: d0 0f 00 00
// 0x1028 + 8 + 0fd0 = 0x2000
// DSOARM-NEXT: 1034: 04 c0 9f e5 ldr r12, [pc, #4]
// DSOARM-NEXT: 1038: 0f c0 8c e0 add r12, r12, pc
// DSOARM-NEXT: 103c: 00 f0 9c e5 ldr pc, [r12]
// DSOARM-NEXT: 1040: cc 1f 00 00
// 0x1038 + 8 + 1fcc = 0x300c
// DSOARM-NEXT: 1040: cc 0f 00 00
// 0x1038 + 8 + 0fcc = 0x200c
// DSOARM-NEXT: 1044: 04 c0 9f e5 ldr r12, [pc, #4]
// DSOARM-NEXT: 1048: 0f c0 8c e0 add r12, r12, pc
// DSOARM-NEXT: 104c: 00 f0 9c e5 ldr pc, [r12]
// DSOARM-NEXT: 1050: c0 1f 00 00
// 0x1048 + 8 + 1fc0 = 0x3010
// DSOARM-NEXT: 1050: c0 0f 00 00
// 0x1048 + 8 + 0fc0 = 0x2010
// DSOARM-NEXT: 1054: 04 c0 9f e5 ldr r12, [pc, #4]
// DSOARM-NEXT: 1058: 0f c0 8c e0 add r12, r12, pc
// DSOARM-NEXT: 105c: 00 f0 9c e5 ldr pc, [r12]
// DSOARM-NEXT: 1060: b4 1f 00 00
// 0x1058 + 8 + 1fb4 = 0x3014
// DSOARM-NEXT: 1060: b4 0f 00 00
// 0x1058 + 8 + 0fb4 = 0x2014
// DSOREL: Name: .got.plt
// DSOREL-NEXT: Type: SHT_PROGBITS
@ -87,7 +87,7 @@ _start:
// DSOREL-NEXT: SHF_ALLOC
// DSOREL-NEXT: SHF_WRITE
// DSOREL-NEXT: ]
// DSOREL-NEXT: Address: 0x3000
// DSOREL-NEXT: Address: 0x2000
// DSOREL-NEXT: Offset:
// DSOREL-NEXT: Size: 24
// DSOREL-NEXT: Link:
@ -96,6 +96,6 @@ _start:
// DSOREL-NEXT: EntrySize:
// DSOREL: Relocations [
// DSOREL-NEXT: Section (4) .rel.plt {
// DSOREL-NEXT: 0x300C R_ARM_JUMP_SLOT func1 0x0
// DSOREL-NEXT: 0x3010 R_ARM_JUMP_SLOT func2 0x0
// DSOREL-NEXT: 0x3014 R_ARM_JUMP_SLOT func3 0x0
// DSOREL-NEXT: 0x200C R_ARM_JUMP_SLOT func1 0x0
// DSOREL-NEXT: 0x2010 R_ARM_JUMP_SLOT func2 0x0
// DSOREL-NEXT: 0x2014 R_ARM_JUMP_SLOT func3 0x0

View File

@ -25,6 +25,6 @@ func:
.Lt0: .word y(TLSGD) + (. - .L0 - 8)
// CHECK: Dynamic Relocations {
// CHECK-NEXT: 0x12078 R_ARM_TLS_DTPMOD32 y
// CHECK-NEXT: 0x1207C R_ARM_TLS_DTPOFF32 y
// CHECK-NEXT: 0x1300C R_ARM_JUMP_SLOT __tls_get_addr
// CHECK-NEXT: 0x13078 R_ARM_TLS_DTPMOD32 y
// CHECK-NEXT: 0x1307C R_ARM_TLS_DTPOFF32 y
// CHECK-NEXT: 0x1200C R_ARM_JUMP_SLOT __tls_get_addr

View File

@ -33,5 +33,5 @@ x:
// CHECK: Contents of section .got:
// Module index is always 1 for executable
// CHECK-NEXT: 12060 01000000 00000000
// CHECK-NEXT: 13060 01000000 00000000

View File

@ -36,6 +36,6 @@ x2:
.space 4
.type x2, %object
// CHECK: Contents of section .got
// CHECK: Contents of section .got:
// x1 at offset 8 from TP, x2 at offset c from TP. Offsets include TCB size of 8
// CHECK-NEXT: 12064 08000000 0c000000
// CHECK-NEXT: 13064 08000000 0c000000

View File

@ -32,4 +32,4 @@ x:
.word 10
// CHECK: Contents of section .got:
// CHECK-NEXT: 12064 01000000 00000000
// CHECK-NEXT: 13064 01000000 00000000

View File

@ -27,7 +27,7 @@ __start:
# CHECK-NEXT: Version: 1
# CHECK-NEXT: Entry: 0x20000
# CHECK-NEXT: ProgramHeaderOffset: 0x34
# CHECK-NEXT: SectionHeaderOffset: 0x30098
# CHECK-NEXT: SectionHeaderOffset: 0x200A0
# CHECK-NEXT: Flags [
# CHECK-NEXT: EF_MIPS_ABI_O32
# CHECK-NEXT: EF_MIPS_ARCH_32
@ -103,6 +103,22 @@ __start:
# CHECK-NEXT: }
# CHECK-NEXT: Section {
# CHECK-NEXT: Index: 4
# CHECK-NEXT: Name: .data
# CHECK-NEXT: Type: SHT_PROGBITS (0x1)
# CHECK-NEXT: Flags [ (0x3)
# CHECK-NEXT: SHF_ALLOC (0x2)
# CHECK-NEXT: SHF_WRITE (0x1)
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x30000
# CHECK-NEXT: Offset: 0x20000
# CHECK-NEXT: Size: 0
# CHECK-NEXT: Link: 0
# CHECK-NEXT: Info: 0
# CHECK-NEXT: AddressAlignment: 16
# CHECK-NEXT: EntrySize: 0
# CHECK-NEXT: }
# CHECK-NEXT: Section {
# CHECK-NEXT: Index: 5
# CHECK-NEXT: Name: .got
# CHECK-NEXT: Type: SHT_PROGBITS (0x1)
# CHECK-NEXT: Flags [ (0x10000003)
@ -119,22 +135,6 @@ __start:
# CHECK-NEXT: EntrySize: 0
# CHECK-NEXT: }
# CHECK-NEXT: Section {
# CHECK-NEXT: Index: 5
# CHECK-NEXT: Name: .data
# CHECK-NEXT: Type: SHT_PROGBITS (0x1)
# CHECK-NEXT: Flags [ (0x3)
# CHECK-NEXT: SHF_ALLOC (0x2)
# CHECK-NEXT: SHF_WRITE (0x1)
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x40000
# CHECK-NEXT: Offset: 0x30000
# CHECK-NEXT: Size: 0
# CHECK-NEXT: Link: 0
# CHECK-NEXT: Info: 0
# CHECK-NEXT: AddressAlignment: 16
# CHECK-NEXT: EntrySize: 0
# CHECK-NEXT: }
# CHECK-NEXT: Section {
# CHECK-NEXT: Index: 6
# CHECK-NEXT: Name: .bss
# CHECK-NEXT: Type: SHT_NOBITS (0x8)
@ -143,7 +143,7 @@ __start:
# CHECK-NEXT: SHF_WRITE (0x1)
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x40000
# CHECK-NEXT: Offset: 0x30000
# CHECK-NEXT: Offset: 0x20008
# CHECK-NEXT: Size: 0
# CHECK-NEXT: Link: 0
# CHECK-NEXT: Info: 0
@ -159,7 +159,7 @@ __start:
# CHECK-NEXT: SHF_STRINGS (0x20)
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x0
# CHECK-NEXT: Offset: 0x30000
# CHECK-NEXT: Offset: 0x20008
# CHECK-NEXT: Size: 8
# CHECK-NEXT: Link: 0
# CHECK-NEXT: Info: 0
@ -173,7 +173,7 @@ __start:
# CHECK-NEXT: Flags [ (0x0)
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x0
# CHECK-NEXT: Offset: 0x30008
# CHECK-NEXT: Offset: 0x20010
# CHECK-NEXT: Size: 48
# CHECK-NEXT: Link: 10
# CHECK-NEXT: Info: 1
@ -187,7 +187,7 @@ __start:
# CHECK-NEXT: Flags [ (0x0)
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x0
# CHECK-NEXT: Offset: 0x30038
# CHECK-NEXT: Offset: 0x20040
# CHECK-NEXT: Size: 82
# CHECK-NEXT: Link: 0
# CHECK-NEXT: Info: 0
@ -201,7 +201,7 @@ __start:
# CHECK-NEXT: Flags [ (0x0)
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x0
# CHECK-NEXT: Offset: 0x3008A
# CHECK-NEXT: Offset: 0x20092
# CHECK-NEXT: Size: 13
# CHECK-NEXT: Link: 0
# CHECK-NEXT: Info: 0
@ -283,7 +283,7 @@ __start:
# CHECK-NEXT: Offset: 0x20000
# CHECK-NEXT: VirtualAddress: 0x30000
# CHECK-NEXT: PhysicalAddress: 0x30000
# CHECK-NEXT: FileSize: 65536
# CHECK-NEXT: FileSize: 8
# CHECK-NEXT: MemSize: 65536
# CHECK-NEXT: Flags [
# CHECK-NEXT: PF_R

View File

@ -4,6 +4,7 @@
# RUN: ld.lld %t -o %t2
# RUN: llvm-readobj -file-headers -sections -program-headers -symbols %t2 \
# RUN: | FileCheck %s
# RUN: ld.lld %t -o /dev/null
# exits with return code 42 on linux
.globl _start

View File

@ -38,7 +38,7 @@ _start:
# CHECK-NEXT: Version: 1
# CHECK-NEXT: Entry: 0x10020040
# CHECK-NEXT: ProgramHeaderOffset: 0x40
# CHECK-NEXT: SectionHeaderOffset: 0x200D8
# CHECK-NEXT: SectionHeaderOffset: 0x30080
# CHECK-NEXT: Flags [ (0x0)
# CHECK-NEXT: ]
# CHECK-NEXT: HeaderSize: 64
@ -85,24 +85,6 @@ _start:
# CHECK-NEXT: }
# CHECK-NEXT: Section {
# CHECK-NEXT: Index: 2
# CHECK-NEXT: Name: .got
# CHECK-NEXT: Type: SHT_PROGBITS
# CHECK-NEXT: Flags [
# CHECK-NEXT: SHF_ALLOC
# CHECK-NEXT: SHF_WRITE
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x10020000
# CHECK-NEXT: Offset: 0x20000
# CHECK-NEXT: Size: 0
# CHECK-NEXT: Link: 0
# CHECK-NEXT: Info: 0
# CHECK-NEXT: AddressAlignment: 8
# CHECK-NEXT: EntrySize: 0
# CHECK-NEXT: SectionData (
# CHECK-NEXT: )
# CHECK-NEXT: }
# CHECK-NEXT: Section {
# CHECK-NEXT: Index: 3
# CHECK-NEXT: Name: .toc
# CHECK-NEXT: Type: SHT_PROGBITS (0x1)
# CHECK-NEXT: Flags [ (0x3)
@ -122,7 +104,7 @@ _start:
# CHECK-NEXT: )
# CHECK-NEXT: }
# CHECK-NEXT: Section {
# CHECK-NEXT: Index: 4
# CHECK-NEXT: Index: 3
# CHECK-NEXT: Name: .toc1
# CHECK-NEXT: Type: SHT_PROGBITS (0x1)
# CHECK-NEXT: Flags [ (0x3)
@ -142,7 +124,7 @@ _start:
# CHECK-NEXT: )
# CHECK-NEXT: }
# CHECK-NEXT: Section {
# CHECK-NEXT: Index: 5
# CHECK-NEXT: Index: 4
# CHECK-NEXT: Name: .opd
# CHECK-NEXT: Type: SHT_PROGBITS (0x1)
# CHECK-NEXT: Flags [ (0x3)
@ -157,11 +139,29 @@ _start:
# CHECK-NEXT: AddressAlignment: 1
# CHECK-NEXT: EntrySize: 0
# CHECK-NEXT: SectionData (
# CHECK-NEXT: 0000: 00000000 10010000 00000000 10028000 |................|
# CHECK-NEXT: 0000: 00000000 10010000 00000000 10038000 |................|
# CHECK-NEXT: 0010: 00000000 00000000 |........|
# CHECK-NEXT: )
# CHECK-NEXT: }
# CHECK-NEXT: Section {
# CHECK-NEXT: Index: 5
# CHECK-NEXT: Name: .got
# CHECK-NEXT: Type: SHT_PROGBITS
# CHECK-NEXT: Flags [
# CHECK-NEXT: SHF_ALLOC
# CHECK-NEXT: SHF_WRITE
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x10030000
# CHECK-NEXT: Offset: 0x30000
# CHECK-NEXT: Size: 0
# CHECK-NEXT: Link: 0
# CHECK-NEXT: Info: 0
# CHECK-NEXT: AddressAlignment: 8
# CHECK-NEXT: EntrySize: 0
# CHECK-NEXT: SectionData (
# CHECK-NEXT: )
# CHECK-NEXT: }
# CHECK-NEXT: Section {
# CHECK-NEXT: Index: 6
# CHECK-NEXT: Name: .comment
# CHECK-NEXT: Type: SHT_PROGBITS (0x1)
@ -170,7 +170,7 @@ _start:
# CHECK-NEXT: SHF_STRINGS (0x20)
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x0
# CHECK-NEXT: Offset: 0x20058
# CHECK-NEXT: Offset: 0x30000
# CHECK-NEXT: Size: 8
# CHECK-NEXT: Link: 0
# CHECK-NEXT: Info: 0
@ -187,7 +187,7 @@ _start:
# CHECK-NEXT: Flags [ (0x0)
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x0
# CHECK-NEXT: Offset: 0x20060
# CHECK-NEXT: Offset: 0x30008
# CHECK-NEXT: Size: 48
# CHECK-NEXT: Link: 9
# CHECK-NEXT: Info: 1
@ -203,7 +203,7 @@ _start:
# CHECK-NEXT: Flags [
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x0
# CHECK-NEXT: Offset: 0x20090
# CHECK-NEXT: Offset: 0x30038
# CHECK-NEXT: Size: 63
# CHECK-NEXT: Link: 0
# CHECK-NEXT: Info: 0
@ -219,7 +219,7 @@ _start:
# CHECK-NEXT: Flags [ (0x0)
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x0
# CHECK-NEXT: Offset: 0x200CF
# CHECK-NEXT: Offset: 0x30077
# CHECK-NEXT: Size: 8
# CHECK-NEXT: Link: 0
# CHECK-NEXT: Info: 0
@ -273,8 +273,8 @@ _start:
# CHECK-NEXT: Offset: 0x20000
# CHECK-NEXT: VirtualAddress: 0x10020000
# CHECK-NEXT: PhysicalAddress: 0x10020000
# CHECK-NEXT: FileSize: 88
# CHECK-NEXT: MemSize: 88
# CHECK-NEXT: FileSize: 65536
# CHECK-NEXT: MemSize: 65536
# CHECK-NEXT: Flags [ (0x6)
# CHECK-NEXT: PF_R (0x4)
# CHECK-NEXT: PF_W (0x2)
@ -283,9 +283,9 @@ _start:
# CHECK-NEXT: }
# CHECK-NEXT: ProgramHeader {
# CHECK-NEXT: Type: PT_GNU_RELRO
# CHECK-NEXT: Offset: 0x20000
# CHECK-NEXT: VirtualAddress: 0x10020000
# CHECK-NEXT: PhysicalAddress: 0x10020000
# CHECK-NEXT: Offset: 0x30000
# CHECK-NEXT: VirtualAddress: 0x10030000
# CHECK-NEXT: PhysicalAddress: 0x10030000
# CHECK-NEXT: FileSize: 0
# CHECK-NEXT: MemSize: 0
# CHECK-NEXT: Flags [ (0x4)

View File

@ -7,31 +7,31 @@
# CHECK: Relocations [
# CHECK-NEXT: Section ({{.*}}) .rela.dyn {
# CHECK-NEXT: Relocation {
# CHECK-NEXT: Offset: 0x2000
# CHECK-NEXT: Offset: 0x1000
# CHECK-NEXT: Type: R_X86_64_64
# CHECK-NEXT: Symbol: aaa (1)
# CHECK-NEXT: Addend: 0x0
# CHECK-NEXT: }
# CHECK-NEXT: Relocation {
# CHECK-NEXT: Offset: 0x2018
# CHECK-NEXT: Offset: 0x1018
# CHECK-NEXT: Type: R_X86_64_64
# CHECK-NEXT: Symbol: aaa (1)
# CHECK-NEXT: Addend: 0x0
# CHECK-NEXT: }
# CHECK-NEXT: Relocation {
# CHECK-NEXT: Offset: 0x2010
# CHECK-NEXT: Offset: 0x1010
# CHECK-NEXT: Type: R_X86_64_64
# CHECK-NEXT: Symbol: bbb (2)
# CHECK-NEXT: Addend: 0x0
# CHECK-NEXT: }
# CHECK-NEXT: Relocation {
# CHECK-NEXT: Offset: 0x2008
# CHECK-NEXT: Offset: 0x1008
# CHECK-NEXT: Type: R_X86_64_64
# CHECK-NEXT: Symbol: ccc (3)
# CHECK-NEXT: Addend: 0x0
# CHECK-NEXT: }
# CHECK-NEXT: Relocation {
# CHECK-NEXT: Offset: 0x2020
# CHECK-NEXT: Offset: 0x1020
# CHECK-NEXT: Type: R_X86_64_64
# CHECK-NEXT: Symbol: ddd (4)
# CHECK-NEXT: Addend: 0x0
@ -49,31 +49,31 @@
# NOCOMB: Relocations [
# NOCOMB-NEXT: Section ({{.*}}) .rela.dyn {
# NOCOMB-NEXT: Relocation {
# NOCOMB-NEXT: Offset: 0x2000
# NOCOMB-NEXT: Offset: 0x1000
# NOCOMB-NEXT: Type: R_X86_64_64
# NOCOMB-NEXT: Symbol: aaa (1)
# NOCOMB-NEXT: Addend: 0x0
# NOCOMB-NEXT: }
# NOCOMB-NEXT: Relocation {
# NOCOMB-NEXT: Offset: 0x2008
# NOCOMB-NEXT: Offset: 0x1008
# NOCOMB-NEXT: Type: R_X86_64_64
# NOCOMB-NEXT: Symbol: ccc (3)
# NOCOMB-NEXT: Addend: 0x0
# NOCOMB-NEXT: }
# NOCOMB-NEXT: Relocation {
# NOCOMB-NEXT: Offset: 0x2010
# NOCOMB-NEXT: Offset: 0x1010
# NOCOMB-NEXT: Type: R_X86_64_64
# NOCOMB-NEXT: Symbol: bbb (2)
# NOCOMB-NEXT: Addend: 0x0
# NOCOMB-NEXT: }
# NOCOMB-NEXT: Relocation {
# NOCOMB-NEXT: Offset: 0x2018
# NOCOMB-NEXT: Offset: 0x1018
# NOCOMB-NEXT: Type: R_X86_64_64
# NOCOMB-NEXT: Symbol: aaa (1)
# NOCOMB-NEXT: Addend: 0x0
# NOCOMB-NEXT: }
# NOCOMB-NEXT: Relocation {
# NOCOMB-NEXT: Offset: 0x2020
# NOCOMB-NEXT: Offset: 0x1020
# NOCOMB-NEXT: Type: R_X86_64_64
# NOCOMB-NEXT: Symbol: ddd (4)
# NOCOMB-NEXT: Addend: 0x0

View File

@ -24,21 +24,21 @@ _start:
// CHECK-NEXT: SHF_ALLOC
// CHECK-NEXT: SHF_WRITE
// CHECK-NEXT: ]
// CHECK-NEXT: Address: 0x3020
// CHECK-NEXT: Address: 0x4000
// CHECK: Relocations [
// CHECK-NEXT: Section (4) .rela.dyn {
// CHECK-NEXT: 0x3020 R_X86_64_COPY foo 0x0
// CHECK-NEXT: 0x4000 R_X86_64_COPY foo 0x0
// CHECK-NEXT: }
// CHECK-NEXT: Section (5) .rela.plt {
// CHECK-NEXT: 0x3018 R_X86_64_JUMP_SLOT bar 0x0
// CHECK-NEXT: 0x2018 R_X86_64_JUMP_SLOT bar 0x0
// CHECK-NEXT: }
// CHECK-NEXT: ]
// (0x1010 + 0x10) - 0x1005 = 27
// 0x3020 - 0x100a = 8214
// 0x4000 - 0x100a = 12278
// DISASM: Disassembly of section .text:
// DISASM-NEXT: _start:
// DISASM-NEXT: 1000: e8 1b 00 00 00 callq 27
// DISASM-NEXT: 1005: e8 16 20 00 00 callq 8214 <foo>
// DISASM-NEXT: 1005: e8 f6 2f 00 00 callq 12278 <foo>

View File

@ -8,7 +8,7 @@
// CHECK: Relocations [
// CHECK-NEXT: Section ({{.*}}) .rela.plt {
// CHECK-NEXT: 0x203018 R_X86_64_JUMP_SLOT bar 0x0
// CHECK-NEXT: 0x202018 R_X86_64_JUMP_SLOT bar 0x0
// CHECK-NEXT: }
// CHECK-NEXT: ]

View File

@ -33,7 +33,7 @@
// CHECK: Relocations [
// CHECK-NEXT: Section ({{.*}}) .rela.plt {
// CHECK-NEXT: Relocation {
// CHECK-NEXT: Offset: 0x203018
// CHECK-NEXT: Offset: 0x202018
// CHECK-NEXT: Type: R_X86_64_JUMP_SLOT
// CHECK-NEXT: Symbol: bar
// CHECK-NEXT: Addend: 0x0

View File

@ -15,6 +15,7 @@
# CHECK-NEXT: Type: SHT_PROGBITS
# CHECK-NEXT: Flags [
# CHECK-NEXT: SHF_ALLOC
# CHECK-NEXT: SHF_WRITE
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0x0
# CHECK-NEXT: Offset:

View File

@ -10,16 +10,16 @@
// Check that the IRELATIVE relocations are after the JUMP_SLOT in the plt
// CHECK: Relocations [
// CHECK-NEXT: Section (4) .rel.plt {
// CHECK-NEXT: 0x1300C R_386_JUMP_SLOT bar2
// CHECK-NEXT: 0x13010 R_386_JUMP_SLOT zed2
// CHECK-NEXT: 0x13014 R_386_IRELATIVE
// CHECK-NEXT: 0x13018 R_386_IRELATIVE
// CHECK-NEXT: 0x1200C R_386_JUMP_SLOT bar2
// CHECK-NEXT: 0x12010 R_386_JUMP_SLOT zed2
// CHECK-NEXT: 0x12014 R_386_IRELATIVE
// CHECK-NEXT: 0x12018 R_386_IRELATIVE
// Check that IRELATIVE .got.plt entries point to ifunc resolver and not
// back to the plt entry + 6.
// GOTPLT: Contents of section .got.plt:
// GOTPLT: 13000 00200100 00000000 00000000 36100100
// GOTPLT-NEXT: 13010 46100100 00100100 01100100
// GOTPLT: 12000 00300100 00000000 00000000 36100100
// GOTPLT-NEXT: 12010 46100100 00100100 01100100
// Check that the PLTRELSZ tag includes the IRELATIVE relocations
// CHECK: DynamicSection [
@ -38,22 +38,22 @@
// DISASM-NEXT: 11011: e8 2a 00 00 00 calll 42
// DISASM-NEXT: Disassembly of section .plt:
// DISASM-NEXT: .plt:
// DISASM-NEXT: 11020: ff 35 04 30 01 00 pushl 77828
// DISASM-NEXT: 11026: ff 25 08 30 01 00 jmpl *77832
// DISASM-NEXT: 11020: ff 35 04 20 01 00 pushl 73732
// DISASM-NEXT: 11026: ff 25 08 20 01 00 jmpl *73736
// DISASM-NEXT: 1102c: 90 nop
// DISASM-NEXT: 1102d: 90 nop
// DISASM-NEXT: 1102e: 90 nop
// DISASM-NEXT: 1102f: 90 nop
// DISASM-NEXT: 11030: ff 25 0c 30 01 00 jmpl *77836
// DISASM-NEXT: 11030: ff 25 0c 20 01 00 jmpl *73740
// DISASM-NEXT: 11036: 68 00 00 00 00 pushl $0
// DISASM-NEXT: 1103b: e9 e0 ff ff ff jmp -32 <.plt>
// DISASM-NEXT: 11040: ff 25 10 30 01 00 jmpl *77840
// DISASM-NEXT: 11040: ff 25 10 20 01 00 jmpl *73744
// DISASM-NEXT: 11046: 68 08 00 00 00 pushl $8
// DISASM-NEXT: 1104b: e9 d0 ff ff ff jmp -48 <.plt>
// DISASM-NEXT: 11050: ff 25 14 30 01 00 jmpl *77844
// DISASM-NEXT: 11050: ff 25 14 20 01 00 jmpl *73748
// DISASM-NEXT: 11056: 68 30 00 00 00 pushl $48
// DISASM-NEXT: 1105b: e9 e0 ff ff ff jmp -32 <.plt+0x20>
// DISASM-NEXT: 11060: ff 25 18 30 01 00 jmpl *77848
// DISASM-NEXT: 11060: ff 25 18 20 01 00 jmpl *73752
// DISASM-NEXT: 11066: 68 38 00 00 00 pushl $56
// DISASM-NEXT: 1106b: e9 d0 ff ff ff jmp -48 <.plt+0x20>

View File

@ -10,17 +10,17 @@
// Check that the IRELATIVE relocations are after the JUMP_SLOT in the plt
// CHECK: Relocations [
// CHECK-NEXT: Section (4) .rela.plt {
// CHECK-NEXT: 0x203018 R_X86_64_JUMP_SLOT bar2 0x0
// CHECK-NEXT: 0x203020 R_X86_64_JUMP_SLOT zed2 0x0
// CHECK-NEXT: 0x203028 R_X86_64_IRELATIVE - 0x201000
// CHECK-NEXT: 0x203030 R_X86_64_IRELATIVE - 0x201001
// CHECK-NEXT: 0x202018 R_X86_64_JUMP_SLOT bar2 0x0
// CHECK-NEXT: 0x202020 R_X86_64_JUMP_SLOT zed2 0x0
// CHECK-NEXT: 0x202028 R_X86_64_IRELATIVE - 0x201000
// CHECK-NEXT: 0x202030 R_X86_64_IRELATIVE - 0x201001
// Check that .got.plt entries point back to PLT header
// GOTPLT: Contents of section .got.plt:
// GOTPLT-NEXT: 203000 00202000 00000000 00000000 00000000 . .............
// GOTPLT-NEXT: 203010 00000000 00000000 36102000 00000000 ........6. .....
// GOTPLT-NEXT: 203020 46102000 00000000 56102000 00000000 F. .....V. .....
// GOTPLT-NEXT: 203030 66102000 00000000
// GOTPLT-NEXT: 202000 00302000 00000000 00000000 00000000
// GOTPLT-NEXT: 202010 00000000 00000000 36102000 00000000
// GOTPLT-NEXT: 202020 46102000 00000000 56102000 00000000
// GOTPLT-NEXT: 202030 66102000 00000000
// Check that the PLTRELSZ tag includes the IRELATIVE relocations
// CHECK: DynamicSection [
@ -39,19 +39,19 @@
// DISASM-NEXT: 201011: e8 2a 00 00 00 callq 42
// DISASM-NEXT: Disassembly of section .plt:
// DISASM-NEXT: .plt:
// DISASM-NEXT: 201020: ff 35 e2 1f 00 00 pushq 8162(%rip)
// DISASM-NEXT: 201026: ff 25 e4 1f 00 00 jmpq *8164(%rip)
// DISASM-NEXT: 201020: ff 35 e2 0f 00 00 pushq 4066(%rip)
// DISASM-NEXT: 201026: ff 25 e4 0f 00 00 jmpq *4068(%rip)
// DISASM-NEXT: 20102c: 0f 1f 40 00 nopl (%rax)
// DISASM-NEXT: 201030: ff 25 e2 1f 00 00 jmpq *8162(%rip)
// DISASM-NEXT: 201030: ff 25 e2 0f 00 00 jmpq *4066(%rip)
// DISASM-NEXT: 201036: 68 00 00 00 00 pushq $0
// DISASM-NEXT: 20103b: e9 e0 ff ff ff jmp -32 <.plt>
// DISASM-NEXT: 201040: ff 25 da 1f 00 00 jmpq *8154(%rip)
// DISASM-NEXT: 201040: ff 25 da 0f 00 00 jmpq *4058(%rip)
// DISASM-NEXT: 201046: 68 01 00 00 00 pushq $1
// DISASM-NEXT: 20104b: e9 d0 ff ff ff jmp -48 <.plt>
// DISASM-NEXT: 201050: ff 25 d2 1f 00 00 jmpq *8146(%rip)
// DISASM-NEXT: 201050: ff 25 d2 0f 00 00 jmpq *4050(%rip)
// DISASM-NEXT: 201056: 68 00 00 00 00 pushq $0
// DISASM-NEXT: 20105b: e9 e0 ff ff ff jmp -32 <.plt+0x20>
// DISASM-NEXT: 201060: ff 25 ca 1f 00 00 jmpq *8138(%rip)
// DISASM-NEXT: 201060: ff 25 ca 0f 00 00 jmpq *4042(%rip)
// DISASM-NEXT: 201066: 68 01 00 00 00 pushq $1
// DISASM-NEXT: 20106b: e9 d0 ff ff ff jmp -48 <.plt+0x20>

View File

@ -20,24 +20,24 @@
// DISASM-NEXT: 1012: c3 retq
// DISASM-NEXT: Disassembly of section .plt:
// DISASM-NEXT: .plt:
// DISASM-NEXT: 1020: ff 35 e2 1f 00 00 pushq 8162(%rip)
// DISASM-NEXT: 1026: ff 25 e4 1f 00 00 jmpq *8164(%rip)
// DISASM-NEXT: 1020: ff 35 e2 0f 00 00 pushq 4066(%rip)
// DISASM-NEXT: 1026: ff 25 e4 0f 00 00 jmpq *4068(%rip)
// DISASM-NEXT: 102c: 0f 1f 40 00 nopl (%rax)
// DISASM-NEXT: 1030: ff 25 e2 1f 00 00 jmpq *8162(%rip)
// DISASM-NEXT: 1030: ff 25 e2 0f 00 00 jmpq *4066(%rip)
// DISASM-NEXT: 1036: 68 00 00 00 00 pushq $0
// DISASM-NEXT: 103b: e9 e0 ff ff ff jmp -32 <.plt>
// DISASM-NEXT: 1040: ff 25 da 1f 00 00 jmpq *8154(%rip)
// DISASM-NEXT: 1040: ff 25 da 0f 00 00 jmpq *4058(%rip)
// DISASM-NEXT: 1046: 68 01 00 00 00 pushq $1
// DISASM-NEXT: 104b: e9 d0 ff ff ff jmp -48 <.plt>
// DISASM-NEXT: 1050: ff 25 d2 1f 00 00 jmpq *8146(%rip)
// DISASM-NEXT: 1050: ff 25 d2 0f 00 00 jmpq *4050(%rip)
// DISASM-NEXT: 1056: 68 00 00 00 00 pushq $0
// DISASM-NEXT: 105b: e9 e0 ff ff ff jmp -32 <.plt+0x20>
// CHECK: Relocations [
// CHECK-NEXT: Section (4) .rela.plt {
// CHECK-NEXT: 0x3018 R_X86_64_JUMP_SLOT fct2 0x0
// CHECK-NEXT: 0x3020 R_X86_64_JUMP_SLOT f2 0x0
// CHECK-NEXT: 0x3028 R_X86_64_IRELATIVE - 0x1000
// CHECK-NEXT: 0x2018 R_X86_64_JUMP_SLOT fct2 0x0
// CHECK-NEXT: 0x2020 R_X86_64_JUMP_SLOT f2 0x0
// CHECK-NEXT: 0x2028 R_X86_64_IRELATIVE - 0x1000
// Hidden expect IRELATIVE
.globl fct

View File

@ -10,7 +10,7 @@
// CHECK-NEXT: SHF_ALLOC
// CHECK-NEXT: SHF_WRITE
// CHECK-NEXT: ]
// CHECK-NEXT: Address: 0x20090
// CHECK-NEXT: Address: 0x30090
// CHECK-NEXT: Offset:
// CHECK-NEXT: Size: 8
// CHECK-NEXT: Link: 0
@ -19,7 +19,7 @@
// CHECK: Relocations [
// CHECK-NEXT: Section ({{.*}}) .rela.dyn {
// CHECK-NEXT: 0x20090 R_AARCH64_GLOB_DAT dat 0x0
// CHECK-NEXT: 0x30090 R_AARCH64_GLOB_DAT dat 0x0
// CHECK-NEXT: }
// CHECK-NEXT: ]
@ -27,7 +27,7 @@
// 0x20098 & 0xff8 = 0x98 = 152
// DISASM: main:
// DISASM-NEXT: 10000: 80 00 00 90 adrp x0, #65536
// DISASM-NEXT: 10000: 00 01 00 90 adrp x0, #131072
// DISASM-NEXT: 10004: 00 48 40 f9 ldr x0, [x0, #144]
.global main,foo,dat

View File

@ -6,25 +6,25 @@
// Check that the first .got.plt entry has the address of the dynamic table.
// CHECK: Type: SHT_DYNAMIC
// CHECK-NEXT: Flags [
// CHECK-NEXT: SHF_ALLOC
// CHECK-NEXT: SHF_WRITE
// CHECK-NEXT: ]
// CHECK-NEXT: Address: 0x2000
// CHECK: Name: .got.plt
// CHECK-NEXT: Type: SHT_PROGBITS
// CHECK-NEXT: Flags [
// CHECK-NEXT: SHF_ALLOC
// CHECK-NEXT: SHF_WRITE
// CHECK-NEXT: ]
// CHECK-NEXT: Address: 0x3000
// CHECK-NEXT: Offset: 0x3000
// CHECK-NEXT: Address: 0x2000
// CHECK-NEXT: Offset: 0x2000
// CHECK-NEXT: Size: 32
// CHECK-NEXT: Link: 0
// CHECK-NEXT: Info: 0
// CHECK-NEXT: AddressAlignment: 8
// CHECK-NEXT: EntrySize: 0
// CHECK-NEXT: SectionData (
// CHECK-NEXT: 0000: 00200000 00000000 00000000 00000000
// CHECK-NEXT: 0000: 00300000 00000000 00000000 00000000
// CHECK: Type: SHT_DYNAMIC
// CHECK-NEXT: Flags [
// CHECK-NEXT: SHF_ALLOC
// CHECK-NEXT: SHF_WRITE
// CHECK-NEXT: ]
// CHECK-NEXT: Address: 0x3000

View File

@ -36,8 +36,8 @@
# SEC-PIC-NEXT: SHF_ALLOC
# SEC-PIC-NEXT: SHF_WRITE
# SEC-PIC-NEXT: ]
# SEC-PIC-NEXT: Address: 0x20A0
# SEC-PIC-NEXT: Offset: 0x20A0
# SEC-PIC-NEXT: Address: 0x30A0
# SEC-PIC-NEXT: Offset: 0x30A0
# SEC-PIC-NEXT: Size: 8
# SEC-PIC-NEXT: Link:
# SEC-PIC-NEXT: Info:
@ -46,7 +46,7 @@
# SEC-PIC-NEXT: }
# SEC-PIC: Relocations [
# SEC-PIC-NEXT: Section ({{.*}}) .rela.dyn {
# SEC-PIC-NEXT: 0x20A0 R_X86_64_RELATIVE - 0x3000
# SEC-PIC-NEXT: 0x30A0 R_X86_64_RELATIVE - 0x2000
# SEC-PIC-NEXT: }
# SEC-PIC-NEXT: ]
# SEC-PIC: 0x000000006FFFFFF9 RELACOUNT 1
@ -56,15 +56,15 @@
## 0x102a + 4207 + 7 = 0x20A0
# DISASM-PIC: Disassembly of section .text:
# DISASM-PIC-NEXT: _start:
# DISASM-PIC-NEXT: 1000: {{.*}} adcq 4249(%rip), %rax
# DISASM-PIC-NEXT: 1007: {{.*}} addq 4242(%rip), %rbx
# DISASM-PIC-NEXT: 100e: {{.*}} andq 4235(%rip), %rcx
# DISASM-PIC-NEXT: 1015: {{.*}} cmpq 4228(%rip), %rdx
# DISASM-PIC-NEXT: 101c: {{.*}} orq 4221(%rip), %rdi
# DISASM-PIC-NEXT: 1023: {{.*}} sbbq 4214(%rip), %rsi
# DISASM-PIC-NEXT: 102a: {{.*}} subq 4207(%rip), %rbp
# DISASM-PIC-NEXT: 1031: {{.*}} xorq 4200(%rip), %r8
# DISASM-PIC-NEXT: 1038: {{.*}} testq 4193(%rip), %r15
# DISASM-PIC-NEXT: 1000: {{.*}} adcq 8345(%rip), %rax
# DISASM-PIC-NEXT: 1007: {{.*}} addq 8338(%rip), %rbx
# DISASM-PIC-NEXT: 100e: {{.*}} andq 8331(%rip), %rcx
# DISASM-PIC-NEXT: 1015: {{.*}} cmpq 8324(%rip), %rdx
# DISASM-PIC-NEXT: 101c: {{.*}} orq 8317(%rip), %rdi
# DISASM-PIC-NEXT: 1023: {{.*}} sbbq 8310(%rip), %rsi
# DISASM-PIC-NEXT: 102a: {{.*}} subq 8303(%rip), %rbp
# DISASM-PIC-NEXT: 1031: {{.*}} xorq 8296(%rip), %r8
# DISASM-PIC-NEXT: 1038: {{.*}} testq 8289(%rip), %r15
.data
.type bar, @object

View File

@ -27,8 +27,8 @@
// CHECK-NEXT: SHF_ALLOC
// CHECK-NEXT: SHF_WRITE
// CHECK-NEXT: ]
// CHECK-NEXT: Address: 0x2000
// CHECK-NEXT: Offset: 0x2000
// CHECK-NEXT: Address: 0x1000
// CHECK-NEXT: Offset: 0x1000
// CHECK-NEXT: Size: 4
// CHECK-NEXT: Link: 0
// CHECK-NEXT: Info: 0

View File

@ -6,5 +6,5 @@
.section .foo, "aw", @progbits, unique, 1
.quad 0
.section .foo, "aw", @nobits, unique, 2
.section .foo, "aw", @init_array, unique, 2
.quad 0

View File

@ -0,0 +1,7 @@
// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
// RUN: not ld.lld %t.o -o %t 2>&1 | FileCheck %s
// CHECK: error: Section has different type from others with the same name <internal>:(.shstrtab)
.section .shstrtab,""
.short 20

View File

@ -26,5 +26,5 @@ Sections:
Type: R_X86_64_NONE
# RUN: not ld.lld %p/Inputs/invalid-relocation-x64.elf -o %t2 2>&1 | FileCheck %s
# CHECK: unrecognized reloc 152
# CHECK: unrecognized reloc 153
# CHECK: do not know how to handle relocation 'Unknown' (152)
# CHECK: do not know how to handle relocation 'Unknown' (153)

View File

@ -9,15 +9,15 @@
# RUN: ld.lld -o %t1 --script %t.script %t
# RUN: llvm-objdump -section-headers %t1 | FileCheck %s
## .jcr is a relro section and should be placed before other RW sections.
## .jcr is a relro section and should be placed after other RW sections.
## .bss is SHT_NOBITS section and should be last RW section, so some space
## in ELF file could be saved.
# CHECK: 0 00000000 0000000000000000
# CHECK-NEXT: 1 .text 00000000 0000000000000000 TEXT DATA
# CHECK-NEXT: 2 .jcr 00000008 0000000000000000 DATA
# CHECK-NEXT: 3 .rw1 00000008 0000000000000008 DATA
# CHECK-NEXT: 4 .rw2 00000008 0000000000000010 DATA
# CHECK-NEXT: 5 .rw3 00000008 0000000000000018 DATA
# CHECK-NEXT: 2 .rw1 00000008 0000000000000000 DATA
# CHECK-NEXT: 3 .rw2 00000008 0000000000000008 DATA
# CHECK-NEXT: 4 .rw3 00000008 0000000000000010 DATA
# CHECK-NEXT: 5 .jcr 00000008 0000000000000018 DATA
# CHECK-NEXT: 6 .bss 00000008 0000000000000020 BSS
.section .rw1, "aw"

View File

@ -10,13 +10,13 @@
# RUN: llvm-readobj -t %t1 | FileCheck %s
# CHECK: Name: foo1
# CHECK-NEXT: Value: 0x288
# CHECK-NEXT: Value: 0x228
# CHECK: Name: foo2
# CHECK-NEXT: Value: 0x290
# CHECK-NEXT: Value: 0x230
# CHECK: Name: foo3
# CHECK-NEXT: Value: 0x294
# CHECK-NEXT: Value: 0x234
.section .foo.1,"a"
.long 1

View File

@ -9,8 +9,8 @@
# CHECK-NEXT: .dynsym {{.*}} A
# CHECK-NEXT: .hash {{.*}} A
# CHECK-NEXT: .dynstr {{.*}} A
# CHECK-NEXT: .dynamic {{.*}} WA
# CHECK-NEXT: foo {{.*}} WA
# CHECK-NEXT: .dynamic {{.*}} WA
.section foo, "aw"
.byte 0

View File

@ -20,7 +20,7 @@ declare i32 @printf(i8*, ...)
; Check that puts symbol is present in the dynamic symbol table and
; there's a relocation for it.
; CHECK: Dynamic Relocations {
; CHECK-NEXT: 0x203018 R_X86_64_JUMP_SLOT puts 0x0
; CHECK-NEXT: 0x202018 R_X86_64_JUMP_SLOT puts 0x0
; CHECK-NEXT: }
; CHECK: DynamicSymbols [

View File

@ -15,7 +15,7 @@
; CHECK-NEXT: Section: .text
; CHECK: Name: a
; CHECK-NEXT: Value: 0x3000
; CHECK-NEXT: Value: 0x2000
; CHECK-NEXT: Size: 0
; CHECK-NEXT: Binding: Local
; CHECK-NEXT: Type: None

View File

@ -0,0 +1,19 @@
// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
// RUN: ld.lld -shared %t.o -o %t
// RUN: llvm-readobj -s %t | FileCheck %s
// CHECK: Name: .foo
// CHECK-NEXT: Type: SHT_PROGBITS
// CHECK-NEXT: Flags [
// CHECK-NEXT: SHF_ALLOC
// CHECK-NEXT: SHF_WRITE
// CHECK-NEXT: ]
// CHECK-NEXT: Address: 0x1000
// CHECK-NEXT: Offset: 0x1000
// CHECK-NEXT: Size: 16
.section .foo, "aw", @progbits, unique, 1
.quad 0
.section .foo, "aw", @nobits, unique, 2
.quad 0

View File

@ -27,7 +27,7 @@
# CHECK-NEXT: 20018: 00 00 00 00 nop
# CHECK-NEXT: Disassembly of section .plt:
# CHECK-NEXT: .plt:
# CHECK-NEXT: 20020: 3c 1c 00 04 lui $gp, 4
# CHECK-NEXT: 20020: 3c 1c 00 03 lui $gp, 3
# CHECK-NEXT: 20024: 8f 99 00 04 lw $25, 4($gp)
# CHECK-NEXT: 20028: 27 9c 00 04 addiu $gp, $gp, 4
# CHECK-NEXT: 2002c: 03 1c c0 23 subu $24, $24, $gp
@ -35,7 +35,7 @@
# CHECK-NEXT: 20034: 00 18 c0 82 srl $24, $24, 2
# CHECK-NEXT: 20038: 03 20 f8 09 jalr $25
# CHECK-NEXT: 2003c: 27 18 ff fe addiu $24, $24, -2
# CHECK-NEXT: 20040: 3c 0f 00 04 lui $15, 4
# CHECK-NEXT: 20040: 3c 0f 00 03 lui $15, 3
# CHECK-NEXT: 20044: 8d f9 00 0c lw $25, 12($15)
# CHECK-NEXT: 20048: 03 20 00 08 jr $25
# CHECK-NEXT: 2004c: 25 f8 00 0c addiu $24, $15, 12

View File

@ -34,21 +34,21 @@ v2:
.word v1 # R_MIPS_32 target v1 addend 0
# BE: Contents of section .data:
# BE-NEXT: 30000 00000000 00000004 00030000
# BE-NEXT: 20000 00000000 00000004 00020000
# ^-- v2+4 ^-- v1
# EL: Contents of section .data:
# EL-NEXT: 30000 00000000 04000000 00000300
# EL-NEXT: 20000 00000000 04000000 00000200
# ^-- v2+4 ^-- v1
# SYM: SYMBOL TABLE:
# SYM: 00030000 l .data 00000004 v1
# SYM: 00030004 g .data 00000008 v2
# SYM: 00020000 l .data 00000004 v1
# SYM: 00020004 g .data 00000008 v2
# REL: Relocations [
# REL-NEXT: Section (7) .rel.dyn {
# REL-NEXT: 0x30008 R_MIPS_REL32 - 0x0
# REL-NEXT: 0x30004 R_MIPS_REL32 v2 0x0
# REL-NEXT: 0x20008 R_MIPS_REL32 - 0x0
# REL-NEXT: 0x20004 R_MIPS_REL32 v2 0x0
# REL-NEXT: }
# REL-NEXT: ]
@ -68,8 +68,8 @@ v2:
# REL-NEXT: Entry {
# REL-NEXT: Address:
# REL-NEXT: Access:
# REL-NEXT: Initial: 0x30004
# REL-NEXT: Value: 0x30004
# REL-NEXT: Initial: 0x20004
# REL-NEXT: Value: 0x20004
# REL-NEXT: Type: Object
# REL-NEXT: Section: .data
# REL-NEXT: Name: v2

View File

@ -18,23 +18,23 @@
# CHECK-NEXT: 20010: 24 42 80 38 addiu $2, $2, -32712
# CHECK: 0000000000020014 .text 00000000 foo
# CHECK: 0000000000037ff0 *ABS* 00000000 .hidden _gp
# CHECK: 0000000000047ff0 *ABS* 00000000 .hidden _gp
# CHECK: 0000000000020000 .text 00000000 __start
# CHECK: 0000000000000000 g F *UND* 00000000 foo1a
# GOT: Relocations [
# GOT-NEXT: ]
# GOT-NEXT: Primary GOT {
# GOT-NEXT: Canonical gp value: 0x37FF0
# GOT-NEXT: Canonical gp value: 0x47FF0
# GOT-NEXT: Reserved entries [
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x30000
# GOT-NEXT: Address: 0x40000
# GOT-NEXT: Access: -32752
# GOT-NEXT: Initial: 0x0
# GOT-NEXT: Purpose: Lazy resolver
# GOT-NEXT: }
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x30008
# GOT-NEXT: Address: 0x40008
# GOT-NEXT: Access: -32744
# GOT-NEXT: Initial: 0x8000000000000000
# GOT-NEXT: Purpose: Module pointer (GNU extension)
@ -42,29 +42,29 @@
# GOT-NEXT: ]
# GOT-NEXT: Local entries [
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x30010
# GOT-NEXT: Address: 0x40010
# GOT-NEXT: Access: -32736
# GOT-NEXT: Initial: 0x20014
# GOT-NEXT: }
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x30018
# GOT-NEXT: Address: 0x40018
# GOT-NEXT: Access: -32728
# GOT-NEXT: Initial: 0x20004
# GOT-NEXT: }
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x30020
# GOT-NEXT: Address: 0x40020
# GOT-NEXT: Access: -32720
# GOT-NEXT: Initial: 0x20008
# GOT-NEXT: }
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x30028
# GOT-NEXT: Address: 0x40028
# GOT-NEXT: Access: -32712
# GOT-NEXT: Initial: 0x2000C
# GOT-NEXT: }
# GOT-NEXT: ]
# GOT-NEXT: Global entries [
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x30030
# GOT-NEXT: Address: 0x40030
# GOT-NEXT: Access: -32704
# GOT-NEXT: Initial: 0x0
# GOT-NEXT: Value: 0x0

View File

@ -19,23 +19,23 @@
# CHECK-NEXT: 20010: 24 42 80 38 addiu $2, $2, -32712
# CHECK: 0000000000020018 .text 00000000 foo
# CHECK: 0000000000037ff0 *ABS* 00000000 .hidden _gp
# CHECK: 0000000000047ff0 *ABS* 00000000 .hidden _gp
# CHECK: 0000000000020000 .text 00000000 __start
# CHECK: 0000000000020014 .text 00000000 bar
# GOT: Relocations [
# GOT-NEXT: ]
# GOT-NEXT: Primary GOT {
# GOT-NEXT: Canonical gp value: 0x37FF0
# GOT-NEXT: Canonical gp value: 0x47FF0
# GOT-NEXT: Reserved entries [
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x30000
# GOT-NEXT: Address: 0x40000
# GOT-NEXT: Access: -32752
# GOT-NEXT: Initial: 0x0
# GOT-NEXT: Purpose: Lazy resolver
# GOT-NEXT: }
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x30008
# GOT-NEXT: Address: 0x40008
# GOT-NEXT: Access: -32744
# GOT-NEXT: Initial: 0x8000000000000000
# GOT-NEXT: Purpose: Module pointer (GNU extension)
@ -43,29 +43,29 @@
# GOT-NEXT: ]
# GOT-NEXT: Local entries [
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x30010
# GOT-NEXT: Address: 0x40010
# GOT-NEXT: Access: -32736
# GOT-NEXT: Initial: 0x20000
# GOT-NEXT: }
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x30018
# GOT-NEXT: Address: 0x40018
# GOT-NEXT: Access: -32728
# GOT-NEXT: Initial: 0x30000
# GOT-NEXT: }
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x30020
# GOT-NEXT: Address: 0x40020
# GOT-NEXT: Access: -32720
# GOT-NEXT: Initial: 0x20014
# GOT-NEXT: }
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x30028
# GOT-NEXT: Address: 0x40028
# GOT-NEXT: Access: -32712
# GOT-NEXT: Initial: 0x20018
# GOT-NEXT: }
# GOT-NEXT: ]
# GOT-NEXT: Global entries [
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x30030
# GOT-NEXT: Address: 0x40030
# GOT-NEXT: Access: -32704
# GOT-NEXT: Initial: 0x0
# GOT-NEXT: Value: 0x0

View File

@ -26,14 +26,14 @@ v2:
# SYM: SYMBOL TABLE:
# SYM: 00030000 l .data 00000004 v1
# SYM: 00030008 g .data 00000008 v2
# SYM: 00020000 l .data 00000004 v1
# SYM: 00020008 g .data 00000008 v2
# CHECK: Relocations [
# CHECK-NEXT: Section (7) .rela.dyn {
# CHECK-NEXT: 0x30010 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE - 0x30000
# CHECK-NEXT: 0x20010 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE - 0x20000
# ^-- v1
# CHECK-NEXT: 0x30008 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE v2 0x8
# CHECK-NEXT: 0x20008 R_MIPS_REL32/R_MIPS_64/R_MIPS_NONE v2 0x8
# CHECK-NEXT: }
# CHECK-NEXT: ]
@ -52,8 +52,8 @@ v2:
# CHECK-NEXT: Entry {
# CHECK-NEXT: Address:
# CHECK-NEXT: Access:
# CHECK-NEXT: Initial: 0x30008
# CHECK-NEXT: Value: 0x30008
# CHECK-NEXT: Initial: 0x20008
# CHECK-NEXT: Value: 0x20008
# CHECK-NEXT: Type: Object
# CHECK-NEXT: Section: .data
# CHECK-NEXT: Name: v2

View File

@ -24,6 +24,15 @@
# EXE-NEXT: Flags [
# EXE-NEXT: SHF_ALLOC
# EXE-NEXT: ]
# EXE: Name: .rld_map
# EXE-NEXT: Type: SHT_PROGBITS
# EXE-NEXT: Flags [
# EXE-NEXT: SHF_ALLOC
# EXE-NEXT: SHF_WRITE
# EXE-NEXT: ]
# EXE-NEXT: Address: [[RLDMAPADDR:0x[0-9a-f]+]]
# EXE-NEXT: Offset:
# EXE-NEXT: Size: 4
# EXE: Name: .got
# EXE-NEXT: Type: SHT_PROGBITS
# EXE-NEXT: Flags [ (0x10000003)
@ -34,15 +43,6 @@
# EXE-NEXT: Address: [[GOTADDR:0x[0-9a-f]+]]
# EXE-NEXT: Offset:
# EXE-NEXT: Size: 8
# EXE: Name: .rld_map
# EXE-NEXT: Type: SHT_PROGBITS
# EXE-NEXT: Flags [
# EXE-NEXT: SHF_ALLOC
# EXE-NEXT: SHF_WRITE
# EXE-NEXT: ]
# EXE-NEXT: Address: [[RLDMAPADDR:0x[0-9a-f]+]]
# EXE-NEXT: Offset:
# EXE-NEXT: Size: 4
# EXE: ]
# EXE: DynamicSection [
# EXE-NEXT: Tag Type Name/Value

View File

@ -19,22 +19,22 @@
# CHECK-NEXT: }
# CHECK-NEXT: ]
# CHECK-NEXT: Primary GOT {
# CHECK-NEXT: Canonical gp value: 0x37FF0
# CHECK-NEXT: Canonical gp value: 0x47FF0
# CHECK-NEXT: Reserved entries [
# CHECK: ]
# CHECK-NEXT: Local entries [
# CHECK-NEXT: Entry {
# CHECK-NEXT: Address: 0x30008
# CHECK-NEXT: Address: 0x40008
# CHECK-NEXT: Access: -32744
# CHECK-NEXT: Initial: 0x40010
# CHECK-NEXT: Initial: 0x50000
# CHECK-NEXT: }
# CHECK-NEXT: ]
# CHECK-NEXT: Global entries [
# CHECK-NEXT: Entry {
# CHECK-NEXT: Address: 0x3000C
# CHECK-NEXT: Address: 0x4000C
# CHECK-NEXT: Access: -32740
# CHECK-NEXT: Initial: 0x40014
# CHECK-NEXT: Value: 0x40014
# CHECK-NEXT: Initial: 0x50004
# CHECK-NEXT: Value: 0x50004
# CHECK-NEXT: Type: Object (0x1)
# CHECK-NEXT: Section: .bss (0xD)
# CHECK-NEXT: Name: data1@

View File

@ -30,7 +30,7 @@
# CHECK: Local entries [
# CHECK-NEXT: Entry {
# CHECK-NEXT: Address: 0x30008
# CHECK-NEXT: Address: 0x40008
# CHECK-NEXT: Access: -32744
# CHECK-NEXT: Initial: 0x20008
# ^-- bar
@ -38,7 +38,7 @@
# CHECK-NEXT: ]
# CHECK-NEXT: Global entries [
# CHECK-NEXT: Entry {
# CHECK-NEXT: Address: 0x3000C
# CHECK-NEXT: Address: 0x4000C
# CHECK-NEXT: Access: -32740
# CHECK-NEXT: Initial: 0x0
# CHECK-NEXT: Value: 0x0

View File

@ -20,22 +20,22 @@
# GOT-NEXT: ]
# GOT: Primary GOT {
# GOT-NEXT: Canonical gp value: 0x27FF0
# GOT-NEXT: Canonical gp value: 0x37FF0
# GOT: Local entries [
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x20008
# GOT-NEXT: Address: 0x30008
# GOT-NEXT: Access: -32744
# GOT-NEXT: Initial: 0x30000
# GOT-NEXT: Initial: 0x20000
# GOT-NEXT: }
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x2000C
# GOT-NEXT: Address: 0x3000C
# GOT-NEXT: Access: -32740
# GOT-NEXT: Initial: 0x30004
# GOT-NEXT: Initial: 0x20004
# GOT-NEXT: }
# GOT-NEXT: ]
# GOT-NEXT: Global entries [
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x20010
# GOT-NEXT: Address: 0x30010
# GOT-NEXT: Access: -32736
# GOT-NEXT: Initial: 0x0
# GOT-NEXT: Value: 0x0

View File

@ -8,27 +8,27 @@
# CHECK: Local entries [
# CHECK-NEXT: Entry {
# CHECK-NEXT: Address: 0x20008
# CHECK-NEXT: Address: 0x40008
# CHECK-NEXT: Access: -32744
# CHECK-NEXT: Initial: 0x30000
# CHECK-NEXT: Initial: 0x20000
# ^-- loc1
# CHECK-NEXT: }
# CHECK-NEXT: Entry {
# CHECK-NEXT: Address: 0x2000C
# CHECK-NEXT: Address: 0x4000C
# CHECK-NEXT: Access: -32740
# CHECK-NEXT: Initial: 0x40000
# CHECK-NEXT: Initial: 0x30000
# ^-- loc2, loc3, loc4
# CHECK-NEXT: }
# CHECK-NEXT: Entry {
# CHECK-NEXT: Address: 0x20010
# CHECK-NEXT: Address: 0x40010
# CHECK-NEXT: Access: -32736
# CHECK-NEXT: Initial: 0x50000
# CHECK-NEXT: Initial: 0x40000
# ^-- redundant
# CHECK-NEXT: }
# CHECK-NEXT: Entry {
# CHECK-NEXT: Address: 0x20014
# CHECK-NEXT: Address: 0x40014
# CHECK-NEXT: Access: -32732
# CHECK-NEXT: Initial: 0x40008
# CHECK-NEXT: Initial: 0x30008
# ^-- glb1
# CHECK-NEXT: }
# CHECK-NEXT: ]

View File

@ -45,22 +45,22 @@ v1:
.word 0
# EXE_SYM: Sections:
# EXE_SYM: .got 0000000c 0000000000030000 DATA
# EXE_SYM: .got 0000000c 0000000000040000 DATA
# EXE_SYM: SYMBOL TABLE:
# EXE_SYM: 00037ff0 *ABS* 00000000 .hidden _gp
# EXE_SYM: 00047ff0 *ABS* 00000000 .hidden _gp
# ^-- .got + GP offset (0x7ff0)
# EXE_SYM: 00040000 g .data 00000004 v1
# EXE_SYM: 00030000 g .data 00000004 v1
# EXE_GOT_BE: Contents of section .got:
# EXE_GOT_BE: 30000 00000000 80000000 00040000
# ^ ^ ^-- v1 (0x40000)
# EXE_GOT_BE: 40000 00000000 80000000 00030000
# ^ ^ ^-- v1 (0x30000)
# | +-- Module pointer (0x80000000)
# +-- Lazy resolver (0x0)
# EXE_GOT_EL: Contents of section .got:
# EXE_GOT_EL: 30000 00000000 00000080 00000400
# ^ ^ ^-- v1 (0x40000)
# EXE_GOT_EL: 40000 00000000 00000080 00000300
# ^ ^ ^-- v1 (0x30000)
# | +-- Module pointer (0x80000000)
# +-- Lazy resolver (0x0)
@ -69,21 +69,21 @@ v1:
# EXE_DIS_EL: 20000: 18 80 02 3c lui $2, 32792
# DSO_SYM: Sections:
# DSO_SYM: .got 0000000c 0000000000020000 DATA
# DSO_SYM: .got 0000000c 0000000000030000 DATA
# DSO_SYM: SYMBOL TABLE:
# DSO_SYM: 00027ff0 *ABS* 00000000 .hidden _gp
# DSO_SYM: 00037ff0 *ABS* 00000000 .hidden _gp
# ^-- .got + GP offset (0x7ff0)
# DSO_SYM: 00030000 g .data 00000004 v1
# DSO_SYM: 00020000 g .data 00000004 v1
# DSO_GOT_BE: Contents of section .got:
# DSO_GOT_BE: 20000 00000000 80000000 00030000
# ^ ^ ^-- v1 (0x30000)
# DSO_GOT_BE: 30000 00000000 80000000 00020000
# ^ ^ ^-- v1 (0x20000)
# | +-- Module pointer (0x80000000)
# +-- Lazy resolver (0x0)
# DSO_GOT_EL: Contents of section .got:
# DSO_GOT_EL: 20000 00000000 00000080 00000300
# ^ ^ ^-- v1 (0x30000)
# DSO_GOT_EL: 30000 00000000 00000080 00000200
# ^ ^ ^-- v1 (0x20000)
# | +-- Module pointer (0x80000000)
# +-- Lazy resolver (0x0)

View File

@ -15,7 +15,7 @@
# NOSYM: Symbol {
# NOSYM: Name: foo
# NOSYM-NEXT: Value: 0x30000
# NOSYM-NEXT: Value: 0x20000
# NOSYM-NEXT: Size: 0
# NOSYM-NEXT: Binding: Weak
# NOSYM-NEXT: Type: None
@ -33,7 +33,7 @@
# NOSYM-NEXT: }
# NOSYM-NEXT: Symbol {
# NOSYM-NEXT: Name: sym
# NOSYM-NEXT: Value: 0x30004
# NOSYM-NEXT: Value: 0x20004
# NOSYM-NEXT: Size: 0
# NOSYM-NEXT: Binding: Global
# NOSYM-NEXT: Type: None
@ -47,16 +47,16 @@
# NOSYM-NEXT: 0x70000013 MIPS_GOTSYM 0x1
# NOSYM: Primary GOT {
# NOSYM-NEXT: Canonical gp value: 0x27FF0
# NOSYM-NEXT: Canonical gp value: 0x37FF0
# NOSYM-NEXT: Reserved entries [
# NOSYM-NEXT: Entry {
# NOSYM-NEXT: Address: 0x20000
# NOSYM-NEXT: Address: 0x30000
# NOSYM-NEXT: Access: -32752
# NOSYM-NEXT: Initial: 0x0
# NOSYM-NEXT: Purpose: Lazy resolver
# NOSYM-NEXT: }
# NOSYM-NEXT: Entry {
# NOSYM-NEXT: Address: 0x20004
# NOSYM-NEXT: Address: 0x30004
# NOSYM-NEXT: Access: -32748
# NOSYM-NEXT: Initial: 0x80000000
# NOSYM-NEXT: Purpose: Module pointer (GNU extension)
@ -66,16 +66,16 @@
# NOSYM-NEXT: ]
# NOSYM-NEXT: Global entries [
# NOSYM-NEXT: Entry {
# NOSYM-NEXT: Address: 0x20008
# NOSYM-NEXT: Address: 0x30008
# NOSYM-NEXT: Access: -32744
# NOSYM-NEXT: Initial: 0x30000
# NOSYM-NEXT: Value: 0x30000
# NOSYM-NEXT: Initial: 0x20000
# NOSYM-NEXT: Value: 0x20000
# NOSYM-NEXT: Type: None
# NOSYM-NEXT: Section: .data
# NOSYM-NEXT: Name: foo
# NOSYM-NEXT: }
# NOSYM-NEXT: Entry {
# NOSYM-NEXT: Address: 0x2000C
# NOSYM-NEXT: Address: 0x3000C
# NOSYM-NEXT: Access: -32740
# NOSYM-NEXT: Initial: 0x0
# NOSYM-NEXT: Value: 0x0
@ -84,10 +84,10 @@
# NOSYM-NEXT: Name: bar
# NOSYM-NEXT: }
# NOSYM-NEXT: Entry {
# NOSYM-NEXT: Address: 0x20010
# NOSYM-NEXT: Address: 0x30010
# NOSYM-NEXT: Access: -32736
# NOSYM-NEXT: Initial: 0x30004
# NOSYM-NEXT: Value: 0x30004
# NOSYM-NEXT: Initial: 0x20004
# NOSYM-NEXT: Value: 0x20004
# NOSYM-NEXT: Type: None
# NOSYM-NEXT: Section: .data
# NOSYM-NEXT: Name: sym
@ -115,16 +115,16 @@
# SYM-NEXT: 0x70000013 MIPS_GOTSYM 0x3
# SYM: Primary GOT {
# SYM-NEXT: Canonical gp value: 0x27FF0
# SYM-NEXT: Canonical gp value: 0x37FF0
# SYM-NEXT: Reserved entries [
# SYM-NEXT: Entry {
# SYM-NEXT: Address: 0x20000
# SYM-NEXT: Address: 0x30000
# SYM-NEXT: Access: -32752
# SYM-NEXT: Initial: 0x0
# SYM-NEXT: Purpose: Lazy resolver
# SYM-NEXT: }
# SYM-NEXT: Entry {
# SYM-NEXT: Address: 0x20004
# SYM-NEXT: Address: 0x30004
# SYM-NEXT: Access: -32748
# SYM-NEXT: Initial: 0x80000000
# SYM-NEXT: Purpose: Module pointer (GNU extension)
@ -132,19 +132,19 @@
# SYM-NEXT: ]
# SYM-NEXT: Local entries [
# SYM-NEXT: Entry {
# SYM-NEXT: Address: 0x20008
# SYM-NEXT: Address: 0x30008
# SYM-NEXT: Access: -32744
# SYM-NEXT: Initial: 0x30000
# SYM-NEXT: Initial: 0x20000
# SYM-NEXT: }
# SYM-NEXT: Entry {
# SYM-NEXT: Address: 0x2000C
# SYM-NEXT: Address: 0x3000C
# SYM-NEXT: Access: -32740
# SYM-NEXT: Initial: 0x30004
# SYM-NEXT: Initial: 0x20004
# SYM-NEXT: }
# SYM-NEXT: ]
# SYM-NEXT: Global entries [
# SYM-NEXT: Entry {
# SYM-NEXT: Address: 0x20010
# SYM-NEXT: Address: 0x30010
# SYM-NEXT: Access: -32736
# SYM-NEXT: Initial: 0x0
# SYM-NEXT: Value: 0x0

View File

@ -22,23 +22,23 @@
# CHECK-NEXT: 10028: 8f 88 80 34 lw $8, -32716($gp)
#
# CHECK: SYMBOL TABLE:
# CHECK: 00051008 .data 00000000 .hidden bar
# CHECK: 00041008 .data 00000000 .hidden bar
# CHECK: 00000000 *UND* 00000000 foo
# GOT: Relocations [
# GOT-NEXT: ]
# GOT: Primary GOT {
# GOT-NEXT: Canonical gp value: 0x27FF0
# GOT-NEXT: Canonical gp value: 0x57FF0
# GOT-NEXT: Reserved entries [
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x20000
# GOT-NEXT: Address: 0x50000
# GOT-NEXT: Access: -32752
# GOT-NEXT: Initial: 0x0
# GOT-NEXT: Purpose: Lazy resolver
# GOT-NEXT: }
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x20004
# GOT-NEXT: Address: 0x50004
# GOT-NEXT: Access: -32748
# GOT-NEXT: Initial: 0x80000000
# GOT-NEXT: Purpose: Module pointer (GNU extension)
@ -46,52 +46,52 @@
# GOT-NEXT: ]
# GOT-NEXT: Local entries [
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x20008
# GOT-NEXT: Address: 0x50008
# GOT-NEXT: Access: -32744
# GOT-NEXT: Initial: 0x10000
# ^-- (0x1002c + 0x8000) & ~0xffff
# GOT-NEXT: }
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x2000C
# GOT-NEXT: Address: 0x5000C
# GOT-NEXT: Access: -32740
# GOT-NEXT: Initial: 0x20000
# ^-- redundant unused entry
# GOT-NEXT: }
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x20010
# GOT-NEXT: Address: 0x50010
# GOT-NEXT: Access: -32736
# GOT-NEXT: Initial: 0x30000
# GOT-NEXT: Initial: 0x20000
# ^-- redundant unused entry
# GOT-NEXT: }
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x20014
# GOT-NEXT: Address: 0x50014
# GOT-NEXT: Access: -32732
# GOT-NEXT: Initial: 0x40000
# ^-- (0x39000 + 0x8000) & ~0xffff
# GOT-NEXT: Initial: 0x30000
# ^-- (0x29000 + 0x8000) & ~0xffff
# GOT-NEXT: }
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x20018
# GOT-NEXT: Address: 0x50018
# GOT-NEXT: Access: -32728
# GOT-NEXT: Initial: 0x50000
# ^-- (0x39000 + 0x10004 + 0x8000) & ~0xffff
# ^-- (0x39000 + 0x18004 + 0x8000) & ~0xffff
# GOT-NEXT: Initial: 0x40000
# ^-- (0x29000 + 0x10004 + 0x8000) & ~0xffff
# ^-- (0x29000 + 0x18004 + 0x8000) & ~0xffff
# GOT-NEXT: }
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x2001C
# GOT-NEXT: Address: 0x5001C
# GOT-NEXT: Access: -32724
# GOT-NEXT: Initial: 0x60000
# GOT-NEXT: Initial: 0x50000
# ^-- redundant unused entry
# GOT-NEXT: }
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x20020
# GOT-NEXT: Address: 0x50020
# GOT-NEXT: Access: -32720
# GOT-NEXT: Initial: 0x51008
# GOT-NEXT: Initial: 0x41008
# ^-- 'bar' address
# GOT-NEXT: }
# GOT-NEXT: ]
# GOT-NEXT: Global entries [
# GOT-NEXT: Entry {
# GOT-NEXT: Address: 0x20024
# GOT-NEXT: Address: 0x50024
# GOT-NEXT: Access: -32716
# GOT-NEXT: Initial: 0x0
# GOT-NEXT: Value: 0x0

View File

@ -1,17 +1,11 @@
# Check that the linker use a value of _gp symbol defined
# in a linker script to calculate GOT relocations.
# FIXME: This test is xfailed because there is currently a bug
# that causes symbols defined by linker scripts to be put in the
# wrong sections. In particular, `_gp = . + 0x100` ends up in
# `.text` when it should be in `*ABS*`.
# XFAIL: *
# RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux %s -o %t.o
# RUN: echo "SECTIONS { \
# RUN: .text : { *(.text) } \
# RUN: _gp = . + 0x100; \
# RUN: _gp = ABSOLUTE(.) + 0x100; \
# RUN: .got : { *(.got) } }" > %t.rel.script
# RUN: ld.lld -shared -o %t.rel.so --script %t.rel.script %t.o
# RUN: llvm-objdump -s -t %t.rel.so | FileCheck --check-prefix=REL %s
@ -26,10 +20,10 @@
# REQUIRES: mips
# REL: Contents of section .text:
# REL-NEXT: 0000 3c080000 2108010c 8f82ffe4
# REL-NEXT: 0000 3c080000 2108010c 8f82fff0
# ^-- %hi(_gp_disp)
# ^-- %lo(_gp_disp)
# ^-- 8 - (0x10c - 0xe8)
# ^-- 8 - (0x10c - 0xf4)
# G - (GP - .got)
# REL: Contents of section .reginfo:
@ -38,7 +32,7 @@
# ^-- _gp
# REL: Contents of section .data:
# REL-NEXT: 0100 fffffef4
# REL-NEXT: 00f0 fffffef4
# ^-- 0-0x10c
# REL: 00000000 .text 00000000 foo
@ -46,10 +40,10 @@
# REL: 0000010c *ABS* 00000000 .hidden _gp
# ABS: Contents of section .text:
# ABS-NEXT: 0000 3c080000 21080200 8f82fef0
# ABS-NEXT: 0000 3c080000 21080200 8f82fefc
# ^-- %hi(_gp_disp)
# ^-- %lo(_gp_disp)
# ^-- 8 - (0x200 - 0xe8)
# ^-- 8 - (0x200 - 0xf4)
# G - (GP - .got)
# ABS: Contents of section .reginfo:
@ -58,7 +52,7 @@
# ^-- _gp
# ABS: Contents of section .data:
# ABS-NEXT: 0100 fffffe00
# ABS-NEXT: 00f0 fffffe00
# ^-- 0-0x200
# ABS: 00000000 .text 00000000 foo

View File

@ -36,7 +36,7 @@ foo:
# CHECK-NEXT: SHF_MIPS_GPREL
# CHECK-NEXT: SHF_WRITE
# CHECK-NEXT: ]
# CHECK-NEXT: Address: 0xE4
# CHECK-NEXT: Address: 0xF0
# CHECK: }
# CHECK: Name: _gp (5)

View File

@ -22,34 +22,34 @@ bar:
# EXE: Disassembly of section .text:
# EXE-NEXT: __start:
# EXE-NEXT: 20000: 3c 08 00 01 lui $8, 1
# ^-- %hi(0x37ff0-0x20000)
# EXE-NEXT: 20000: 3c 08 00 02 lui $8, 2
# ^-- %hi(0x47ff0-0x20000)
# EXE-NEXT: 20004: 21 08 7f f0 addi $8, $8, 32752
# ^-- %lo(0x37ff0-0x20004+4)
# ^-- %lo(0x47ff0-0x20004+4)
# EXE: bar:
# EXE-NEXT: 2000c: 3c 08 00 01 lui $8, 1
# ^-- %hi(0x37ff0-0x2000c)
# EXE-NEXT: 2000c: 3c 08 00 02 lui $8, 2
# ^-- %hi(0x47ff0-0x2000c)
# EXE-NEXT: 20010: 21 08 7f e4 addi $8, $8, 32740
# ^-- %lo(0x37ff0-0x20010+4)
# ^-- %lo(0x47ff0-0x20010+4)
# EXE: SYMBOL TABLE:
# EXE: 0002000c .text 00000000 bar
# EXE: 00037ff0 *ABS* 00000000 .hidden _gp
# EXE: 00047ff0 *ABS* 00000000 .hidden _gp
# EXE: 00020000 .text 00000000 __start
# SO: Disassembly of section .text:
# SO-NEXT: __start:
# SO-NEXT: 10000: 3c 08 00 01 lui $8, 1
# ^-- %hi(0x27ff0-0x10000)
# SO-NEXT: 10000: 3c 08 00 02 lui $8, 2
# ^-- %hi(0x37ff0-0x10000)
# SO-NEXT: 10004: 21 08 7f f0 addi $8, $8, 32752
# ^-- %lo(0x27ff0-0x10004+4)
# ^-- %lo(0x37ff0-0x10004+4)
# SO: bar:
# SO-NEXT: 1000c: 3c 08 00 01 lui $8, 1
# ^-- %hi(0x27ff0-0x1000c)
# SO-NEXT: 1000c: 3c 08 00 02 lui $8, 2
# ^-- %hi(0x37ff0-0x1000c)
# SO-NEXT: 10010: 21 08 7f e4 addi $8, $8, 32740
# ^-- %lo(0x27ff0-0x10010+4)
# ^-- %lo(0x37ff0-0x10010+4)
# SO: SYMBOL TABLE:
# SO: 0001000c .text 00000000 bar
# SO: 00027ff0 *ABS* 00000000 .hidden _gp
# SO: 00037ff0 *ABS* 00000000 .hidden _gp
# SO: 00010000 .text 00000000 __start

View File

@ -34,20 +34,20 @@ g1:
# CHECK-NEXT: __start:
# CHECK-NEXT: 20000: 3c 08 00 02 lui $8, 2
# ^-- %hi(__start+4)
# CHECK-NEXT: 20004: 3c 09 00 04 lui $9, 4
# CHECK-NEXT: 20004: 3c 09 00 03 lui $9, 3
# ^-- %hi(g1+8)
# CHECK-NEXT: 20008: 21 08 00 04 addi $8, $8, 4
# ^-- %lo(__start+4)
# CHECK-NEXT: 2000c: 21 08 00 0c addi $8, $8, 12
# ^-- %lo(g1+8)
# CHECK-NEXT: 20010: 3c 08 00 05 lui $8, 5
# CHECK-NEXT: 20010: 3c 08 00 04 lui $8, 4
# ^-- %hi(l1+0x10000-4)
# CHECK-NEXT: 20014: 3c 09 00 06 lui $9, 6
# CHECK-NEXT: 20014: 3c 09 00 05 lui $9, 5
# ^-- %hi(l1+0x20000-4)
# CHECK-NEXT: 20018: 21 08 ff fc addi $8, $8, -4
# ^-- %lo(l1-4)
# CHECK: SYMBOL TABLE:
# CHECK: 0040000 l .data 00000004 l1
# CHECK: 0030000 l .data 00000004 l1
# CHECK: 0020000 .text 00000000 __start
# CHECK: 0040004 g .data 00000004 g1
# CHECK: 0030004 g .data 00000004 g1

View File

@ -17,11 +17,11 @@ __start:
lui $gp, %hi(%neg(%gp_rel(g1)))
# CHECK: Name: _gp
# CHECK-NEXT: Value: 0x100008250
# CHECK-NEXT: Value: 0x100008258
# CHECK: MIPS Options {
# CHECK-NEXT: ODK_REGINFO {
# CHECK-NEXT: GP: 0x100008250
# CHECK-NEXT: GP: 0x100008258
# CHECK-NEXT: General Mask: 0x10000001
# CHECK-NEXT: Co-Proc Mask0: 0x0
# CHECK-NEXT: Co-Proc Mask1: 0x0

View File

@ -38,8 +38,8 @@ __start:
# ^-- %lo(0x20020-0x20014)
# CHECK: Contents of section .data:
# CHECK-NEXT: 40000 fffe0028 00000000 00000000 00000000
# ^-- 0x20020 + 8 - 0x40000
# CHECK-NEXT: 30000 ffff0028 00000000 00000000 00000000
# ^-- 0x20020 + 8 - 0x30000
# CHECK: 00020000 .text 00000000 __start
# CHECK: 00020020 .text 00000000 _foo

View File

@ -18,7 +18,7 @@
#
# CHECK-NEXT: Disassembly of section .plt:
# CHECK-NEXT: .plt:
# CHECK-NEXT: 20010: 3c 1c 00 04 aui $zero, $gp, 4
# CHECK-NEXT: 20010: 3c 1c 00 03 aui $zero, $gp, 3
# CHECK-NEXT: 20014: 8f 99 00 04 lw $25, 4($gp)
# CHECK-NEXT: 20018: 27 9c 00 04 addiu $gp, $gp, 4
# CHECK-NEXT: 2001c: 03 1c c0 23 subu $24, $24, $gp
@ -27,7 +27,7 @@
# CHECK-NEXT: 20028: 03 20 f8 09 jalr $25
# CHECK-NEXT: 2002c: 27 18 ff fe addiu $24, $24, -2
# CHECK-NEXT: 20030: 3c 0f 00 04 aui $zero, $15, 4
# CHECK-NEXT: 20030: 3c 0f 00 03 aui $zero, $15, 3
# CHECK-NEXT: 20034: 8d f9 00 0c lw $25, 12($15)
# CHECK-NEXT: 20038: 03 20 00 09 jr $25
# CHECK-NEXT: 2003c: 25 f8 00 0c addiu $24, $15, 12

View File

@ -23,26 +23,26 @@
# DIS-NEXT: 20010: 24 62 80 58 addiu $2, $3, -32680
# DIS: Contents of section .got:
# DIS-NEXT: 30008 00000000 00000000 80000000 00000000
# DIS-NEXT: 30018 00000000 00000000 00000000 00000000
# DIS-NEXT: 30028 00000000 00000000 00000000 00000001
# DIS-NEXT: 30038 00000000 00000000 00000000 00000001
# DIS-NEXT: 30048 ffffffff ffff8004 ffffffff ffff9004
# DIS-NEXT: 40008 00000000 00000000 80000000 00000000
# DIS-NEXT: 40018 00000000 00000000 00000000 00000000
# DIS-NEXT: 40028 00000000 00000000 00000000 00000001
# DIS-NEXT: 40038 00000000 00000000 00000000 00000001
# DIS-NEXT: 40048 ffffffff ffff8004 ffffffff ffff9004
# DIS: 0000000000030000 l .tdata 00000000 .tdata
# DIS: 0000000000030000 l .tdata 00000000 loc
# DIS: 0000000000040000 l .tdata 00000000 .tdata
# DIS: 0000000000040000 l .tdata 00000000 loc
# DIS: 0000000000000004 g .tdata 00000000 bar
# DIS: 0000000000000000 g *UND* 00000000 foo
# CHECK: Relocations [
# CHECK-NEXT: Section (7) .rela.dyn {
# CHECK-NEXT: 0x30018 R_MIPS_TLS_DTPMOD64/R_MIPS_NONE/R_MIPS_NONE foo 0x0
# CHECK-NEXT: 0x30020 R_MIPS_TLS_DTPREL64/R_MIPS_NONE/R_MIPS_NONE foo 0x0
# CHECK-NEXT: 0x30028 R_MIPS_TLS_TPREL64/R_MIPS_NONE/R_MIPS_NONE foo 0x0
# CHECK-NEXT: 0x40018 R_MIPS_TLS_DTPMOD64/R_MIPS_NONE/R_MIPS_NONE foo 0x0
# CHECK-NEXT: 0x40020 R_MIPS_TLS_DTPREL64/R_MIPS_NONE/R_MIPS_NONE foo 0x0
# CHECK-NEXT: 0x40028 R_MIPS_TLS_TPREL64/R_MIPS_NONE/R_MIPS_NONE foo 0x0
# CHECK-NEXT: }
# CHECK-NEXT: ]
# CHECK-NEXT: Primary GOT {
# CHECK-NEXT: Canonical gp value: 0x37FF8
# CHECK-NEXT: Canonical gp value: 0x47FF8
# CHECK-NEXT: Reserved entries [
# CHECK: ]
# CHECK-NEXT: Local entries [

View File

@ -8,8 +8,8 @@
# REQUIRES: mips
# CHECK: Contents of section .data:
# CHECK-NEXT: 40000 00020004 ffffffff ffff8004 ffffffff
# CHECK-NEXT: 40010 ffff9004
# CHECK-NEXT: 30000 00020004 ffffffff ffff8004 ffffffff
# CHECK-NEXT: 30010 ffff9004
#
# CHECK: SYMBOL TABLE:
# CHECK: 0000000000020004 .text 00000000 __tls_get_addr

View File

@ -7,11 +7,11 @@
# REQUIRES: mips
# CHECK: Contents of section .got:
# CHECK-NEXT: 30008 00000000 80000000 00000001 ffff8000
# CHECK-NEXT: 30018 00000001 00000000 ffff9000
# CHECK: Contents of section .data:
# CHECK-NEXT: 40000 0002000c ffff8004 ffff9004
# CHECK-NEXT: 30000 0002000c ffff8004 ffff9004
# CHECK: Contents of section .got:
# CHECK-NEXT: 40008 00000000 80000000 00000001 ffff8000
# CHECK-NEXT: 40018 00000001 00000000 ffff9000
#
# CHECK: SYMBOL TABLE:
# CHECK: 0002000c .text 00000000 __tls_get_addr

View File

@ -23,24 +23,24 @@
# DIS-NEXT: 20010: 24 62 80 34 addiu $2, $3, -32716
# DIS: Contents of section .got:
# DIS-NEXT: 30008 00000000 80000000 00000000 00000000
# DIS-NEXT: 30018 00000000 00000001 00000000 00000001
# DIS-NEXT: 30028 ffff8004 ffff9004
# DIS-NEXT: 40008 00000000 80000000 00000000 00000000
# DIS-NEXT: 40018 00000000 00000001 00000000 00000001
# DIS-NEXT: 40028 ffff8004 ffff9004
# DIS: 00030000 l .tdata 00000000 .tdata
# DIS: 00030000 l .tdata 00000000 loc
# DIS: 00040000 l .tdata 00000000 .tdata
# DIS: 00040000 l .tdata 00000000 loc
# DIS: 00000004 g .tdata 00000000 bar
# DIS: 00000000 g *UND* 00000000 foo
# CHECK: Relocations [
# CHECK-NEXT: Section (7) .rel.dyn {
# CHECK-NEXT: 0x30010 R_MIPS_TLS_DTPMOD32 foo 0x0
# CHECK-NEXT: 0x30014 R_MIPS_TLS_DTPREL32 foo 0x0
# CHECK-NEXT: 0x30018 R_MIPS_TLS_TPREL32 foo 0x0
# CHECK-NEXT: 0x40010 R_MIPS_TLS_DTPMOD32 foo 0x0
# CHECK-NEXT: 0x40014 R_MIPS_TLS_DTPREL32 foo 0x0
# CHECK-NEXT: 0x40018 R_MIPS_TLS_TPREL32 foo 0x0
# CHECK-NEXT: }
# CHECK-NEXT: ]
# CHECK-NEXT: Primary GOT {
# CHECK-NEXT: Canonical gp value: 0x37FF8
# CHECK-NEXT: Canonical gp value: 0x47FF8
# CHECK-NEXT: Reserved entries [
# CHECK: ]
# CHECK-NEXT: Local entries [

View File

@ -20,15 +20,15 @@
# CHECK-NEXT: 20018: 20 42 00 00 addi $2, $2, 0
# CHECK: Contents of section .got:
# CHECK-NEXT: 30000 00000000 80000000 00040000 00050000
# CHECK-NEXT: 40000 00000000 80000000 00030000 00040000
# ^ %hi(loc)
# ^ redundant entry
# CHECK-NEXT: 30010 00020010 00020000 00040000
# CHECK-NEXT: 40010 00020010 00020000 00030000
# ^ %got(bar)
# ^ %got_hi/lo(start)
# ^ %got_hi/lo(loc)
# CHECK: 00040000 .data 00000000 loc
# CHECK: 00030000 .data 00000000 loc
# CHECK: 00020000 .text 00000000 __start
# CHECK: 00020010 .text 00000000 bar

View File

@ -31,7 +31,7 @@
// CHECKDSO-NEXT: SHF_ALLOC
// CHECKDSO-NEXT: SHF_WRITE
// CHECKDSO-NEXT: ]
// CHECKDSO-NEXT: Address: 0x30000
// CHECKDSO-NEXT: Address: 0x20000
// CHECKDSO-NEXT: Offset:
// CHECKDSO-NEXT: Size: 48
// CHECKDSO-NEXT: Link:
@ -41,23 +41,23 @@
// CHECKDSO: Relocations [
// CHECKDSO-NEXT: Section ({{.*}}) .rela.plt {
// &(.got.plt[3]) = 0x30000 + 3 * 8 = 0x30018
// CHECKDSO-NEXT: 0x30018 R_AARCH64_JUMP_SLOT foo
// &(.got.plt[3]) = 0x20000 + 3 * 8 = 0x30018
// CHECKDSO-NEXT: 0x20018 R_AARCH64_JUMP_SLOT foo
// &(.got.plt[4]) = 0x30000 + 4 * 8 = 0x30020
// CHECKDSO-NEXT: 0x30020 R_AARCH64_JUMP_SLOT bar
// &(.got.plt[4]) = 0x20000 + 4 * 8 = 0x30020
// CHECKDSO-NEXT: 0x20020 R_AARCH64_JUMP_SLOT bar
// &(.got.plt[5]) = 0x30000 + 5 * 8 = 0x30028
// CHECKDSO-NEXT: 0x30028 R_AARCH64_JUMP_SLOT weak
// &(.got.plt[5]) = 0x20000 + 5 * 8 = 0x30028
// CHECKDSO-NEXT: 0x20028 R_AARCH64_JUMP_SLOT weak
// CHECKDSO-NEXT: }
// CHECKDSO-NEXT: ]
// DUMPDSO: Contents of section .got.plt:
// .got.plt[0..2] = 0 (reserved)
// .got.plt[3..5] = .plt = 0x10010
// DUMPDSO-NEXT: 30000 00000000 00000000 00000000 00000000 ................
// DUMPDSO-NEXT: 30010 00000000 00000000 10000100 00000000 ................
// DUMPDSO-NEXT: 30020 10000100 00000000 10000100 00000000 ................
// DUMPDSO-NEXT: 20000 00000000 00000000 00000000 00000000 ................
// DUMPDSO-NEXT: 20010 00000000 00000000 10000100 00000000 ................
// DUMPDSO-NEXT: 20020 10000100 00000000 10000100 00000000 ................
// DISASMDSO: _start:
// 0x10030 - 0x10000 = 0x30 = 48
@ -74,8 +74,8 @@
// DISASMDSO-NEXT: .plt:
// DISASMDSO-NEXT: 10010: f0 7b bf a9 stp x16, x30, [sp, #-16]!
// &(.got.plt[2]) = 0x3000 + 2 * 8 = 0x3010
// Page(0x30010) - Page(0x10014) = 0x30000 - 0x10000 = 0x20000 = 131072
// DISASMDSO-NEXT: 10014: 10 01 00 90 adrp x16, #131072
// Page(0x20010) - Page(0x10014) = 0x20000 - 0x10000 = 0x10000 = 65536
// DISASMDSO-NEXT: 10014: 90 00 00 90 adrp x16, #65536
// 0x3010 & 0xFFF = 0x10 = 16
// DISASMDSO-NEXT: 10018: 11 0a 40 f9 ldr x17, [x16, #16]
// DISASMDSO-NEXT: 1001c: 10 42 00 91 add x16, x16, #16
@ -85,24 +85,24 @@
// DISASMDSO-NEXT: 1002c: 1f 20 03 d5 nop
// foo@plt
// Page(0x30018) - Page(0x10030) = 0x30000 - 0x10000 = 0x20000 = 131072
// DISASMDSO-NEXT: 10030: 10 01 00 90 adrp x16, #131072
// Page(0x30018) - Page(0x10030) = 0x20000 - 0x10000 = 0x10000 = 65536
// DISASMDSO-NEXT: 10030: 90 00 00 90 adrp x16, #65536
// 0x3018 & 0xFFF = 0x18 = 24
// DISASMDSO-NEXT: 10034: 11 0e 40 f9 ldr x17, [x16, #24]
// DISASMDSO-NEXT: 10038: 10 62 00 91 add x16, x16, #24
// DISASMDSO-NEXT: 1003c: 20 02 1f d6 br x17
// bar@plt
// Page(0x30020) - Page(0x10040) = 0x30000 - 0x10000 = 0x20000 = 131072
// DISASMDSO-NEXT: 10040: 10 01 00 90 adrp x16, #131072
// Page(0x30020) - Page(0x10040) = 0x20000 - 0x10000 = 0x10000 = 65536
// DISASMDSO-NEXT: 10040: 90 00 00 90 adrp x16, #65536
// 0x3020 & 0xFFF = 0x20 = 32
// DISASMDSO-NEXT: 10044: 11 12 40 f9 ldr x17, [x16, #32]
// DISASMDSO-NEXT: 10048: 10 82 00 91 add x16, x16, #32
// DISASMDSO-NEXT: 1004c: 20 02 1f d6 br x17
// weak@plt
// Page(0x30028) - Page(0x10050) = 0x30000 - 0x10000 = 0x20000 = 131072
// DISASMDSO-NEXT: 10050: 10 01 00 90 adrp x16, #131072
// Page(0x30028) - Page(0x10050) = 0x20000 - 0x10000 = 0x10000 = 65536
// DISASMDSO-NEXT: 10050: 90 00 00 90 adrp x16, #65536
// 0x3028 & 0xFFF = 0x28 = 40
// DISASMDSO-NEXT: 10054: 11 16 40 f9 ldr x17, [x16, #40]
// DISASMDSO-NEXT: 10058: 10 a2 00 91 add x16, x16, #40
@ -127,7 +127,7 @@
// CHECKEXE-NEXT: SHF_ALLOC
// CHECKEXE-NEXT: SHF_WRITE
// CHECKEXE-NEXT: ]
// CHECKEXE-NEXT: Address: 0x40000
// CHECKEXE-NEXT: Address: 0x30000
// CHECKEXE-NEXT: Offset:
// CHECKEXE-NEXT: Size: 40
// CHECKEXE-NEXT: Link:
@ -137,20 +137,20 @@
// CHECKEXE: Relocations [
// CHECKEXE-NEXT: Section ({{.*}}) .rela.plt {
// &(.got.plt[3]) = 0x13000 + 3 * 8 = 0x13018
// CHECKEXE-NEXT: 0x40018 R_AARCH64_JUMP_SLOT bar 0x0
// &(.got.plt[3]) = 0x30000 + 3 * 8 = 0x30018
// CHECKEXE-NEXT: 0x30018 R_AARCH64_JUMP_SLOT bar 0x0
// &(.got.plt[4]) = 0x13000 + 4 * 8 = 0x13020
// CHECKEXE-NEXT: 0x40020 R_AARCH64_JUMP_SLOT weak 0x0
// &(.got.plt[4]) = 0x30000 + 4 * 8 = 0x30020
// CHECKEXE-NEXT: 0x30020 R_AARCH64_JUMP_SLOT weak 0x0
// CHECKEXE-NEXT: }
// CHECKEXE-NEXT: ]
// DUMPEXE: Contents of section .got.plt:
// .got.plt[0..2] = 0 (reserved)
// .got.plt[3..4] = .plt = 0x40010
// DUMPEXE-NEXT: 40000 00000000 00000000 00000000 00000000 ................
// DUMPEXE-NEXT: 40010 00000000 00000000 10000200 00000000 ................
// DUMPEXE-NEXT: 40020 10000200 00000000 ........
// DUMPEXE-NEXT: 30000 00000000 00000000 00000000 00000000 ................
// DUMPEXE-NEXT: 30010 00000000 00000000 10000200 00000000 ................
// DUMPEXE-NEXT: 30020 10000200 00000000 ........
// DISASMEXE: _start:
// 0x2000c - 0x20000 = 0xc = 12
@ -167,8 +167,8 @@
// DISASMEXE-NEXT: .plt:
// DISASMEXE-NEXT: 20010: f0 7b bf a9 stp x16, x30, [sp, #-16]!
// &(.got.plt[2]) = 0x300B0 + 2 * 8 = 0x300C0
// Page(0x40010) - Page(0x20014) = 0x40000 - 0x20000 = 0x20000 = 131072
// DISASMEXE-NEXT: 20014: 10 01 00 90 adrp x16, #131072
// Page(0x30010) - Page(0x20014) = 0x30000 - 0x20000 = 0x10000 = 65536
// DISASMEXE-NEXT: 20014: 90 00 00 90 adrp x16, #65536
// 0x120c0 & 0xFFF = 0xC0 = 192
// DISASMEXE-NEXT: 20018: 11 0a 40 f9 ldr x17, [x16, #16]
// DISASMEXE-NEXT: 2001c: 10 42 00 91 add x16, x16, #16
@ -178,15 +178,15 @@
// DISASMEXE-NEXT: 2002c: 1f 20 03 d5 nop
// bar@plt
// Page(0x40018) - Page(0x20030) = 0x40000 - 0x20000 = 0x20000 = 131072
// DISASMEXE-NEXT: 20030: 10 01 00 90 adrp x16, #131072
// Page(0x40018) - Page(0x20030) = 0x30000 - 0x20000 = 0x10000 = 65536
// DISASMEXE-NEXT: 20030: 90 00 00 90 adrp x16, #65536
// DISASMEXE-NEXT: 20034: 11 0e 40 f9 ldr x17, [x16, #24]
// DISASMEXE-NEXT: 20038: 10 62 00 91 add x16, x16, #24
// DISASMEXE-NEXT: 2003c: 20 02 1f d6 br x17
// weak@plt
// Page(0x40020) - Page(0x20040) = 0x40000 - 0x20000 = 0x20000 = 131072
// DISASMEXE-NEXT: 20040: 10 01 00 90 adrp x16, #131072
// Page(0x40020) - Page(0x20040) = 0x30000 - 0x20000 = 0x10000 = 65536
// DISASMEXE-NEXT: 20040: 90 00 00 90 adrp x16, #65536
// DISASMEXE-NEXT: 20044: 11 12 40 f9 ldr x17, [x16, #32]
// DISASMEXE-NEXT: 20048: 10 82 00 91 add x16, x16, #32
// DISASMEXE-NEXT: 2004c: 20 02 1f d6 br x17

View File

@ -30,20 +30,20 @@
// CHECK-NEXT: SHF_ALLOC
// CHECK-NEXT: SHF_WRITE
// CHECK-NEXT: ]
// CHECK-NEXT: Address: 0x13000
// CHECK-NEXT: Offset: 0x3000
// CHECK-NEXT: Address: 0x12000
// CHECK-NEXT: Offset: 0x2000
// CHECK-NEXT: Size: 20
// CHECK-NEXT: Link: 0
// CHECK-NEXT: Info: 0
// CHECK-NEXT: AddressAlignment: 4
// CHECK-NEXT: EntrySize: 0
// 0x13000 + got.plt.reserved(12) = 0x1300C
// 0x13000 + got.plt.reserved(12) + 4 = 0x13010
// 0x12000 + got.plt.reserved(12) = 0x1200C
// 0x12000 + got.plt.reserved(12) + 4 = 0x12010
// CHECK: Relocations [
// CHECK-NEXT: Section ({{.*}}) .rel.plt {
// CHECK-NEXT: 0x1300C R_386_JUMP_SLOT bar 0x0
// CHECK-NEXT: 0x13010 R_386_JUMP_SLOT zed 0x0
// CHECK-NEXT: 0x1200C R_386_JUMP_SLOT bar 0x0
// CHECK-NEXT: 0x12010 R_386_JUMP_SLOT zed 0x0
// CHECK-NEXT: }
// CHECK-NEXT: ]
@ -73,16 +73,16 @@
// 77840 = 0x13010 = .got.plt (0x13000) + got.plt.reserved(12) + 4
// DISASM: Disassembly of section .plt:
// DISASM-NEXT: .plt:
// DISASM-NEXT: 11020: ff 35 04 30 01 00 pushl 77828
// DISASM-NEXT: 11026: ff 25 08 30 01 00 jmpl *77832
// DISASM-NEXT: 11020: ff 35 04 20 01 00 pushl 73732
// DISASM-NEXT: 11026: ff 25 08 20 01 00 jmpl *73736
// DISASM-NEXT: 1102c: 90 nop
// DISASM-NEXT: 1102d: 90 nop
// DISASM-NEXT: 1102e: 90 nop
// DISASM-NEXT: 1102f: 90 nop
// DISASM-NEXT: 11030: ff 25 0c 30 01 00 jmpl *77836
// DISASM-NEXT: 11030: ff 25 0c 20 01 00 jmpl *73740
// DISASM-NEXT: 11036: 68 00 00 00 00 pushl $0
// DISASM-NEXT: 1103b: e9 e0 ff ff ff jmp -32 <.plt>
// DISASM-NEXT: 11040: ff 25 10 30 01 00 jmpl *77840
// DISASM-NEXT: 11040: ff 25 10 20 01 00 jmpl *73744
// DISASM-NEXT: 11046: 68 08 00 00 00 pushl $8
// DISASM-NEXT: 1104b: e9 d0 ff ff ff jmp -48 <.plt>
@ -106,8 +106,8 @@
// CHECKSHARED-NEXT: SHF_ALLOC
// CHECKSHARED-NEXT: SHF_WRITE
// CHECKSHARED-NEXT: ]
// CHECKSHARED-NEXT: Address: 0x3000
// CHECKSHARED-NEXT: Offset: 0x3000
// CHECKSHARED-NEXT: Address: 0x2000
// CHECKSHARED-NEXT: Offset: 0x2000
// CHECKSHARED-NEXT: Size: 20
// CHECKSHARED-NEXT: Link: 0
// CHECKSHARED-NEXT: Info: 0
@ -115,12 +115,12 @@
// CHECKSHARED-NEXT: EntrySize: 0
// CHECKSHARED-NEXT: }
// 0x3000 + got.plt.reserved(12) = 0x300C
// 0x3000 + got.plt.reserved(12) + 4 = 0x3010
// 0x2000 + got.plt.reserved(12) = 0x200C
// 0x2000 + got.plt.reserved(12) + 4 = 0x2010
// CHECKSHARED: Relocations [
// CHECKSHARED-NEXT: Section ({{.*}}) .rel.plt {
// CHECKSHARED-NEXT: 0x300C R_386_JUMP_SLOT bar 0x0
// CHECKSHARED-NEXT: 0x3010 R_386_JUMP_SLOT zed 0x0
// CHECKSHARED-NEXT: 0x200C R_386_JUMP_SLOT bar 0x0
// CHECKSHARED-NEXT: 0x2010 R_386_JUMP_SLOT zed 0x0
// CHECKSHARED-NEXT: }
// CHECKSHARED-NEXT: ]
@ -156,10 +156,10 @@
// DISASMPIE-NEXT: 102d: 90 nop
// DISASMPIE-NEXT: 102e: 90 nop
// DISASMPIE-NEXT: 102f: 90 nop
// DISASMPIE-NEXT: 1030: ff a3 0c 30 00 00 jmpl *12300(%ebx)
// DISASMPIE-NEXT: 1030: ff a3 0c 20 00 00 jmpl *8204(%ebx)
// DISASMPIE-NEXT: 1036: 68 00 00 00 00 pushl $0
// DISASMPIE-NEXT: 103b: e9 e0 ff ff ff jmp -32 <.plt>
// DISASMPIE-NEXT: 1040: ff a3 10 30 00 00 jmpl *12304(%ebx)
// DISASMPIE-NEXT: 1040: ff a3 10 20 00 00 jmpl *8208(%ebx)
// DISASMPIE-NEXT: 1046: 68 08 00 00 00 pushl $8
// DISASMPIE-NEXT: 104b: e9 d0 ff ff ff jmp -48 <.plt>

View File

@ -25,9 +25,9 @@
// CHECK: Relocations [
// CHECK-NEXT: Section ({{.*}}) .rela.plt {
// CHECK-NEXT: 0x3018 R_X86_64_JUMP_SLOT bar 0x0
// CHECK-NEXT: 0x3020 R_X86_64_JUMP_SLOT zed 0x0
// CHECK-NEXT: 0x3028 R_X86_64_JUMP_SLOT _start 0x0
// CHECK-NEXT: 0x2018 R_X86_64_JUMP_SLOT bar 0x0
// CHECK-NEXT: 0x2020 R_X86_64_JUMP_SLOT zed 0x0
// CHECK-NEXT: 0x2028 R_X86_64_JUMP_SLOT _start 0x0
// CHECK-NEXT: }
// CHECK-NEXT: ]
@ -46,8 +46,8 @@
// CHECK2: Relocations [
// CHECK2-NEXT: Section ({{.*}}) .rela.plt {
// CHECK2-NEXT: 0x203018 R_X86_64_JUMP_SLOT bar 0x0
// CHECK2-NEXT: 0x203020 R_X86_64_JUMP_SLOT zed 0x0
// CHECK2-NEXT: 0x202018 R_X86_64_JUMP_SLOT bar 0x0
// CHECK2-NEXT: 0x202020 R_X86_64_JUMP_SLOT zed 0x0
// CHECK2-NEXT: }
// CHECK2-NEXT: ]
@ -65,22 +65,22 @@
// DISASM-NEXT: 100a: e9 {{.*}} jmp 49
// DISASM-NEXT: 100f: e9 {{.*}} jmp 60
// 0x3018 - 0x1036 = 8162
// 0x3020 - 0x1046 = 4234
// 0x3028 - 0x1056 = 4226
// 0x2018 - 0x1036 = 4066
// 0x2020 - 0x1046 = 4058
// 0x2028 - 0x1056 = 4050
// DISASM: Disassembly of section .plt:
// DISASM-NEXT: .plt:
// DISASM-NEXT: 1020: ff 35 e2 1f 00 00 pushq 8162(%rip)
// DISASM-NEXT: 1026: ff 25 e4 1f 00 00 jmpq *8164(%rip)
// DISASM-NEXT: 1020: ff 35 e2 0f 00 00 pushq 4066(%rip)
// DISASM-NEXT: 1026: ff 25 e4 0f 00 00 jmpq *4068(%rip)
// DISASM-NEXT: 102c: 0f 1f 40 00 nopl (%rax)
// DISASM-NEXT: 1030: ff 25 e2 1f 00 00 jmpq *8162(%rip)
// DISASM-NEXT: 1030: ff 25 e2 0f 00 00 jmpq *4066(%rip)
// DISASM-NEXT: 1036: 68 00 00 00 00 pushq $0
// DISASM-NEXT: 103b: e9 e0 ff ff ff jmp -32 <.plt>
// DISASM-NEXT: 1040: ff 25 da 1f 00 00 jmpq *8154(%rip)
// DISASM-NEXT: 1040: ff 25 da 0f 00 00 jmpq *4058(%rip)
// DISASM-NEXT: 1046: 68 01 00 00 00 pushq $1
// DISASM-NEXT: 104b: e9 d0 ff ff ff jmp -48 <.plt>
// DISASM-NEXT: 1050: ff 25 d2 1f 00 00 jmpq *8146(%rip)
// DISASM-NEXT: 1050: ff 25 d2 0f 00 00 jmpq *4050(%rip)
// DISASM-NEXT: 1056: 68 02 00 00 00 pushq $2
// DISASM-NEXT: 105b: e9 c0 ff ff ff jmp -64 <.plt>
@ -95,18 +95,18 @@
// DISASM2-NEXT: 20100a: e9 {{.*}} jmp 49
// DISASM2-NEXT: 20100f: e9 {{.*}} jmp -20
// 0x203018 - 0x201036 = 4242
// 0x203020 - 0x201046 = 4234
// 0x202018 - 0x201036 = 4066
// 0x202020 - 0x201046 = 4058
// DISASM2: Disassembly of section .plt:
// DISASM2-NEXT: .plt:
// DISASM2-NEXT: 201020: ff 35 e2 1f 00 00 pushq 8162(%rip)
// DISASM2-NEXT: 201026: ff 25 e4 1f 00 00 jmpq *8164(%rip)
// DISASM2-NEXT: 201020: ff 35 e2 0f 00 00 pushq 4066(%rip)
// DISASM2-NEXT: 201026: ff 25 e4 0f 00 00 jmpq *4068(%rip)
// DISASM2-NEXT: 20102c: 0f 1f 40 00 nopl (%rax)
// DISASM2-NEXT: 201030: ff 25 e2 1f 00 00 jmpq *8162(%rip)
// DISASM2-NEXT: 201030: ff 25 e2 0f 00 00 jmpq *4066(%rip)
// DISASM2-NEXT: 201036: 68 00 00 00 00 pushq $0
// DISASM2-NEXT: 20103b: e9 e0 ff ff ff jmp -32 <.plt>
// DISASM2-NEXT: 201040: ff 25 da 1f 00 00 jmpq *8154(%rip)
// DISASM2-NEXT: 201040: ff 25 da 0f 00 00 jmpq *4058(%rip)
// DISASM2-NEXT: 201046: 68 01 00 00 00 pushq $1
// DISASM2-NEXT: 20104b: e9 d0 ff ff ff jmp -48 <.plt>
// DISASM2-NOT: 2010C0

View File

@ -43,7 +43,7 @@ _start:
# CHECK: Disassembly of section .R_PPC64_TOC16_HI:
# CHECK: .FR_PPC64_TOC16_HI:
# CHECK: 10010014: 3c 22 ff ff addis 1, 2, -1
# CHECK: 10010014: 3c 22 ff fe addis 1, 2, -2
.section .R_PPC64_TOC16_HA,"ax",@progbits
.globl .FR_PPC64_TOC16_HA
@ -52,7 +52,7 @@ _start:
# CHECK: Disassembly of section .R_PPC64_TOC16_HA:
# CHECK: .FR_PPC64_TOC16_HA:
# CHECK: 10010018: 3c 22 00 00 addis 1, 2, 0
# CHECK: 10010018: 3c 22 ff ff addis 1, 2, -1
.section .R_PPC64_REL24,"ax",@progbits
.globl .FR_PPC64_REL24

View File

@ -19,9 +19,9 @@ foo: # @foo
.Lfunc_begin0:
blr
// CHECK: 0x30000 R_PPC64_RELATIVE - 0x10000
// CHECK: 0x30008 R_PPC64_RELATIVE - 0x8000
// CHECK: 0x20000 R_PPC64_RELATIVE - 0x10000
// CHECK: 0x20008 R_PPC64_RELATIVE - 0x8000
// CHECK: Name: foo
// CHECK-NEXT: Value: 0x30000
// CHECK-NEXT: Value: 0x20000

View File

@ -53,7 +53,7 @@ last:
// CHECK: Disassembly of section .plt:
// CHECK: .plt:
// CHECK: 10010020: f8 41 00 28 std 2, 40(1)
// CHECK: 10010024: 3d 62 10 03 addis 11, 2, 4099
// CHECK: 10010024: 3d 62 10 02 addis 11, 2, 4098
// CHECK: 10010028: e9 8b 80 18 ld 12, -32744(11)
// CHECK: 1001002c: e9 6c 00 00 ld 11, 0(12)
// CHECK: 10010030: 7d 69 03 a6 mtctr 11

View File

@ -10,6 +10,6 @@
.quad foo
// CHECK: Section ({{.*}}) .rela.dyn {
// CHECK-NEXT: 0x2000 R_X86_64_64 foo 0x0
// CHECK-NEXT: 0x2008 R_X86_64_64 foo 0x0
// CHECK-NEXT: 0x1000 R_X86_64_64 foo 0x0
// CHECK-NEXT: 0x1008 R_X86_64_64 foo 0x0
// CHECK-NEXT: }

View File

@ -5,9 +5,9 @@
## Test that we create R_X86_64_RELATIVE relocations with -pie.
# CHECK: Relocations [
# CHECK-NEXT: Section ({{.*}}) .rela.dyn {
# CHECK-NEXT: 0x3000 R_X86_64_RELATIVE - 0x3000
# CHECK-NEXT: 0x3008 R_X86_64_RELATIVE - 0x3008
# CHECK-NEXT: 0x3010 R_X86_64_RELATIVE - 0x3009
# CHECK-NEXT: 0x2000 R_X86_64_RELATIVE - 0x2000
# CHECK-NEXT: 0x2008 R_X86_64_RELATIVE - 0x2008
# CHECK-NEXT: 0x2010 R_X86_64_RELATIVE - 0x2009
# CHECK-NEXT: }
# CHECK-NEXT: ]

View File

@ -10,10 +10,10 @@
// CHECK-NEXT: Section ({{.*}}) .rela.dyn {
// CHECK-NEXT: 0x[[FOO_ADDR:.*]] R_PPC64_RELATIVE - 0x[[FOO_ADDR]]
// CHECK-NEXT: 0x[[BAR_ADDR:.*]] R_PPC64_RELATIVE - 0x[[BAR_ADDR]]
// CHECK-NEXT: 0x20010 R_PPC64_RELATIVE - 0x20009
// CHECK-NEXT: 0x10010 R_PPC64_RELATIVE - 0x10009
// CHECK-NEXT: 0x{{.*}} R_PPC64_RELATIVE - 0x[[ZED_ADDR:.*]]
// CHECK-NEXT: 0x{{.*}} R_PPC64_RELATIVE - 0x[[FOO_ADDR]]
// CHECK-NEXT: 0x20028 R_PPC64_ADDR64 external 0x0
// CHECK-NEXT: 0x10028 R_PPC64_ADDR64 external 0x0
// CHECK-NEXT: }
// CHECK-NEXT: ]

View File

@ -9,10 +9,10 @@
// CHECK-NEXT: Section ({{.*}}) .rela.dyn {
// CHECK-NEXT: 0x[[FOO_ADDR:.*]] R_X86_64_RELATIVE - 0x[[FOO_ADDR]]
// CHECK-NEXT: 0x[[BAR_ADDR:.*]] R_X86_64_RELATIVE - 0x[[BAR_ADDR]]
// CHECK-NEXT: 0x2010 R_X86_64_RELATIVE - 0x2009
// CHECK-NEXT: 0x1010 R_X86_64_RELATIVE - 0x1009
// CHECK-NEXT: 0x{{.*}} R_X86_64_RELATIVE - 0x[[ZED_ADDR:.*]]
// CHECK-NEXT: 0x{{.*}} R_X86_64_RELATIVE - 0x[[FOO_ADDR]]
// CHECK-NEXT: 0x2028 R_X86_64_64 external 0x0
// CHECK-NEXT: 0x1028 R_X86_64_64 external 0x0
// CHECK-NEXT: }
// CHECK-NEXT: ]

Some files were not shown because too many files have changed in this diff Show More