2011-09-24 2 views
6

나는 C와 인터페이스 할 수 있기를 원하는 가상 머신에서 일하고있다. 다른 방법으로 가상 머신 기능을 C 코드에 노출시키는 것은 매우 쉽다. 내 머리를 감쌀 수없는 것은 C를 노출시키는 것이다. 기능을 가상 컴퓨터에 제공합니다.C 함수를 사용자 지정 가상 컴퓨터에 표시하려면 어떻게합니까?

내가 동적과 같이 가상 머신과 C 함수를 등록 할 수 있도록하고 싶습니다 :

vm_register(printf); 

그런 다음 내 가상 머신에서, 스택에 인수를 밀어 :

call printf 

문제는 함수에 필요한 인수의 수와 유형을 알지 못해도 함수 포인터를 사용할 수 있는지 잘 모르겠다는 것입니다.

이 상황에서 사용할 수있는 제네릭 함수 포인터 유형이 있습니까? 누군가 나를 올바른 방향으로 인도 할 수 있습니까?

+0

맞춤 V.M. 흥미로운 아이디어. 함수를 노출함으로써, 당신은 D.L.L을 호출하는 것을 의미합니다./공유 객체/공유 라이브러리 함수 또는 "* .h"라이브러리에서? – umlcat

답변

5

일반적인 대답은 어셈블리를 사용하여 직접 구현해야한다는 것입니다. libc와 연결 한 후에는 호출 할 함수의 주소가 있으며 함수를 수동으로 전달해야합니다 (가상 시스템이 실행되는 플랫폼의 호출 규칙을 사용).

운 좋게도 도서관이 있습니다. 바로 libffi입니다. 꽤 사용하기 쉽습니다. 소스에는 몇 가지 문서와 예제가 포함되어 있습니다. 작동 방식에 관심이 있다면 코드 (예 : calling a function using the unix calling convention)를 살펴보세요.

매개 변수 유형과 관련하여 일반적으로 사용자가이를 설명하고 맹목적으로 받아 들여 더 이상 libffi (또는 libffi없이 하드웨어를 사용하는 경우)로 전달해야합니다. 또 다른 방법은 함수 호출을위한 C 헤더 파일을 구문 분석하는 것이지만, 오류가 발생하기 쉽습니다. 그러나 어떤 경우에는 함수의 이진 코드가 인터페이스를 설명하지 않기 때문에 실제로 안전한 방법은 없습니다 (printf 및 해당 함수 사용). 가변 매개 변수 목록은 훨씬 더 그렇습니다).

관련 문제