如何安全地将一组 C 函数实现为自初始化库?



我从来没有找到任何关于在C语言中创建和使用库的清晰,简洁和完整的解释;动态/共享和静态。

出于几个原因,我想为我正在作为库处理的项目实现我的一些 C 头文件。每个库可能都有一个全局结构,充当标头中静态函数的命名空间,以及一个用于初始化此结构的条目函数。

struct mylibrary {
int (*function1)(void);
int (*function2)(void);
} mylibrary;
static int my_library_function_1 (void) {
return 1;
}
static int my_library_function_2 (void) {
return 2;
}
void entry_mylibrary (void) {
mylibrary.function1 = my_library_function_1;
mylibrary.function2 = my_library_function_2;
}

据我了解,这应该可以毫无问题地使用静态库。我所要做的就是链接库并从程序的其他地方调用函数entry_mylibrary。但是,我希望我的库是自初始化的;也就是说,我希望在加载代码时调用入口函数。据我了解,这是共享库的域,它可以声明在加载库时要执行的入口点。

那么,我为什么不简单地创建动态库呢?

好吧,我担心应用程序的安全性。如果我只是在运行时链接一个库,我看不出有什么可以防止某些最终用户将我的库交换为自己库。我不能创建一个声明与旧库相同的变量的新库,并将这些变量的定义交换为我自己的吗?我不明白为什么可执行文件会关心。

我想我的问题是:

  • 是否有一些晦涩难懂的方法来自初始化静态库?
  • 如何验证我加载的(共享(库是否确实是我的库?

我正在/将跨平台工作。 64位Windows和Linux。苹果产品有待确定,但不是优先事项。

我在Windows 10上使用Visual Studio 2017 Community。我将在Linux上使用GCC。我将使用平台编译器在所有平台上实现相同的库,例如 Windows 上的 VS 2017 和 Linux 上的 GCC;我不会交叉编译特定于平台的代码。

是否有一些晦涩难懂的方法来自初始化静态库?

使用GCC它并不晦涩难懂:只需使用__attribute__((constructor))即可。 使用 MSVC 有点困难,但仍然有可能:VC 中__attribute__((构造函数((等效?

如何验证我加载的(共享(库是否确实是我的库?

有了上述内容,您无需使用共享库。

相关内容

  • 没有找到相关文章

最新更新