diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 11:09:23 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 11:09:23 +0000 |
| commit | f73363f1dd94996356cefbf24388f561891acf0b (patch) | |
| tree | e3c31248bdb36eaec5fd833490d4278162dba2a0 /unittests/ObjectFile/ELF/TestObjectFileELF.cpp | |
| parent | 160ee69dd7ae18978f4068116777639ea98dc951 (diff) | |
Notes
Diffstat (limited to 'unittests/ObjectFile/ELF/TestObjectFileELF.cpp')
| -rw-r--r-- | unittests/ObjectFile/ELF/TestObjectFileELF.cpp | 46 |
1 files changed, 43 insertions, 3 deletions
diff --git a/unittests/ObjectFile/ELF/TestObjectFileELF.cpp b/unittests/ObjectFile/ELF/TestObjectFileELF.cpp index 056799ee9191c..cf8d7042cb012 100644 --- a/unittests/ObjectFile/ELF/TestObjectFileELF.cpp +++ b/unittests/ObjectFile/ELF/TestObjectFileELF.cpp @@ -61,17 +61,18 @@ TEST_F(ObjectFileELFTest, SectionsResolveConsistently) { "sections-resolve-consistently-%%%%%%", "obj", obj)); llvm::FileRemover remover(obj); - const char *args[] = {YAML2OBJ, yaml.c_str(), nullptr}; + 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, nullptr, redirects)); + 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, false)}; - spec.GetSymbolFileSpec().SetFile(obj, false); + spec.GetSymbolFileSpec().SetFile(obj, false, FileSpec::Style::native); auto module_sp = std::make_shared<Module>(spec); SectionList *list = module_sp->GetSectionList(); ASSERT_NE(nullptr, list); @@ -98,3 +99,42 @@ TEST_F(ObjectFileELFTest, SectionsResolveConsistently) { ASSERT_NE(nullptr, start); EXPECT_EQ(text_sp, start->GetAddress().GetSection()); } + +// Test that GetModuleSpecifications works on an "atypical" object file which +// has section headers right after the ELF header (instead of the more common +// layout where the section headers are at the very end of the object file). +// +// Test file generated with yaml2obj (@svn rev 324254) from the following input: +/* +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 + Entry: 0x00000000004003D0 +Sections: + - Name: .note.gnu.build-id + Type: SHT_NOTE + Flags: [ SHF_ALLOC ] + Address: 0x0000000000400274 + AddressAlign: 0x0000000000000004 + Content: 040000001400000003000000474E55001B8A73AC238390E32A7FF4AC8EBE4D6A41ECF5C9 + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x00000000004003D0 + AddressAlign: 0x0000000000000010 + Content: DEADBEEFBAADF00D +... +*/ +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)); + ModuleSpec Spec; + ASSERT_TRUE(Specs.GetModuleSpecAtIndex(0, Spec)) ; + UUID Uuid; + Uuid.SetFromStringRef("1b8a73ac238390e32a7ff4ac8ebe4d6a41ecf5c9", 20); + EXPECT_EQ(Spec.GetUUID(), Uuid); +} |
