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);
.
wrapfun
의 호출자가 fun
의 서명을 알고
// pseudocode
void wrapfun()
{
return ((void (*)())funptr())();
}
는 쓸 수있는 방법이 있나요하지만 wrapfun
자체를하지 않습니다에 :에 관계없이, 내 질문은 이것이다? 만약 컴파일 된 C 함수로부터 생성 된 어셈블리 보면
나는 내 자신의 문제에 대한 해결책을 찾고있는 동안 그리고이 대답을 게시 한 후에 libffi에 대한 연구를 해왔다. 그것은 멋진 아이디어, 그리고 컴파일 된 언어와 컴파일되지 않은 다양한 언어의 비트를 함께 붙일 수있는 효과적인 솔루션 인 것 같습니다. 적어도 한 파티가이 인터페이스에 대해 구현하려고한다면 ... –