如何从Linux上的动态库加载静态函数(在C中)

时间:2011-12-07 01:08:29

标签: c++ c function static

我在动态库foolib中有一个静态函数“foo”。我成功地在我的应用程序中加载了foolib。虽然dlsym为“foo”返回NULL

即使是nm实用程序也不会将静态函数列为可导出符号。

据我所知,静态函数的范围仅限于该文件。

不过,有没有办法实现这一目标。

我知道这在C ++中是可能的,不知道如何以及为什么(可能将共享库视为该库中的对象和函数作为接口。)

1 个答案:

答案 0 :(得分:4)

static不仅仅是一个“范围”事物 - static函数具有内部链接,因此编译器不会在目标文件中写入有关它们存在的信息;以后无法恢复此类信息(在创建动态库时)。

更好:如果它是一个小函数,它可能会在每种情况下都被内联,并且,由于它具有内部链接,因此不需要生成“独立”版本,因此该函数实际上将不再存在编译阶段。

我看到从“外部”获取地址到这样一个函数的唯一实用方法是在同一个翻译单元(即在同一个.cpp文件中)中有另一个函数返回指向{{ 1}}函数,然后导出这样的辅助函数。可行,但如果你问我,那就毫无意义了。 :)


foo

// In foolib

// The static function
static void foo()
{
    // ...
}

// Typedef for the function pointer
typedef void (* fooFuncPtr)();

// Helper function to be exported - returns the address of foo
fooFuncPtr fooHelper()
{
    return &foo;
}