//===-- ModuleSpecTest.cpp ------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "TestingSupport/SubsystemRAII.h" #include "TestingSupport/TestUtilities.h" #include "lldb/Core/Module.h" #include "lldb/Core/ModuleSpec.h" #include "lldb/Utility/DataBuffer.h" #include "Plugins/ObjectFile/ELF/ObjectFileELF.h" #include "Plugins/ObjectFile/Mach-O/ObjectFileMachO.h" #include "Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h" #include "gtest/gtest.h" using namespace lldb; using namespace lldb_private; extern const char *TestMainArgv0; // This test file intentionally doesn't initialize the FileSystem. // Everything in this file should be able to run without requiring // any interaction with the FileSystem class; by keeping it // uninitialized, it will assert if anything tries to interact with // it. TEST(ModuleSpecTest, InvalidInMemoryBuffer) { uint8_t Invalid[] = "This is not a binary file."; DataBufferSP InvalidBufferSP = std::make_shared(Invalid, sizeof(Invalid)); ModuleSpec Spec(FileSpec(), UUID(), InvalidBufferSP); auto InvalidModuleSP = std::make_shared(Spec); ASSERT_EQ(InvalidModuleSP->GetObjectFile(), nullptr); } TEST(ModuleSpecTest, InvalidInMemoryBufferValidFile) { uint8_t Invalid[] = "This is not a binary file."; DataBufferSP InvalidBufferSP = std::make_shared(Invalid, sizeof(Invalid)); ModuleSpec Spec(FileSpec(TestMainArgv0), UUID(), InvalidBufferSP); auto InvalidModuleSP = std::make_shared(Spec); ASSERT_EQ(InvalidModuleSP->GetObjectFile(), nullptr); } TEST(ModuleSpecTest, TestELFFile) { SubsystemRAII subsystems; auto ExpectedFile = TestFile::fromYaml(R"( --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_REL Machine: EM_X86_64 Sections: - Name: .text Type: SHT_PROGBITS Flags: [ SHF_ALLOC, SHF_EXECINSTR ] AddressAlign: 0x0000000000000010 ... )"); ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded()); auto M = std::make_shared(ExpectedFile->moduleSpec()); ObjectFile *OF = M->GetObjectFile(); ASSERT_EQ(llvm::isa(OF), true); } TEST(ModuleSpecTest, TestCOFFFile) { SubsystemRAII subsystems; auto ExpectedFile = TestFile::fromYaml(R"( --- !COFF OptionalHeader: AddressOfEntryPoint: 0 ImageBase: 16777216 SectionAlignment: 4096 FileAlignment: 512 MajorOperatingSystemVersion: 6 MinorOperatingSystemVersion: 0 MajorImageVersion: 0 MinorImageVersion: 0 MajorSubsystemVersion: 6 MinorSubsystemVersion: 0 Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI DLLCharacteristics: [ IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA, IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE, IMAGE_DLL_CHARACTERISTICS_NX_COMPAT ] SizeOfStackReserve: 1048576 SizeOfStackCommit: 4096 SizeOfHeapReserve: 1048576 SizeOfHeapCommit: 4096 header: Machine: IMAGE_FILE_MACHINE_AMD64 Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE ] sections: - Name: .text Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] VirtualAddress: 4096 VirtualSize: 4096 symbols: [] ... )"); ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded()); auto M = std::make_shared(ExpectedFile->moduleSpec()); ObjectFile *OF = M->GetObjectFile(); ASSERT_EQ(llvm::isa(OF), true); } TEST(ModuleSpecTest, TestMachOFile) { SubsystemRAII subsystems; auto ExpectedFile = TestFile::fromYaml(R"( --- !mach-o FileHeader: magic: 0xFEEDFACF cputype: 0x0100000C cpusubtype: 0x00000000 filetype: 0x00000001 ncmds: 1 sizeofcmds: 232 flags: 0x00002000 reserved: 0x00000000 LoadCommands: - cmd: LC_SEGMENT_64 cmdsize: 232 segname: '' vmaddr: 0 vmsize: 56 fileoff: 392 filesize: 56 maxprot: 7 initprot: 7 nsects: 1 flags: 0 Sections: - sectname: __text segname: __TEXT addr: 0x0000000000000000 size: 24 offset: 0x00000188 align: 2 reloff: 0x00000000 nreloc: 0 flags: 0x80000400 reserved1: 0x00000000 reserved2: 0x00000000 reserved3: 0x00000000 ... )"); ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded()); auto M = std::make_shared(ExpectedFile->moduleSpec()); ObjectFile *OF = M->GetObjectFile(); ASSERT_EQ(llvm::isa(OF), true); }