我目前为客户建立了一个纯静态库MainLib
,其中包含所有符号,以便他们可以将其集成到他们的程序中。由于多种原因,我现在需要提供MainLib
的 DLL版本,其中包含部分符号以及静态库 FeatureLib
,其中包含其余符号。原因之一是我们希望通过简单地窃取通过客户程序提供的DLL来避免恶意软件的使用。如果部分符号通过静态库集成在调用软件中,则此方法将无效。包的用户只有在将FeatureLib
的符号添加到他的应用程序后才能使用DLL。
对于Linux,我可以使这项工作像魔术一样工作,即符号doFeature()
不在libMainLib.so
内,但是对于Windows,我没有成功。
CMakeLists.txt
:
cmake_minimum_required(VERSION 3.0)
project(MainLib)
add_library(FeatureLib STATIC src/FeatureLib.c)
target_include_directories(FeatureLib PUBLIC include
PRIVATE src)
add_library(MainLib SHARED src/MainLib.c)
target_include_directories(MainLib PUBLIC include
PRIVATE src)
# I don't want to include symbols from FeatureLib into shared MainLib
#target_link_libraries(MainLib PRIVATE FeatureLib)
add_executable(MainLibDemo src/demo.c)
target_link_libraries(MainLibDemo MainLib FeatureLib) #resolve symbol doFeature()
FeatureLib.h
:
extern int doFeature(int input);
MainLib.h
:
extern __declspec(dllexport) int MainLib(int input);
FeatureLib.c
:
#include "FeatureLib.h"
int doFeature(int input) {return 4;}
MainLib.c
:
#include "FeatureLib.h"
#include "MainLib.h"
__declspec(dllexport) int MainLib(int input)
{
if (input > 2) {
return doFeature(input);
} else {
return doFeature(0);
}
}
demo.c
:
#include <stdio.h>
#include <stdlib.h>
#include "MainLib.h"
int main(int argc, char **argv)
{
if(argc > 1)
return MainLib(atoi(argv[1]));
else
return 0;
}
这样,我得到以下编译错误:
"C:\Daten\tmp\DemoProject\simple\build\ALL_BUILD.vcxproj" (Standardziel) (1) ->
"C:\Daten\tmp\DemoProject\simple\build\MainLib.vcxproj" (Standardziel) (4) ->
(Link Ziel) ->
MainLib.obj : error LNK2019: unresolved external symbol _doFeature referenced in function _MainLib [C:\Daten\tmp\DemoProject\simple\build\MainLib.vcxproj]
C:\Daten\tmp\DemoProject\simple\build\Debug\MainLib.dll : fatal error LNK1120: 1 unresolved externals [C:\Daten\tmp\DemoProject\simple\build\MainLib.vcxproj]
0 Warnung(en)
2 Fehler
使用Windows甚至可以做到吗?除了不将FeatureLib
链接到MainLibDemo
以外,我需要做些什么来使其能够工作以及如何验证它。任何想法都非常欢迎。
亲切的问候, 弗洛里安
答案 0 :(得分:0)
在Linux下执行此操作的方式在Windows下不起作用 因为动态链接在这里的工作方式有所不同。 这是一种可行的策略。
在MainLib.dll
代码中,而不是直接调用doFeature
您需要定义适当功能的全局指针变量
指针类型并使用它来调用函数。
这样将可以毫无错误地构建MainLib.dll
。
现在,您需要设置此指针变量。一种方法是:
将导出的函数添加到需要指针的MainLib.dll
DLL需要可执行文件中的所有功能。
在FeatureLib.lib
代码中添加初始化函数
该应用程序需要在使用之前调用
您的DLL,它将把指向其对等对象的指针传递给DLL。
基本上,这是大多数带有插件的程序用来 允许插件访问其设施。
另一种方法是(警告!我尚未测试此特定 解决方案):
在FeatureLib.lib
中将函数声明为已导出
与__declspec(dllexport)
。这样他们将被导出
来自可执行文件。
在MainLib.dll
中,在第一次使用指针之前使用
GetModuleHandle
和GetProcAddress
获取指针。
最好在某些初始化函数中完成
图书馆。否则,您需要注意避免出现比赛情况。
希望这会有所帮助。 虽然我认为您的复制保护方案不起作用。 安德鲁·亨利(Andrew Henle)在他的评论中是对的:这并不难 从一个可执行文件中提取所需的代码并将其包括在内 在另一个。