【发布时间】:2020-08-23 21:13:35
【问题描述】:
加载动态库和GetProcAddress 后,通常会获得void* 类型的函数指针。要调用该函数,在编译时执行此操作时,会将指针转换为所需的正确指针类型。
但是,如果在编译时不知道类型,而是在运行时知道,则类型的可能性有很多。在这种情况下,似乎需要手动“调用”函数,也就是根据 ABI 更新堆栈和寄存器。
问题是:在通用平台和 ABI 中是否有任何开源代码可以解决这个问题?如果没有,我如何自己实现?
微软的 abi 文档有一些关于 cdecl 和其他约定的东西,看起来 32 位和 64 位是不同的。 Linux 上的 ABI 是一样的还是其他?
【问题讨论】:
-
如果类型未知,则应该将其视为
void *。除非您知道它是什么,或者除非您将它传递给执行此操作的函数,否则您无法对返回值做任何明智的事情。一般来说,如果你遇到这个问题,我认为你可能有一个设计问题。更新堆栈等不是 C 开发人员的问题。你不应该遇到任何麻烦。 -
您能否提供一个遇到此问题的示例?
-
Linux 上的 ABI 与 Windows 上的不同,你可以在this Wikipedia page 底部看到一个表格(假设你说的是 x86)。
-
@Cheatah 我知道执行任意代码很危险,但是假设您希望您的用户使用命令行执行他/他编写并编译成 dll 的内容,并使用命令行中给出的参数在运行时。
-
@Cheatah 这样一来,虽然C装饰dll中缺少类型信息,但是编译时不知道怎么使用里面的函数。
标签: c++ c reflection runtime shared-libraries