일종의 런타임 시스템/인터프리터를 작성하는 중입니다.해야 할 일 중 하나는 외부에있는 c/C++ 함수를 호출하는 것입니다. 라이브러리.C/C++ 프로토 타입이 알려지지 않은 함수의 동적로드
리눅스에서 dlfcn.h
함수를 사용하여 라이브러리를 열고 그 안에있는 함수를 호출합니다. 문제는, dlsysm()
을 사용할 때 반환되는 함수 포인터가 함수 인수와 반환 유형을 알 수 있도록 호출되기 전에 적절한 유형으로 변환되어야한다는 것입니다. 그러나 라이브러리에서 임의의 함수를 호출하는 경우 분명히 알 수 있습니다. 컴파일시이 프로토 타입을 모른다.
그래서 내가 묻는 것은 동적으로로드 된 함수를 호출하고 인수를 전달하고 리턴 값을 검색하는 방법이 있습니까 프로토 타입을 알지 않고 있습니까?
은 지금까지 나는이 작업을 수행하는 쉬운 방법이없는 결론에 도달했지만, 내가 찾은 몇 가지 해결 방법은 다음과 같습니다
- 내가 같은를로드 할 모든 기능을 확인하십시오 프로토 타입을 만들고 매개 변수와 반환 값을 검색하기 위해 이러한 함수에 대한 정렬 메커니즘을 제공합니다. 이것은 내가 현재하고있는 일이다.
인라인 asm을 사용하여 매개 변수를 스택에 푸시하고 반환 값을 읽습니다. 가능하다면이 일을 분명히하고 싶습니다!
누구나 아이디어가 있다면 크게 환영 할 것입니다.
편집 :
지금 정확히 발견 내가 찾던 : 나는 인정한다하더라도 (
"휴대용 외부 함수 인터페이스 라이브러리"
나는 원래 질문에서 더 명확하게 할 수 있었다!)
컴파일 타임에 함수 프로토 타입을 알 수 없다는 주장을 이해하지 못합니다. 제 말은 dlsym()을 호출하고 그 결과로 무엇을할까요? '인수'는 정확히 어디에서 얻고 있습니까? 인수의 존재는 나에게 당신이 함수 프로토 타입에 대한 아이디어를 가지고 있다는 것을 의미합니다. –
매개 변수 또는 반환 형식을 모르는 경우 어떻게 함수를 호출합니까? – Stephen
이 함수는 자바 JNI와 마찬가지로 다른 언어의 소스 코드에 지정됩니다. 따라서 dlysm을 호출하는 함수의 이름을 쉽게 얻을 수 있지만 인수와 유형은로드 된 함수에 전달할 수없는 다양한 AST 노드로 표시됩니다. –