【发布时间】:2012-11-09 18:04:28
【问题描述】:
给定一个带有 C 绑定和任意签名的函数,创建一个指向该函数的指针、传递它、包装它并调用它是一件简单的事情。
int fun(int x, int y)
{
return x + y;
}
void* funptr()
{
return (void*)&fun;
}
int wrapfun(int x, int y)
{
// inject additional wrapper logic
return ((int (*)(int, int))funptr())(x, y);
}
只要调用者和被调用者遵循相同的调用约定并就签名达成一致,一切正常。
现在假设我想包装一个包含数千个函数的库。我可以使用nm 或readelf 来获取要包装的所有函数的名称,但我宁愿不必关心签名,甚至不需要包含库的关联头文件。
在某些情况下,考虑到版本和平台之间发生的外观变化,干净地包含标题可能不是一种选择。例如:
// from openssl/ssl.h v0.9.8
SSL_CTX* SSL_CTX_new(SSL_METHOD* meth);
// from openssl/ssl.h v1.0.0
SSL_CTX* SSL_CTX_new(const SSL_METHOD* meth);
这是我的背景理由,你可以离开或接受。无论如何,我的问题是:
有没有办法写
// pseudocode
void wrapfun()
{
return ((void (*)())funptr())();
}
这样wrapfun 的调用者知道fun 的签名,但wrapfun 本身不必知道?
【问题讨论】:
标签: c linux function gcc assembly