1
외부 라이브러리를로드하고 여기에서 특정 함수를 호출하기 위해 dlsym과 dlopen을 사용하여 일반 도구를 만들려고합니다. 도구에 대한 나의 현재 코드는 다음과 같습니다dlsym()을 사용하여 함수를 호출하려면 어떻게해야합니까? 인수의 개수는 알고 있지만 형식은 아니며 함수의 반환 형식도 모르겠습니다.
void bootload(string libraryname, string functionname, int argc, char** argv) {
void *handle;
char *error;
handle = dlopen(libraryname.c_str(), RTLD_LAZY);
if (!handle) {
fprintf(stderr, "%s\n", dlerror());
exit(EXIT_FAILURE);
} else {
cout << "\nSuccessfuly opened " << libraryname << endl;
}
dlerror();
typedef void (*bootload_t)();
bootload_t bl_function = (bootload_t) dlsym(handle, functionname.c_str());
if ((error = dlerror()) != NULL) {
fprintf(stderr, "%s\n", error);
exit(EXIT_FAILURE);
}
bl_function();
dlclose(handle);
}
이제는 argc와 argv를이 함수 FUNCTIONNAME의 각각 인수의 수 및 인스턴스가 포함됩니다.
어떻게 올바른 인수를 전달하고 올바른 유형을 반환하여 functionname을 올바르게 호출합니까?
일부 도움을 주시면 감사하겠습니다.
내가 생각할 수있는 유일한 방법은 함수 선언을 찾기 위해 디버그 정보 (예 :'libdwarf '사용)를 구문 분석하는 것입니다. 그러나 그것이 당신을 어떻게 도울 수 있습니까? 가능한 모든 매개 변수 조합에 대해 큰'if' /'else'를 작성 하시겠습니까? 또는 함수를 호출하기 전에 수동으로 스택을 준비할까요? – qrdl
할 수 없습니다. 유형을 알아야합니다. –
[libffi] (http://sourceware.org/libffi/)를 사용하고 싶습니다. 당연히 당신은 여전히 (런타임에) 인수의 타입을 알 필요가있다. – rodrigo