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

标签 c++ c function static

我在动态库 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/

相关文章:

参数类型声明可以移到函数体中吗?

c++ - 如何附加到带有命令行参数的进程?

c++ - 为什么我的程序在打开 mkfifo-ed 管道时挂起?

c++ - 将结构数组传递给函数并通过函数更改它

c - "Cannot access memory at address 0x600b0c"& "No symbol "n "in current context."如果使用 gdb 编译时存在全局变量和局部变量

c - C 中参数数量未知的函数

function - 函数 Haskell 的类型推断

c++ - 如何从 IPv4 映射的 IPv6 地址解析 IPv4 地址?

c++ - std::forward_list 中可以存在循环吗?

c++ - 如何在qt,opencv中依次显示目录中的所有图像