静态链接的库默认入口点

时间:2014-09-16 08:59:31

标签: linux linker openssl static-libraries static-linking

链接静态库时,该特定库是否可以有默认入口点?

我不认为有,但想澄清。我们需要在链接期间为静态库添加一个入口点,以启动一些初始化/验证调用。

例如,我们有一个静态库libstuff.a,并希望能够在该库中调用initStuff()例程,但是在加载时(或尽可能接近),而不是运行时(如我知道它在技术上是运行时的,但是对任何post _start()/ main()例程都没有控制。

为了澄清,这是为了满足NIST FIPS 140.2规范的需求,特别是Implementation Guide的第9.10节。这包括数据和文本段签名验证(请参阅第9.10节&#39>第3条)。

2 个答案:

答案 0 :(得分:2)

最常见的方法是在使用库之前公开库的用户必须首先调用的初始化函数。

在C ++中,您可以使用构造函数和析构函数创建全局对象。当这些对象在静态库中时,需要引用它们,否则链接器可能会因为它们未被引用而将它们排除。此外,您可能需要强制执行不同翻译单元之间的初始化顺序。

使用gcc函数时可以有constructor属性。实现与使用C ++构造函数几乎相同的效果。


您可以在第一次使用之前使用C ++ Nifty Counter惯用法强制自动初始化库。它适用于共享库和静态库。

以下是如何在普通C中执行此操作的示例:

图书馆的标题:

// lib.h

// These get called by every translation unit including this header file.
extern void lib_ctor();
extern void lib_dtor();

// These are the automatic callers of the above functions.
// Embedded in every translation unit that includes this header.
static void local_lib_ctor() __attribute__((constructor));
static void local_lib_dtor() __attribute__((destructor));
void local_lib_ctor() { lib_ctor(); }
void local_lib_dtor() { lib_dtor(); }

// There rest of lib API.

初始化例程的实现:

// lib.c

static int ref_counter = 0;

void lib_ctor() {
    if(!ref_counter++) {
        // Do construction here.
    }
}

void lib_dtor() {
    if(!--ref_counter) {
        // Do destruction here.
    }
}

答案 1 :(得分:0)

不,不是为了满足NIST FIPS 140-2规范。

实现我所追求的唯一解决方案是使用共享库,其中使用构造函数属性(或修改的.init ELF挂钩,但构造函数更清晰)调用初始化函数。这可以确保在应用程序启动之前调用初始化。

由于归档库只是一堆目标文件,因此无法将它们作为一个具有自己的初始化例程的组隔离,只有应用程序范围的初始化例程调用归档库中包含的那些符号。 / p>