是否可以调用尚未声明的共享库中的函数?
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)
库,或者它将以这种方式工作。
简短版本: 我正在尝试使用尚未在 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)
库,或者它将以这种方式工作。