是否可以调用尚未声明的共享库中的函数?

Is it possible to call a function in a shared library that has not been declared?

简短版本: 我正在尝试使用尚未在 header 文件中声明的共享库中的函数。是否可以?如果可以,怎么做?

长版: 我正在尝试使用 GNU readline-7.0 作为共享库。不幸的是,默认情况下它会回显输入,除非您通过 api 调用将其关闭。遗憾的是,这个 api 调用没有在他们的 header 中声明,因为有人忘记了。 see details here 注意:我无法更新到更新的 readline,所以我只能使用这个库。如何使用这个未声明的函数?

如 linked 错误中所述,即使函数存在于实现中,头文件中也没有外部声明。

link 还显示了添加声明的修复:

extern int rl_tty_set_echoing PARAMS((int));

因此您可以在 #include <readline.h>

之后立即将其添加到您的代码中

排序答案是!!!

只需使用库 -ldl 和函数 dlopen(3) 等。此库允许您加载共享对象并搜索您一无所知的标识符。当然,C 的静态类型特性强制使用原型声明这些函数的接口,所以一旦你得到对象的 (void *) 就可以将它转换为 int (*t)() 之类的东西并跳转到它通过 t(); 电话。

在手册页中您将获得详细信息,dlopen 允许您在共享对象中搜索作为字符串传递的符号。它 returns 指向这些标识符已加载到内存中的位置。您甚至可以使用自己的程序来执行此操作。

另一方面,这是ELF共享加载模块的一个特性。如果您是 运行 a.out 可执行文件或其他,现在保证您将拥有一个 dlopen(3) 库,或者它将以这种方式工作。