167 lines · cpp
1//===-- ModuleSpecTest.cpp ------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "TestingSupport/SubsystemRAII.h"10#include "TestingSupport/TestUtilities.h"11 12#include "lldb/Core/Module.h"13#include "lldb/Core/ModuleSpec.h"14#include "lldb/Utility/DataBuffer.h"15 16#include "Plugins/ObjectFile/ELF/ObjectFileELF.h"17#include "Plugins/ObjectFile/Mach-O/ObjectFileMachO.h"18#include "Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h"19 20#include "gtest/gtest.h"21 22using namespace lldb;23using namespace lldb_private;24 25extern const char *TestMainArgv0;26 27// This test file intentionally doesn't initialize the FileSystem.28// Everything in this file should be able to run without requiring29// any interaction with the FileSystem class; by keeping it30// uninitialized, it will assert if anything tries to interact with31// it.32 33TEST(ModuleSpecTest, InvalidInMemoryBuffer) {34 uint8_t Invalid[] = "This is not a binary file.";35 DataBufferSP InvalidBufferSP =36 std::make_shared<DataBufferUnowned>(Invalid, sizeof(Invalid));37 ModuleSpec Spec(FileSpec(), UUID(), InvalidBufferSP);38 39 auto InvalidModuleSP = std::make_shared<Module>(Spec);40 ASSERT_EQ(InvalidModuleSP->GetObjectFile(), nullptr);41}42 43TEST(ModuleSpecTest, InvalidInMemoryBufferValidFile) {44 uint8_t Invalid[] = "This is not a binary file.";45 DataBufferSP InvalidBufferSP =46 std::make_shared<DataBufferUnowned>(Invalid, sizeof(Invalid));47 ModuleSpec Spec(FileSpec(TestMainArgv0), UUID(), InvalidBufferSP);48 49 auto InvalidModuleSP = std::make_shared<Module>(Spec);50 ASSERT_EQ(InvalidModuleSP->GetObjectFile(), nullptr);51}52 53TEST(ModuleSpecTest, TestELFFile) {54 SubsystemRAII<ObjectFileELF> subsystems;55 56 auto ExpectedFile = TestFile::fromYaml(R"(57--- !ELF58FileHeader:59 Class: ELFCLASS6460 Data: ELFDATA2LSB61 Type: ET_REL62 Machine: EM_X86_6463Sections:64 - Name: .text65 Type: SHT_PROGBITS66 Flags: [ SHF_ALLOC, SHF_EXECINSTR ]67 AddressAlign: 0x000000000000001068...69)");70 ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded());71 72 auto M = std::make_shared<Module>(ExpectedFile->moduleSpec());73 ObjectFile *OF = M->GetObjectFile();74 75 ASSERT_EQ(llvm::isa<ObjectFileELF>(OF), true);76}77 78TEST(ModuleSpecTest, TestCOFFFile) {79 SubsystemRAII<ObjectFilePECOFF> subsystems;80 81 auto ExpectedFile = TestFile::fromYaml(R"(82--- !COFF83OptionalHeader:84 AddressOfEntryPoint: 085 ImageBase: 1677721686 SectionAlignment: 409687 FileAlignment: 51288 MajorOperatingSystemVersion: 689 MinorOperatingSystemVersion: 090 MajorImageVersion: 091 MinorImageVersion: 092 MajorSubsystemVersion: 693 MinorSubsystemVersion: 094 Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI95 DLLCharacteristics: [ IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA, IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE, IMAGE_DLL_CHARACTERISTICS_NX_COMPAT ]96 SizeOfStackReserve: 104857697 SizeOfStackCommit: 409698 SizeOfHeapReserve: 104857699 SizeOfHeapCommit: 4096100header:101 Machine: IMAGE_FILE_MACHINE_AMD64102 Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE ]103sections:104 - Name: .text105 Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]106 VirtualAddress: 4096107 VirtualSize: 4096108symbols: []109...110)");111 ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded());112 113 auto M = std::make_shared<Module>(ExpectedFile->moduleSpec());114 ObjectFile *OF = M->GetObjectFile();115 116 ASSERT_EQ(llvm::isa<ObjectFilePECOFF>(OF), true);117}118 119TEST(ModuleSpecTest, TestMachOFile) {120 SubsystemRAII<ObjectFileMachO> subsystems;121 122 auto ExpectedFile = TestFile::fromYaml(R"(123--- !mach-o124FileHeader:125 magic: 0xFEEDFACF126 cputype: 0x0100000C127 cpusubtype: 0x00000000128 filetype: 0x00000001129 ncmds: 1130 sizeofcmds: 232131 flags: 0x00002000132 reserved: 0x00000000133LoadCommands:134 - cmd: LC_SEGMENT_64135 cmdsize: 232136 segname: ''137 vmaddr: 0138 vmsize: 56139 fileoff: 392140 filesize: 56141 maxprot: 7142 initprot: 7143 nsects: 1144 flags: 0145 Sections:146 - sectname: __text147 segname: __TEXT148 addr: 0x0000000000000000149 size: 24150 offset: 0x00000188151 align: 2152 reloff: 0x00000000153 nreloc: 0154 flags: 0x80000400155 reserved1: 0x00000000156 reserved2: 0x00000000157 reserved3: 0x00000000158...159)");160 ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded());161 162 auto M = std::make_shared<Module>(ExpectedFile->moduleSpec());163 ObjectFile *OF = M->GetObjectFile();164 165 ASSERT_EQ(llvm::isa<ObjectFileMachO>(OF), true);166}167