.callbacks 라는 섹션에 callback_reg_t 구조체의 배열이 들어가게 됩니다.
그 배열들 중 첫번째 요소는 cbstart 라는 마킹용 더미이고, 마지막 요소역시 cbend 라는 마킹용 더미입니다.
cbstart 와 cbend 사이에 있는 callback_reg_t 들을 가져와서 callback_register() 로 등록합니다.
원하는 callback_reg_t 구조체를 를 .callbacks 섹션에 집어넣기 위해선 __callback 매크로를 사용합니다.
사용 예제는 test1_module.c 과 test2_module.c 에 있습니다.
잘난 체 하려고 파일을 나눠놨는데... 코드 어디에 있어도 상관은 없습니다만,
링크할 때 cbstart.o 와 cbend.o 사이에 반드시 오브젝트가 있어야 합니다.
(이게... 원래는 링크스립트를 만들어서 .callbacks 섹션의 위치를 코드에 알려주도록 해야하는데,
배보다 배꼽이 더 커지는 것 같아서... 아주 무식해지기로 작심하고 마킹용 더미를 집어넣는 바람에 링크 순서에 주의해야하는 상황이 됐습니다.)
만만한 hash-table로 구성해도 편하지 않을까요?
냉무.
Hash-table로 구성을
Hash-table로 구성을 한다면 괜찮을 듯 하네요.
그런데 hash-table에 Insert를 해야 할텐데요.
만약 특정 키워드에 매칭되는 함수가 꽤 많다면 약 1000개 정도 된다면...
어떻게 insert를 해주면 될까요?
수작업????
에라이디여~ 초급 산을 넘어라~
고전적인
고전적인 방법이라면, 따로 script를 만들어서 { ... } entry만 들어있는 .c를 만들 수도 있겠고, dlopen()후 dlsym()을 쓰는 방법도 있겠네요.
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
gcc 입니다. 좀
gcc 입니다.
좀 무식하지만... section 을 따로 잡고 밀어넣은 다음에 초기화 할 때 일괄등록하는 방법도 가능합니다.
첨부 예제에서는 .callbacks 라는 섹션으로 잡았고,
시작점과 끝점을 대단히 무식한 방법으로 가져왔습니다.
OTL
bootmeta님, cinsk님 답변
bootmeta님, cinsk님 답변 감사합니다.
@cinsk님 좀 더 여쭙게씁니다.
고전적인 방법의 의미는
===========
reference.c file
===========
struct a {
char *str;
void (*fp)(void);
};
struct a tmp = {
{"kldp1", FunPKLDP1}
{"kldp2", FunPKLDP2}
{"kldp3", FunPKLDP3}
.
.
.
{"kldp100", FunPKLDP100}
};
이렇게 한 파일에 정의를 해놓고
해쉬 테이블에 삽입하는 방법을 의미 하신 건가요???
에라이디여~ 초급 산을 넘어라~
컴파일 타임에
컴파일 타임에 끝장을 보고 싶으신 거라면 gperf 를 사용해서 자동화를 시켜버리시죠.
해시테이블 만들어주고 lookup 함수도 만들어줍니다.
OTL
bushi님 답변
bushi님 답변 감사합니다.
첨부 파일은 잘 보았습니다.
제가 아직 많이 부족해서 더 여쭙겠습니다.
첨부 파일 소스에
callback_init () 호출 시
callback_register ()를 호출하면서 등록이 되는데
등롤 될때
for 문을 돌면서 등록이 됩니다 그 때 인자는 단순히 __start, __end뿐인데
어떻게 test1, test2가 등록이 되죠?
답변주신것도 이해 못해서 죄송합니다.
에라이디여~ 초급 산을 넘어라~
.callbacks 라는 섹션에
.callbacks 라는 섹션에 callback_reg_t 구조체의 배열이 들어가게 됩니다.
그 배열들 중 첫번째 요소는 cbstart 라는 마킹용 더미이고, 마지막 요소역시 cbend 라는 마킹용 더미입니다.
cbstart 와 cbend 사이에 있는 callback_reg_t 들을 가져와서 callback_register() 로 등록합니다.
원하는 callback_reg_t 구조체를 를 .callbacks 섹션에 집어넣기 위해선 __callback 매크로를 사용합니다.
사용 예제는 test1_module.c 과 test2_module.c 에 있습니다.
잘난 체 하려고 파일을 나눠놨는데... 코드 어디에 있어도 상관은 없습니다만,
링크할 때 cbstart.o 와 cbend.o 사이에 반드시 오브젝트가 있어야 합니다.
(이게... 원래는 링크스립트를 만들어서 .callbacks 섹션의 위치를 코드에 알려주도록 해야하는데,
배보다 배꼽이 더 커지는 것 같아서... 아주 무식해지기로 작심하고 마킹용 더미를 집어넣는 바람에 링크 순서에 주의해야하는 상황이 됐습니다.)
OTL
댓글 달기