From owner-svn-src-all@freebsd.org Wed Jan 4 22:11:53 2017 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 039FAC9FBB0; Wed, 4 Jan 2017 22:11:53 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id C44891E0A; Wed, 4 Jan 2017 22:11:52 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v04MBqli021295; Wed, 4 Jan 2017 22:11:52 GMT (envelope-from dim@FreeBSD.org) Received: (from dim@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id v04MBoFc021278; Wed, 4 Jan 2017 22:11:50 GMT (envelope-from dim@FreeBSD.org) Message-Id: <201701042211.v04MBoFc021278@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: dim set sender to dim@FreeBSD.org using -f From: Dimitry Andric Date: Wed, 4 Jan 2017 22:11:50 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-vendor@freebsd.org Subject: svn commit: r311323 - in vendor/lld/dist: COFF ELF test/COFF test/ELF X-SVN-Group: vendor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 04 Jan 2017 22:11:53 -0000 Author: dim Date: Wed Jan 4 22:11:50 2017 New Revision: 311323 URL: https://svnweb.freebsd.org/changeset/base/311323 Log: Vendor import of lld trunk r291012: https://llvm.org/svn/llvm-project/lld/trunk@291012 Added: vendor/lld/dist/test/ELF/arm-thumb-interwork-shared.s (contents, props changed) Modified: vendor/lld/dist/COFF/PDB.cpp vendor/lld/dist/COFF/PDB.h vendor/lld/dist/COFF/Writer.cpp vendor/lld/dist/ELF/InputFiles.cpp vendor/lld/dist/ELF/LTO.cpp vendor/lld/dist/ELF/LTO.h vendor/lld/dist/ELF/SymbolTable.cpp vendor/lld/dist/ELF/Symbols.cpp vendor/lld/dist/ELF/Symbols.h vendor/lld/dist/ELF/Target.cpp vendor/lld/dist/ELF/Thunks.cpp vendor/lld/dist/ELF/Writer.cpp vendor/lld/dist/test/COFF/pdb.test vendor/lld/dist/test/ELF/basic-mips.s vendor/lld/dist/test/ELF/basic-ppc.s vendor/lld/dist/test/ELF/string-table.s Modified: vendor/lld/dist/COFF/PDB.cpp ============================================================================== --- vendor/lld/dist/COFF/PDB.cpp Wed Jan 4 22:11:45 2017 (r311322) +++ vendor/lld/dist/COFF/PDB.cpp Wed Jan 4 22:11:50 2017 (r311323) @@ -13,6 +13,7 @@ #include "Error.h" #include "SymbolTable.h" #include "Symbols.h" +#include "llvm/DebugInfo/CodeView/CVDebugRecord.h" #include "llvm/DebugInfo/CodeView/SymbolDumper.h" #include "llvm/DebugInfo/CodeView/TypeDumper.h" #include "llvm/DebugInfo/MSF/ByteStream.h" @@ -131,7 +132,8 @@ static void addTypeInfo(SymbolTable *Sym // Creates a PDB file. void coff::createPDB(StringRef Path, SymbolTable *Symtab, - ArrayRef SectionTable) { + ArrayRef SectionTable, + const llvm::codeview::DebugInfo *DI) { if (Config->DumpPdb) dumpCodeView(Symtab); @@ -146,11 +148,9 @@ void coff::createPDB(StringRef Path, Sym // Add an Info stream. auto &InfoBuilder = Builder.getInfoBuilder(); - InfoBuilder.setAge(1); - - // Should be a random number, 0 for now. - InfoBuilder.setGuid({}); - + InfoBuilder.setAge(DI->PDB70.Age); + InfoBuilder.setGuid( + *reinterpret_cast(&DI->PDB70.Signature)); // Should be the current time, but set 0 for reproducibilty. InfoBuilder.setSignature(0); InfoBuilder.setVersion(pdb::PdbRaw_ImplVer::PdbImplVC70); Modified: vendor/lld/dist/COFF/PDB.h ============================================================================== --- vendor/lld/dist/COFF/PDB.h Wed Jan 4 22:11:45 2017 (r311322) +++ vendor/lld/dist/COFF/PDB.h Wed Jan 4 22:11:50 2017 (r311323) @@ -13,12 +13,19 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringRef.h" +namespace llvm { +namespace codeview { +union DebugInfo; +} +} + namespace lld { namespace coff { class SymbolTable; void createPDB(llvm::StringRef Path, SymbolTable *Symtab, - llvm::ArrayRef SectionTable); + llvm::ArrayRef SectionTable, + const llvm::codeview::DebugInfo *DI); } } Modified: vendor/lld/dist/COFF/Writer.cpp ============================================================================== --- vendor/lld/dist/COFF/Writer.cpp Wed Jan 4 22:11:45 2017 (r311322) +++ vendor/lld/dist/COFF/Writer.cpp Wed Jan 4 22:11:50 2017 (r311323) @@ -304,7 +304,7 @@ void Writer::run() { writeBuildId(); if (!Config->PDBPath.empty()) - createPDB(Config->PDBPath, Symtab, SectionTable); + createPDB(Config->PDBPath, Symtab, SectionTable, BuildId->DI); if (auto EC = Buffer->commit()) fatal(EC, "failed to write the output file"); Modified: vendor/lld/dist/ELF/InputFiles.cpp ============================================================================== --- vendor/lld/dist/ELF/InputFiles.cpp Wed Jan 4 22:11:45 2017 (r311322) +++ vendor/lld/dist/ELF/InputFiles.cpp Wed Jan 4 22:11:50 2017 (r311323) @@ -461,7 +461,7 @@ SymbolBody *elf::ObjectFile::creat StringRefZ Name = this->StringTable.data() + Sym->st_name; if (Sym->st_shndx == SHN_UNDEF) return new (BAlloc) - Undefined(Name, /*IsLocal=*/true, StOther, Type, this); + Undefined(Name, /*IsLocal=*/true, StOther, Type, this); return new (BAlloc) DefinedRegular(Name, /*IsLocal=*/true, StOther, Type, Value, Size, Sec, this); Modified: vendor/lld/dist/ELF/LTO.cpp ============================================================================== --- vendor/lld/dist/ELF/LTO.cpp Wed Jan 4 22:11:45 2017 (r311322) +++ vendor/lld/dist/ELF/LTO.cpp Wed Jan 4 22:11:50 2017 (r311323) @@ -96,12 +96,12 @@ BitcodeCompiler::BitcodeCompiler() : LTO BitcodeCompiler::~BitcodeCompiler() = default; -static void undefine(Symbol *S) { - replaceBody(S, S->body()->getName(), /*IsLocal=*/false, - STV_DEFAULT, S->body()->Type, nullptr); +template static void undefine(Symbol *S) { + replaceBody>(S, S->body()->getName(), /*IsLocal=*/false, + STV_DEFAULT, S->body()->Type, nullptr); } -void BitcodeCompiler::add(BitcodeFile &F) { +template void BitcodeCompiler::add(BitcodeFile &F) { lto::InputFile &Obj = *F.Obj; unsigned SymNum = 0; std::vector Syms = F.getSymbols(); @@ -126,7 +126,7 @@ void BitcodeCompiler::add(BitcodeFile &F R.VisibleToRegularObj = Sym->IsUsedInRegularObj || (R.Prevailing && Sym->includeInDynsym()); if (R.Prevailing) - undefine(Sym); + undefine(Sym); } checkError(LTOObj->add(std::move(F.Obj), Resols)); } @@ -157,3 +157,8 @@ std::vector BitcodeCompiler } return Ret; } + +template void BitcodeCompiler::template add(BitcodeFile &); +template void BitcodeCompiler::template add(BitcodeFile &); +template void BitcodeCompiler::template add(BitcodeFile &); +template void BitcodeCompiler::template add(BitcodeFile &); Modified: vendor/lld/dist/ELF/LTO.h ============================================================================== --- vendor/lld/dist/ELF/LTO.h Wed Jan 4 22:11:45 2017 (r311322) +++ vendor/lld/dist/ELF/LTO.h Wed Jan 4 22:11:50 2017 (r311323) @@ -43,7 +43,7 @@ public: BitcodeCompiler(); ~BitcodeCompiler(); - void add(BitcodeFile &F); + template void add(BitcodeFile &F); std::vector compile(); private: Modified: vendor/lld/dist/ELF/SymbolTable.cpp ============================================================================== --- vendor/lld/dist/ELF/SymbolTable.cpp Wed Jan 4 22:11:45 2017 (r311322) +++ vendor/lld/dist/ELF/SymbolTable.cpp Wed Jan 4 22:11:50 2017 (r311323) @@ -115,7 +115,7 @@ template void SymbolTableadd(*F); + LTO->add(*F); for (InputFile *File : LTO->compile()) { ObjectFile *Obj = cast>(File); @@ -256,7 +256,7 @@ Symbol *SymbolTable::addUndefined( insert(Name, Type, getVisibility(StOther), CanOmitFromDynSym, File); if (WasInserted) { S->Binding = Binding; - replaceBody(S, Name, IsLocal, StOther, Type, File); + replaceBody>(S, Name, IsLocal, StOther, Type, File); return S; } if (Binding != STB_WEAK) { @@ -432,7 +432,7 @@ void SymbolTable::addShared(Shared if (S->VersionId == VER_NDX_LOCAL) S->VersionId = VER_NDX_GLOBAL; } - if (WasInserted || isa(S->body())) { + if (WasInserted || isa>(S->body())) { replaceBody>(S, F, Name, Sym, Verdef); if (!S->isWeak()) F->IsUsed = true; Modified: vendor/lld/dist/ELF/Symbols.cpp ============================================================================== --- vendor/lld/dist/ELF/Symbols.cpp Wed Jan 4 22:11:45 2017 (r311322) +++ vendor/lld/dist/ELF/Symbols.cpp Wed Jan 4 22:11:50 2017 (r311323) @@ -173,6 +173,8 @@ template typename ELFT::uin return DR->ThunkData->getVA(); if (const auto *S = dyn_cast>(this)) return S->ThunkData->getVA(); + if (const auto *S = dyn_cast>(this)) + return S->ThunkData->getVA(); fatal("getThunkVA() not supported for Symbol class\n"); } @@ -232,8 +234,9 @@ template bool DefinedRegula (Section->getFile()->getObj().getHeader()->e_flags & EF_MIPS_PIC); } -Undefined::Undefined(StringRefZ Name, bool IsLocal, uint8_t StOther, - uint8_t Type, InputFile *File) +template +Undefined::Undefined(StringRefZ Name, bool IsLocal, uint8_t StOther, + uint8_t Type, InputFile *File) : SymbolBody(SymbolBody::UndefinedKind, Name, IsLocal, StOther, Type) { this->File = File; } @@ -354,6 +357,11 @@ template uint32_t SymbolBody::template g template uint64_t SymbolBody::template getSize() const; template uint64_t SymbolBody::template getSize() const; +template class elf::Undefined; +template class elf::Undefined; +template class elf::Undefined; +template class elf::Undefined; + template class elf::DefinedRegular; template class elf::DefinedRegular; template class elf::DefinedRegular; Modified: vendor/lld/dist/ELF/Symbols.h ============================================================================== --- vendor/lld/dist/ELF/Symbols.h Wed Jan 4 22:11:45 2017 (r311322) +++ vendor/lld/dist/ELF/Symbols.h Wed Jan 4 22:11:50 2017 (r311323) @@ -236,7 +236,7 @@ public: const OutputSectionBase *Section; }; -class Undefined : public SymbolBody { +template class Undefined : public SymbolBody { public: Undefined(StringRefZ Name, bool IsLocal, uint8_t StOther, uint8_t Type, InputFile *F); @@ -245,6 +245,12 @@ public: return S->kind() == UndefinedKind; } + // If non-null the symbol has a Thunk that may be used as an alternative + // destination for callers of this Symbol. When linking a DSO undefined + // symbols are implicitly imported, the symbol lookup will be performed by + // the dynamic loader. A call to an undefined symbol will be given a PLT + // entry and on ARM this may need a Thunk if the caller is in Thumb state. + Thunk *ThunkData = nullptr; InputFile *file() { return this->File; } }; @@ -416,7 +422,8 @@ struct Symbol { // ELFT, and we verify this with the static_asserts in replaceBody. llvm::AlignedCharArrayUnion< DefinedCommon, DefinedRegular, DefinedSynthetic, - Undefined, SharedSymbol, LazyArchive, LazyObject> + Undefined, SharedSymbol, + LazyArchive, LazyObject> Body; SymbolBody *body() { return reinterpret_cast(Body.buffer); } Modified: vendor/lld/dist/ELF/Target.cpp ============================================================================== --- vendor/lld/dist/ELF/Target.cpp Wed Jan 4 22:11:45 2017 (r311322) +++ vendor/lld/dist/ELF/Target.cpp Wed Jan 4 22:11:50 2017 (r311323) @@ -1730,8 +1730,11 @@ void ARMTargetInfo::writePlt(uint8_t *Bu RelExpr ARMTargetInfo::getThunkExpr(RelExpr Expr, uint32_t RelocType, const InputFile &File, const SymbolBody &S) const { - // If S is an undefined weak symbol we don't need a Thunk - if (S.isUndefined()) + // If S is an undefined weak symbol in an executable we don't need a Thunk. + // In a DSO calls to undefined symbols, including weak ones get PLT entries + // which may need a thunk. + if (S.isUndefined() && !S.isLocal() && S.symbol()->isWeak() + && !Config->Shared) return Expr; // A state change from ARM to Thumb and vice versa must go through an // interworking thunk if the relocation type is not R_ARM_CALL or Modified: vendor/lld/dist/ELF/Thunks.cpp ============================================================================== --- vendor/lld/dist/ELF/Thunks.cpp Wed Jan 4 22:11:45 2017 (r311322) +++ vendor/lld/dist/ELF/Thunks.cpp Wed Jan 4 22:11:50 2017 (r311323) @@ -226,6 +226,8 @@ static void addThunkARM(uint32_t Reloc, Sym->ThunkData = T; else if (auto *Sym = dyn_cast>(&S)) Sym->ThunkData = T; + else if (auto *Sym = dyn_cast>(&S)) + Sym->ThunkData = T; else fatal("symbol not DefinedRegular or Shared"); } Modified: vendor/lld/dist/ELF/Writer.cpp ============================================================================== --- vendor/lld/dist/ELF/Writer.cpp Wed Jan 4 22:11:45 2017 (r311322) +++ vendor/lld/dist/ELF/Writer.cpp Wed Jan 4 22:11:50 2017 (r311323) @@ -625,15 +625,12 @@ void PhdrEntry::add(OutputSectionBase *S } template -static Symbol *addOptionalSynthetic(StringRef Name, OutputSectionBase *Sec, - typename ELFT::uint Val, - uint8_t StOther = STV_HIDDEN) { - SymbolBody *S = Symtab::X->find(Name); - if (!S) - return nullptr; - if (!S->isUndefined() && !S->isShared()) - return S->symbol(); - return Symtab::X->addSynthetic(Name, Sec, Val, StOther); +static void addOptionalSynthetic(StringRef Name, OutputSectionBase *Sec, + typename ELFT::uint Val, + uint8_t StOther = STV_HIDDEN) { + if (SymbolBody *S = Symtab::X->find(Name)) + if (S->isUndefined() || S->isShared()) + Symtab::X->addSynthetic(Name, Sec, Val, StOther); } template @@ -1447,8 +1444,13 @@ template void Writer: } if (P.p_type == PT_LOAD) P.p_align = Config->MaxPageSize; - else if (P.p_type == PT_GNU_RELRO) + else if (P.p_type == PT_GNU_RELRO) { P.p_align = 1; + // The glibc dynamic loader rounds the size down, so we need to round up + // to protect the last page. This is a no-op on FreeBSD which always + // rounds up. + P.p_memsz = alignTo(P.p_memsz, Config->MaxPageSize); + } // The TLS pointer goes after PT_TLS. At least glibc will align it, // so round up the size to make sure the offsets are correct. Modified: vendor/lld/dist/test/COFF/pdb.test ============================================================================== --- vendor/lld/dist/test/COFF/pdb.test Wed Jan 4 22:11:45 2017 (r311322) +++ vendor/lld/dist/test/COFF/pdb.test Wed Jan 4 22:11:50 2017 (r311323) @@ -28,8 +28,13 @@ # 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 -# CHECK-NEXT: Guid: '{00000000-0000-0000-0000-000000000000}' +# Guid: '{389ACCF2-14A4-7FA2-6CF0-080447CF5C48}' +# CHECK-NEXT: Guid: '{{.*}}' # CHECK-NEXT: Signature: 0 # CHECK-NEXT: Version: VC70 # CHECK-NEXT: NamedStreams: Added: vendor/lld/dist/test/ELF/arm-thumb-interwork-shared.s ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ vendor/lld/dist/test/ELF/arm-thumb-interwork-shared.s Wed Jan 4 22:11:50 2017 (r311323) @@ -0,0 +1,44 @@ +// RUN: llvm-mc -filetype=obj -triple=thumbv7a-none-linux-gnueabi %s -o %t +// RUN: ld.lld %t --shared -o %t.so +// RUN: llvm-objdump -d -triple=thumbv7a-none-linux-gnueabi %t.so | FileCheck %s +// RUN: llvm-objdump -d -triple=armv7a-none-linux-gnueabi %t.so | FileCheck %s -check-prefix=PLT +// REQUIRES: arm + .syntax unified + .global sym1 + .global elsewhere + .weak weakref +sym1: + b.w elsewhere + b.w weakref + +// Check that we generate a thunk for an undefined symbol called via a plt +// entry. + +// CHECK: Disassembly of section .text: +// CHECK-NEXT: sym1: +// CHECK: 1000: 00 f0 02 b8 b.w #4 +// CHECK-NEXT: 1004: 00 f0 06 b8 b.w #12 +// CHECK-NEXT: 1008: 40 f2 20 0c movw r12, #32 +// CHECK-NEXT: 100c: c0 f2 00 0c movt r12, #0 +// CHECK-NEXT: 1010: fc 44 add r12, pc +// CHECK-NEXT: 1012: 60 47 bx r12 +// CHECK-NEXT: 1014: 40 f2 24 0c movw r12, #36 +// CHECK-NEXT: 1018: c0 f2 00 0c movt r12, #0 +// CHECK-NEXT: 101c: fc 44 add r12, pc +// CHECK-NEXT: 101e: 60 47 bx r12 + +// PLT: Disassembly of section .plt: +// PLT-NEXT: .plt: +// PLT: 1020: 04 e0 2d e5 str lr, [sp, #-4]! +// 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: 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: 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 Modified: vendor/lld/dist/test/ELF/basic-mips.s ============================================================================== --- vendor/lld/dist/test/ELF/basic-mips.s Wed Jan 4 22:11:45 2017 (r311322) +++ vendor/lld/dist/test/ELF/basic-mips.s Wed Jan 4 22:11:50 2017 (r311323) @@ -297,7 +297,7 @@ __start: # CHECK-NEXT: VirtualAddress: 0x30000 # CHECK-NEXT: PhysicalAddress: 0x30000 # CHECK-NEXT: FileSize: 8 -# CHECK-NEXT: MemSize: 8 +# CHECK-NEXT: MemSize: 65536 # CHECK-NEXT: Flags [ (0x4) # CHECK-NEXT: PF_R (0x4) # CHECK-NEXT: ] Modified: vendor/lld/dist/test/ELF/basic-ppc.s ============================================================================== --- vendor/lld/dist/test/ELF/basic-ppc.s Wed Jan 4 22:11:45 2017 (r311322) +++ vendor/lld/dist/test/ELF/basic-ppc.s Wed Jan 4 22:11:50 2017 (r311323) @@ -295,7 +295,7 @@ // CHECK-NEXT: VirtualAddress: 0x2000 // CHECK-NEXT: PhysicalAddress: 0x2000 // CHECK-NEXT: FileSize: 48 -// CHECK-NEXT: MemSize: 48 +// CHECK-NEXT: MemSize: 4096 // CHECK-NEXT: Flags [ (0x4) // CHECK-NEXT: PF_R (0x4) // CHECK-NEXT: ] Modified: vendor/lld/dist/test/ELF/string-table.s ============================================================================== --- vendor/lld/dist/test/ELF/string-table.s Wed Jan 4 22:11:45 2017 (r311322) +++ vendor/lld/dist/test/ELF/string-table.s Wed Jan 4 22:11:50 2017 (r311323) @@ -1,6 +1,6 @@ // RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t // RUN: ld.lld %t -o %t2 -// RUN: llvm-readobj -sections -section-data %t2 | FileCheck %s +// RUN: llvm-readobj -sections %t2 | FileCheck %s // REQUIRES: x86 .global _start @@ -41,41 +41,3 @@ _start: // CHECK-NEXT: Address: 0x0 // CHECK-NOT: Name: foobar - -// Test that the string "bar" is merged into "foobar". - -// CHECK: Section { -// CHECK: Index: -// CHECK: Name: .shstrtab -// CHECK-NEXT: Type: SHT_STRTAB -// CHECK-NEXT: Flags [ -// CHECK-NEXT: ] -// CHECK-NEXT: Address: 0x0 -// CHECK-NEXT: Offset: -// CHECK-NEXT: Size: -// CHECK-NEXT: Link: 0 -// CHECK-NEXT: Info: 0 -// CHECK-NEXT: AddressAlignment: 1 -// CHECK-NEXT: EntrySize: 0 -// CHECK-NEXT: SectionData ( -// CHECK-NEXT: 0000: 00626172 002E7465 78740066 6F6F6261 |.bar..text.fooba| -// CHECK-NEXT: 0010: 72002E63 6F6D6D65 6E74002E 73796D74 |r..comment..symt| -// CHECK-NEXT: 0020: 6162002E 73687374 72746162 002E7374 |ab..shstrtab..st| -// CHECK-NEXT: 0030: 72746162 00 |rtab.| -// CHECK-NEXT: ) -// CHECK-NEXT:} -// CHECK: Name: .strtab -// CHECK-NEXT: Type: SHT_STRTAB (0x3) -// CHECK-NEXT: Flags [ (0x0) -// CHECK-NEXT: ] -// CHECK-NEXT: Address: 0x0 -// CHECK-NEXT: Offset: -// CHECK-NEXT: Size: 15 -// CHECK-NEXT: Link: 0 -// CHECK-NEXT: Info: 0 -// CHECK-NEXT: AddressAlignment: 1 -// CHECK-NEXT: EntrySize: 0 -// CHECK-NEXT: SectionData ( -// CHECK-NEXT: 0000: 00666F6F 62617200 5F737461 727400 |.foobar._start.| -// CHECK-NEXT: ) -// CHECK-NEXT: }