diff options
Diffstat (limited to 'unittests/ObjectFile/ELF/TestObjectFileELF.cpp')
-rw-r--r-- | unittests/ObjectFile/ELF/TestObjectFileELF.cpp | 78 |
1 files changed, 75 insertions, 3 deletions
diff --git a/unittests/ObjectFile/ELF/TestObjectFileELF.cpp b/unittests/ObjectFile/ELF/TestObjectFileELF.cpp index cf8d7042cb01..9d3b84514ce9 100644 --- a/unittests/ObjectFile/ELF/TestObjectFileELF.cpp +++ b/unittests/ObjectFile/ELF/TestObjectFileELF.cpp @@ -14,7 +14,9 @@ #include "lldb/Core/Module.h" #include "lldb/Core/ModuleSpec.h" #include "lldb/Core/Section.h" +#include "lldb/Host/FileSystem.h" #include "lldb/Host/HostInfo.h" +#include "lldb/Utility/DataBufferHeap.h" #include "llvm/ADT/Optional.h" #include "llvm/Support/Compression.h" #include "llvm/Support/FileUtilities.h" @@ -29,6 +31,7 @@ using namespace lldb; class ObjectFileELFTest : public testing::Test { public: void SetUp() override { + FileSystem::Initialize(); HostInfo::Initialize(); ObjectFileELF::Initialize(); SymbolVendorELF::Initialize(); @@ -38,6 +41,7 @@ public: SymbolVendorELF::Terminate(); ObjectFileELF::Terminate(); HostInfo::Terminate(); + FileSystem::Terminate(); } protected: @@ -71,8 +75,8 @@ TEST_F(ObjectFileELFTest, SectionsResolveConsistently) { ASSERT_NO_ERROR(llvm::sys::fs::file_size(obj, size)); ASSERT_GT(size, 0u); - ModuleSpec spec{FileSpec(obj, false)}; - spec.GetSymbolFileSpec().SetFile(obj, false, FileSpec::Style::native); + ModuleSpec spec{FileSpec(obj)}; + spec.GetSymbolFileSpec().SetFile(obj, FileSpec::Style::native); auto module_sp = std::make_shared<Module>(spec); SectionList *list = module_sp->GetSectionList(); ASSERT_NE(nullptr, list); @@ -131,10 +135,78 @@ Sections: TEST_F(ObjectFileELFTest, GetModuleSpecifications_EarlySectionHeaders) { std::string SO = GetInputFilePath("early-section-headers.so"); ModuleSpecList Specs; - ASSERT_EQ(1u, ObjectFile::GetModuleSpecifications(FileSpec(SO, false), 0, 0, Specs)); + ASSERT_EQ(1u, ObjectFile::GetModuleSpecifications(FileSpec(SO), 0, 0, Specs)); ModuleSpec Spec; ASSERT_TRUE(Specs.GetModuleSpecAtIndex(0, Spec)) ; UUID Uuid; Uuid.SetFromStringRef("1b8a73ac238390e32a7ff4ac8ebe4d6a41ecf5c9", 20); EXPECT_EQ(Spec.GetUUID(), Uuid); } + +static void CHECK_ABS32(uint8_t *bytes, uint32_t offset, uint32_t addend) { + uint32_t res; + memcpy(&res, reinterpret_cast<uint32_t *>(bytes + offset), sizeof(uint32_t)); + ASSERT_EQ(addend, res); +} + +static void CHECK_ABS64(uint8_t *bytes, uint64_t offset, uint64_t addend) { + uint64_t res; + memcpy(&res, reinterpret_cast<uint64_t *>(bytes + offset), sizeof(uint64_t)); + ASSERT_EQ(addend, res); +} + +TEST_F(ObjectFileELFTest, TestAARCH64Relocations) { + std::string yaml = GetInputFilePath("debug-info-relocations.pcm.yaml"); + llvm::SmallString<128> obj; + ASSERT_NO_ERROR(llvm::sys::fs::createTemporaryFile( + "debug-info-relocations-%%%%%%", "obj", obj)); + + llvm::FileRemover remover(obj); + llvm::StringRef args[] = {YAML2OBJ, yaml}; + llvm::StringRef obj_ref = obj; + const llvm::Optional<llvm::StringRef> redirects[] = {llvm::None, obj_ref, + llvm::None}; + ASSERT_EQ(0, + llvm::sys::ExecuteAndWait(YAML2OBJ, args, llvm::None, redirects)); + uint64_t size; + ASSERT_NO_ERROR(llvm::sys::fs::file_size(obj, size)); + ASSERT_GT(size, 0u); + + ModuleSpec spec{FileSpec(obj)}; + spec.GetSymbolFileSpec().SetFile(obj, FileSpec::Style::native); + auto module_sp = std::make_shared<Module>(spec); + + auto objfile = static_cast<ObjectFileELF *>(module_sp->GetObjectFile()); + SectionList *section_list = objfile->GetSectionList(); + ASSERT_NE(nullptr, section_list); + + auto debug_info_sp = + section_list->FindSectionByName(ConstString(".debug_info")); + ASSERT_NE(nullptr, debug_info_sp); + objfile->RelocateSection(debug_info_sp.get()); + + DataExtractor data; + // length of 0x10 is not needed but length 0x0 crashes + objfile->GetData(0x00, 0x10, data); + DataBufferSP &data_buffer_sp = data.GetSharedDataBuffer(); + uint8_t *bytes = data_buffer_sp->GetBytes(); + + addr_t debug_info_offset = debug_info_sp->GetFileOffset(); + bytes += debug_info_offset; + + // Sanity check - The first byte from the yaml file is 0x47 + ASSERT_EQ(0x47, *bytes); + + // .rela.debug_info contains 9 relocations: + // 7 R_AARCH64_ABS32 - 2 R_AARCH64_ABS64 + // None have a value. Four have addends. + CHECK_ABS32(bytes, 0x6, 0); + CHECK_ABS32(bytes, 0xC, 0); + CHECK_ABS32(bytes, 0x12, 45); + CHECK_ABS32(bytes, 0x16, 0); + CHECK_ABS32(bytes, 0x1A, 55); + CHECK_ABS64(bytes, 0x1E, 0); + CHECK_ABS64(bytes, 0x2B, 0); + CHECK_ABS32(bytes, 0x39, 73); + CHECK_ABS32(bytes, 0x44, 75); +} |