給定一個帶有C綁定和任意簽名的函數,創建一個指向該函數的指針,傳遞它,包裝它並調用它是一件簡單的事情。在不知道簽名的情況下封裝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
本身並不一定要做嗎?
我對libffi進行了一些研究,同時尋找解決方案來解決我自己的問題,並在發佈此答案後。這似乎是一個很酷的想法,也是一種將各種編譯和非編譯語言的位粘合在一起的有效解決方案,只要至少有一方願意針對此接口實施...... –