C언어에서 함수명으로 함수 호출하는 방법
프로그래밍 QnA 를 보니 다음과 같은 글이 있었다.
함수이름을 입력으로 함수를 실행할 수 있는 방법이 있을까요?
그곳에 답변을 적으려다 그냥 여기에 남겨본다.
dlopen 함수가 있는데 다음과 같이 첫번째 인수를 NULL 로 주고 호출하면 실행되는 프로세스의 이미지의 심볼들을 참조할 수 있게된다.
void *shlib = dlopen(NULL, 0);
참고로 윈도우의 경우에는 다음과 같이 호출한다.
HMODULE hmod;
GetModuleHandleEx(0,0,&hmod);
두번째 인수는 0 을 줘도 되나 시스템에 따라 RTLD_GLOBAL 등을 주어야 할 경우 도 있다. man 페이지를 보고 적절하게 주면 된다.
위 함수가 성공하면 다음과 같이 함수의 주소를 알아낼 수 있게 된다. 가장 유명한 printf 함수를 예로 들어보자.
int (*func)(const char *format, ...) = dlsym(shlib, "printf");
함수의 실행은 다음과 같이 한다. 사용법은 printf 함수 사용법과 동일하게 하면 된다. 물론 func 가 NULL 이 아닌것은 반드시 체크해야 한다.
func("Hello Call By Function Name %s\n", "printf");
예제 프로그램은 각자 작성해보도록 하시고 위의 방법을 사용할때는 반드시 출처인 여기를 밝히라.
이 방법은 호출되는 DLL 또는 Shared Object 에서도 가능한 방법이다.
아마 DLL 을 만들고 나서 Caller 에 있는 라이브러리 함수를 어떻게 호출하나 몰랐던 사람도 있을 것이다.
이게 답이다.
댓글 달기