Use full path when loading SourceLevelDebugger library

Change-Id: I27f7ee2b8944b9890ab4b141c06e9c2f0a8dffb1
Signed-off-by: Mateusz Hoppe <mateusz.hoppe@intel.com>
This commit is contained in:
Mateusz Hoppe 2020-10-30 13:42:13 +01:00 committed by sys_ocldev
parent 17b2a29945
commit 4df533f63a
8 changed files with 61 additions and 4 deletions

View File

@ -10,6 +10,6 @@
namespace NEO {
OsLibrary *SourceLevelDebugger::loadDebugger() {
return OsLibrary::load(SourceLevelDebugger::dllName);
return OsLibrary::load(OsLibrary::createFullSystemPath(SourceLevelDebugger::dllName));
}
} // namespace NEO

View File

@ -34,6 +34,7 @@ set(IGDRCL_SRCS_tests_os_interface_linux
${CMAKE_CURRENT_SOURCE_DIR}/mock_performance_counters_linux.cpp
${CMAKE_CURRENT_SOURCE_DIR}/mock_performance_counters_linux.h
${CMAKE_CURRENT_SOURCE_DIR}/os_interface_linux_tests.cpp
${CMAKE_CURRENT_SOURCE_DIR}/os_library_linux_tests.cpp
${CMAKE_CURRENT_SOURCE_DIR}/os_time_test.cpp
${CMAKE_CURRENT_SOURCE_DIR}/performance_counters_linux_tests.cpp
${CMAKE_CURRENT_SOURCE_DIR}/self_lib_lin.cpp

View File

@ -0,0 +1,19 @@
/*
* Copyright (C) 2020 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "shared/source/os_interface/linux/os_library_linux.h"
#include "gtest/gtest.h"
namespace NEO {
TEST(OsLibraryTest, WhenCreatingFullSystemPathThenProperPathIsConstructed) {
auto fullPath = OsLibrary::createFullSystemPath("test");
EXPECT_STREQ("test", fullPath.c_str());
}
} // namespace NEO

View File

@ -27,16 +27,21 @@ class OsLibraryBackup : public Windows::OsLibrary {
using ModuleNameType = decltype(Windows::OsLibrary::getModuleFileNameA);
using ModuleNameBackupType = typename VariableBackup<ModuleNameType>;
using SystemDirectoryType = decltype(Windows::OsLibrary::getSystemDirectoryA);
using SystemDirectoryBackupType = typename VariableBackup<SystemDirectoryType>;
struct Backup {
std::unique_ptr<BackupType> bkp1 = nullptr;
std::unique_ptr<ModuleNameBackupType> bkp2 = nullptr;
std::unique_ptr<SystemDirectoryBackupType> bkp3 = nullptr;
};
public:
static std::unique_ptr<Backup> backup(Type newValue, ModuleNameType newModuleName) {
static std::unique_ptr<Backup> backup(Type newValue, ModuleNameType newModuleName, SystemDirectoryType newSystemDirectoryName) {
std::unique_ptr<Backup> bkp(new Backup());
bkp->bkp1.reset(new BackupType(&OsLibrary::loadLibraryExA, newValue));
bkp->bkp2.reset(new ModuleNameBackupType(&OsLibrary::getModuleFileNameA, newModuleName));
bkp->bkp3.reset(new SystemDirectoryBackupType(&OsLibrary::getSystemDirectoryA, newSystemDirectoryName));
return bkp;
};
};
@ -69,17 +74,31 @@ HMODULE WINAPI LoadLibraryExAMock(LPCSTR lpFileName, HANDLE hFile, DWORD dwFlags
return (HMODULE)1;
}
UINT WINAPI GetSystemDirectoryAMock(LPSTR lpBuffer, UINT uSize) {
const char path[] = "C:\\System";
strcpy_s(lpBuffer, sizeof(path), path);
return sizeof(path) - 1; // do not include terminating null
}
TEST(OSLibraryWinTest, WhenLoadDependencyFailsThenFallbackToNonDriverStore) {
auto bkp = OsLibraryBackup::backup(LoadLibraryExAMock, GetModuleFileNameAMock);
auto bkp = OsLibraryBackup::backup(LoadLibraryExAMock, GetModuleFileNameAMock, GetSystemDirectoryAMock);
std::unique_ptr<OsLibrary> library(OsLibrary::load(Os::testDllName));
EXPECT_NE(nullptr, library);
}
TEST(OSLibraryWinTest, WhenDependencyLoadsThenProperPathIsConstructed) {
auto bkp = OsLibraryBackup::backup(LoadLibraryExAMock, GetModuleFileNameAMock);
auto bkp = OsLibraryBackup::backup(LoadLibraryExAMock, GetModuleFileNameAMock, GetSystemDirectoryAMock);
VariableBackup<bool> bkpM(&mockWillFail, false);
std::unique_ptr<OsLibrary> library(OsLibrary::load(Os::testDllName));
EXPECT_NE(nullptr, library);
}
TEST(OSLibraryWinTest, WhenCreatingFullSystemPathThenProperPathIsConstructed) {
auto bkp = OsLibraryBackup::backup(LoadLibraryExAMock, GetModuleFileNameAMock, GetSystemDirectoryAMock);
VariableBackup<bool> bkpM(&mockWillFail, false);
auto fullPath = OsLibrary::createFullSystemPath("test");
EXPECT_STREQ("C:\\System\\test", fullPath.c_str());
}

View File

@ -23,6 +23,11 @@ OsLibrary *OsLibrary::load(const std::string &name) {
}
return ptr;
}
const std::string OsLibrary::createFullSystemPath(const std::string &name) {
return name;
}
namespace Linux {
OsLibrary::OsLibrary(const std::string &name) {

View File

@ -32,6 +32,7 @@ class OsLibrary {
virtual ~OsLibrary() = default;
static OsLibrary *load(const std::string &name);
static const std::string createFullSystemPath(const std::string &name);
ConvertibleProcAddr operator[](const std::string &name) {
return ConvertibleProcAddr{getProcAddress(name)};

View File

@ -19,9 +19,20 @@ OsLibrary *OsLibrary::load(const std::string &name) {
return ptr;
}
const std::string OsLibrary::createFullSystemPath(const std::string &name) {
CHAR buff[MAX_PATH];
UINT ret = 0;
ret = Windows::OsLibrary::getSystemDirectoryA(buff, MAX_PATH);
buff[ret] = '\\';
buff[ret + 1] = 0;
strncat_s(&buff[0], sizeof(buff), name.c_str(), _TRUNCATE);
return std::string(buff);
}
namespace Windows {
decltype(&LoadLibraryExA) OsLibrary::loadLibraryExA = LoadLibraryExA;
decltype(&GetModuleFileNameA) OsLibrary::getModuleFileNameA = GetModuleFileNameA;
decltype(&GetSystemDirectoryA) OsLibrary::getSystemDirectoryA = GetSystemDirectoryA;
extern "C" IMAGE_DOS_HEADER __ImageBase;
__inline HINSTANCE GetModuleHINSTANCE() { return (HINSTANCE)&__ImageBase; }

View File

@ -24,6 +24,7 @@ class OsLibrary : public NEO::OsLibrary {
bool isLoaded();
void *getProcAddress(const std::string &procName);
static decltype(&GetSystemDirectoryA) getSystemDirectoryA;
protected:
HMODULE loadDependency(const std::string &dependencyFileName) const;