加载时动态链接库调度

时间:2016-07-24 22:16:04

标签: c++ windows dll load-time cpuid

我希望我的Windows应用程序能够引用包含在DLL中的大量类和函数,但是我需要能够指导应用程序在加载之前选择正确版本的DLL。我熟悉使用dllexport / dllimport并生成导入库来完成加载时动态链接,但我似乎无法找到关于可能在导入库本身中找到某种入口点函数的interwebs的任何信息,所以具体来说,我可以使用CPUID来检测主机CPU配置,并根据该信息决定加载特定的DLL。更具体地说,我想建立一个DLL的两个版本,一个用/ARCH:AVX构建并充分利用SSE-AVX指令,另一个假设没有什么比SSE2更新。

一个要求:DLL必须在加载时链接,或者需要一种非常简单的方法来手动绑定从DLL外部引用的函数,并且有很多,主要包含在类中。

奖金问题:由于我的库是跨平台的,是否有基于Linux的共享对象的等价物?

2 个答案:

答案 0 :(得分:1)

我建议你尽可能避免从你的可执行文件中动态解析你的DLL,因为它只会让你的生活变得艰难,特别是因为你有很多暴露的接口而且它们不是纯粹的C.

可能的解决方法

创建一个“选择器”进程,该进程提供必要的UI以决定您需要哪个DLL,或者甚至可以自动确定它。让该进程将任何已决定的DLL移动到主要可执行文件所期望的标准位置(和名称)。然后让选择器进程启动您的主要可执行文件;它将从您的标准位置获取其DLL,而无需知道哪个版本的DLL存在。没有延迟加载,没有笨拙,没有额外的编码;很容易。

如果这不适合您,那么这里是延迟加载DLL的起点。这是一条更加崎岖的道路。

<强>窗

<强>的Linux

答案 1 :(得分:0)

要添加到qexyn的答案,可以通过生成一个小的静态存根库来模仿Linux上的延迟加载,该库将dlopen首先调用它的任何函数,然后转发实际的执行到共享库。可以通过自定义项目特定脚本或Implib.so自动生成此类存根库:

# Generate stub
$ implib-gen.py libxyz.so
# Link it instead of -lxyz
$ gcc myapp.c libxyz.tramp.S libxyz.init.c