2011-04-11 5 views
8

저는 arm9 프로세서 기반의 프로젝트를 진행하고 있습니다. 운영 체제가 없어도 베어 메탈 만 사용하므로 불행히도 공유 라이브러리/동적 로더는 아직 지원하지 않습니다.베어 메탈 암 애플리케이션 용 동적 로더 작성 방법

예를 들어 메인 애플리케이션의 기능을 호출 할 수있는 SD 카드에서 라이브러리를로드하고 싶습니다.

첫 번째 시도는 링커 오버레이 기능 (특정 절대적으로 배치 된 섹션에 라이브러리 배치)을 사용했지만, 앞서 언급 한 주 앱 기능 호출시 문제가 있습니다.> 라이브러리에있는 주요 응용 프로그램의 각 변경 사항과 함께 콜백 할 수 있도록 다시 컴파일해야합니다.

이 사실에 따르면 나는 내 자신의 동적 로더를 작성해야하지만이 분야에서는 초보자입니다. 누군가가 그걸 다루는 방법이나 그러한 프로젝트로 시작하는 방법을 보여 주실 수 있습니까? arm-elf 타겟에 gcc를 사용하고 있습니다.

는 월

+0

일반적으로 "라이브러리"가 "프로그램"을 다시 호출하면 라이브러리에 대한 이전 호출에서 전달 된 함수 포인터를 호출하여이를 수행합니다. 그런 식으로 도서관은 프로그램 개정에 의존하지 않습니다. 프로그램을 라이브러리의 정확한 빌드에 "덜"의존하게 만드는 경우 점프 테이블은 간단합니다. –

답변

5

확인 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); 
    //... 
} 

희망이 도움이되었습니다.

+0

답변 해 주셔서 감사합니다. 팔 컴파일러 툴체인이 GCC와 얼마나 다른지 알고 계십니까? appnote는 점프 테이블을 만들기위한 symdefs 파일 사용을 제안합니다.하지만 불행히도 gcc에서 symdefs 대안을 모르겠습니다 ... – Honza

+0

symdefs는 무엇인지 확실하지 않지만 jumptables에 작은 howto를 추가했습니다. 충분히 명확하다. –

+0

jumtables에 대한 정보를 가져 주셔서 감사합니다. 내가 필요한만큼 완벽한 예입니다. – Honza