fix: always use delayed loading for WinFsp DLL

This commit is contained in:
Marcus Holland-Moritz 2024-02-08 06:51:41 +01:00
parent 4e60bbb807
commit b5cbc02110
3 changed files with 31 additions and 30 deletions

View File

@ -617,11 +617,16 @@ list(APPEND MAIN_TARGETS mkdwarfs_main dwarfsck_main dwarfsbench_main
if(FUSE3_FOUND OR WINFSP OR APPLE)
add_library(dwarfs_main src/dwarfs_main.cpp)
target_compile_definitions(dwarfs_main PRIVATE _FILE_OFFSET_BITS=64)
add_executable(dwarfs-bin src/dwarfs.cpp)
target_link_libraries(dwarfs-bin dwarfs_main)
set_target_properties(dwarfs-bin PROPERTIES OUTPUT_NAME dwarfs)
if(WINFSP)
target_compile_definitions(dwarfs_main PRIVATE FUSE_USE_VERSION=32
DWARFS_FUSE_LOWLEVEL=0)
target_include_directories(dwarfs_main SYSTEM PRIVATE "${WINFSP_PATH}/inc")
target_link_libraries(dwarfs_main ${WINFSP})
target_link_libraries(dwarfs-bin delayimp.lib)
target_link_options(dwarfs-bin PRIVATE /DELAYLOAD:winfsp-x64.dll)
if(WITH_UNIVERSAL_BINARY)
target_link_libraries(dwarfsuniversal delayimp.lib)
target_link_options(dwarfsuniversal PRIVATE /DELAYLOAD:winfsp-x64.dll)
@ -633,9 +638,6 @@ if(FUSE3_FOUND OR WINFSP OR APPLE)
target_compile_definitions(dwarfs_main PRIVATE FUSE_USE_VERSION=35)
target_link_libraries(dwarfs_main PkgConfig::FUSE3)
endif()
add_executable(dwarfs-bin src/dwarfs.cpp)
target_link_libraries(dwarfs-bin dwarfs_main)
set_target_properties(dwarfs-bin PROPERTIES OUTPUT_NAME dwarfs)
if(WITH_UNIVERSAL_BINARY)
target_link_libraries(dwarfsuniversal dwarfs_main)
endif()

View File

@ -72,6 +72,7 @@
#endif
#ifdef _WIN32
#include <delayimp.h>
#include <fuse3/winfsp_fuse.h>
#define st_atime st_atim.tv_sec
#define st_ctime st_ctim.tv_sec
@ -97,6 +98,7 @@
#include "dwarfs_tool_main.h"
namespace {
#ifdef DWARFS_FSP_COMPAT
using native_stat = struct ::fuse_stat;
using native_statvfs = struct ::fuse_statvfs;
@ -106,8 +108,32 @@ using native_stat = struct ::stat;
using native_statvfs = struct ::statvfs;
using native_off_t = ::off_t;
#endif
#ifdef _WIN32
FARPROC WINAPI delay_hook(unsigned dliNotify, PDelayLoadInfo pdli) {
switch (dliNotify) {
case dliFailLoadLib:
std::cerr << "failed to load " << pdli->szDll << "\n";
break;
case dliFailGetProc:
std::cerr << "failed to load symbol from " << pdli->szDll << "\n";
break;
default:
return NULL;
}
::exit(1);
}
#endif
} // namespace
#ifdef _WIN32
extern "C" const PfnDliHook __pfnDliFailureHook2 = delay_hook;
#endif
namespace dwarfs {
namespace {

View File

@ -31,10 +31,6 @@
#include <folly/gen/String.h>
#include <folly/portability/Windows.h>
#ifdef _WIN32
#include <delayimp.h>
#endif
#include "dwarfs/safe_main.h"
#include "dwarfs/tool.h"
#include "dwarfs/util.h"
@ -44,25 +40,6 @@ namespace {
using namespace dwarfs;
#ifdef _WIN32
FARPROC WINAPI delay_hook(unsigned dliNotify, PDelayLoadInfo pdli) {
switch (dliNotify) {
case dliFailLoadLib:
std::cerr << "failed to load " << pdli->szDll << "\n";
break;
case dliFailGetProc:
std::cerr << "failed to load symbol from " << pdli->szDll << "\n";
break;
default:
return NULL;
}
::exit(1);
}
#endif
#ifdef _WIN32
#define EXE_EXT ".exe"
#else
@ -79,10 +56,6 @@ std::map<std::string_view, int (*)(int, sys_char**)> const functions{
} // namespace
#ifdef _WIN32
extern "C" const PfnDliHook __pfnDliFailureHook2 = delay_hook;
#endif
int SYS_MAIN(int argc, sys_char** argv) {
auto path = std::filesystem::path(argv[0]);