我在动态库 foolib 中有一个静态函数“foo”。我成功地能够在我的应用程序中加载 foolib。尽管 dlsym 为“foo”返回 NULL
即使 nm 实用程序也没有将静态函数列为可导出符号。
我了解静态函数的范围仅限于该文件。
不过,有什么办法可以做到这一点。
我知道这在 C++ 中是可能的,不知道如何以及为什么(可能是共享库被视为对象和该库中的函数作为接口(interface)。)
最佳答案
static
不仅仅是一个“作用域”的东西——static
函数有内部链接,所以编译器没有在目标文件中写入关于它们存在的信息;此类信息以后无法恢复(在创建动态库时)。
更好的是:如果它是一个小函数,它可能会在任何情况下都被内联,而且,由于它有内部链接,就不需要生成“独立”版本,所以该函数实际上不再存在编译阶段。
我认为“从外部”获取此类函数地址的唯一实用方法是在同一个翻译单元(即同一个 .cpp 文件)中使用另一个函数,该函数返回指向 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;
}
typedef void (* fooFuncPtr)();
typedef fooFuncPtr (* fooHelperFuncPtr)();
// In the client code of foolib
// ...
fooHelperFuncPtr fooHelper = (fooHelperFuncPtr) dlsym(handle, "fooHelper");
// ... in real code here you would have error checking ...
fooFuncPtr foo = fooHelper();
// now you can use foo
foo();
关于c++ - 如何从 Linux 上的动态库加载静态函数(在 C 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8409205/