확인 this application note에게 간주한다. 동적 링크가 작동하는 방법과 자체 동적 로더를 작성하기 위해 수행해야하는 작업에 대해 자세히 설명합니다. 그것은 또한 그것에 대한 몇 가지 대안을 제시합니다. 점프 테이블 중 하나는 구현하기가 쉽고 API 주소를 변경하면 문제가 해결 될 것입니다.
편집 : 여기에 간단한 점프 테이블을 수행하는 방법이다. 먼저 주 프로그램에서 내보낼 기능을 결정하십시오. 포인터 작성이 구조의 인스턴스를 정의, 메인 프로그램에서
typedef struct _MyAPI
{
int (*init)(int flags);
int (*exit)(int exitcode);
void * (*getmem)(size_t size);
void (*freemem)(void *ptr);
} MyAPI;
, 일부 미리 정의 된 주소에 배치 : 다음 함수 포인터의 구조를 만들 당신이 경우 (
#include <jumptbl.h>
int main_init(int flags)
{
return 0;
}
//...
MyAPI main_API __attribute__((section(".jumptbl"))) =
{
&main_init,
&main_exit,
&main_getmem,
&main_freemem,
};
이 방법을 사용하면 링커 파일의 .jumptbl 섹션을 설명하고 고정 주소가 있는지 확인해야합니다.
로드 된 모듈에서 점퍼 테이블에 포인터를 가져와 주 프로그램을 호출하는 데 사용합니다.
#include <jumptbl.h>
MyAPI *pAPI = (MyAPI*)(0x1000000); // there should be a better way to do this
int main()
{
pAPI->init(0);
void *block = pAPI->getmem(0x30);
//...
}
희망이 도움이되었습니다.
일반적으로 "라이브러리"가 "프로그램"을 다시 호출하면 라이브러리에 대한 이전 호출에서 전달 된 함수 포인터를 호출하여이를 수행합니다. 그런 식으로 도서관은 프로그램 개정에 의존하지 않습니다. 프로그램을 라이브러리의 정확한 빌드에 "덜"의존하게 만드는 경우 점프 테이블은 간단합니다. –