C라면 dynamic linking을 소스코드에서 구현할 수 있는 표준 라이브러리가 잇는데, 그 과정에서 함수 이름을 인자로 전달하는데 이를 사용하면 될 듯 합니다.
예 : (본인이 만든) libvector.so 라이브러리에서 특정 함수 호출하기 :
(dlfcn.h를 include한 뒤)
void *handle = dlopen("./libvector.so", RTLD_LAZY);
void (*addvec)(int *, int *, int *, int); // 부르고자 하는 함수의 포인터
addvec = dlsym(handle, "addvec"); // addvec이란 함수 포인터를 가져옴
addvec(x, y, z, 2);
JAVA라면 reflection이 아주 훌륭하게 구현되어 있습니다. java.lang.reflect 패키지와 Class.getDeclaredField(String), Class.getDeclaredMethod(String, ...)을 참조하시면 될 듯 합니다.
.
reflection와 meta class란 키워드로 찾아보시면 될 듯 합니다.
C라면 dynamic linking을 소스코드에서 구현할 수 있는 표준 라이브러리가 잇는데, 그 과정에서 함수 이름을 인자로 전달하는데 이를 사용하면 될 듯 합니다.
예 : (본인이 만든) libvector.so 라이브러리에서 특정 함수 호출하기 :
(dlfcn.h를 include한 뒤)
void *handle = dlopen("./libvector.so", RTLD_LAZY);
void (*addvec)(int *, int *, int *, int); // 부르고자 하는 함수의 포인터
addvec = dlsym(handle, "addvec"); // addvec이란 함수 포인터를 가져옴
addvec(x, y, z, 2);
JAVA라면 reflection이 아주 훌륭하게 구현되어 있습니다. java.lang.reflect 패키지와 Class.getDeclaredField(String), Class.getDeclaredMethod(String, ...)을 참조하시면 될 듯 합니다.
답변 감사드립니다.^^
C에서 혹시 라이브러리가 아니라면 불가능한가요?
일반 바이너리라거나 main이 포함된 코드의 경우에는 방법이 없는지요?
친절한 답변 감사합니다.
dlopen()의 첫 번째 인자를 NULL로 주면
dlopen()의 첫 번째 인자를 NULL로 주면 프로그램 자체에서 심볼을 찾습니다. (좀 더 정확한 내용은 manpage 설명을 참고하세요~)
단, 그 프로그램 역시 -rdynamic 컴파일러 옵션을 줘서 컴파일 해야 합니다.
$PWD `date`
functional programming
functional programming language??
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
typedef void
C에서는 원칙적으로는 불가능하고
가능해도 사실 큰 의미는 없는 것이
보안상 사용 가능한 함수 목록은 white list 형식으로
허용되는 함수들 안에서 선택 가능해야 하는데
그렇게 되면 그냥 함수 이름 문자열과 함수 포인터를 가진 테이블을 만들어서
하는 거랑 크게 다를바가 없기 때문이죠.
느낌상, 링커나 로더 수준에서 접근해야할 것
느낌상, 링커나 로더 수준에서 접근해야할 것 같은데요.
함수의 심볼을 처리해야 할 테니...
C언어만 갖고서는 잘 안될 것 같네요.
피할 수 있을때 즐겨라! http://melotopia.net/b
원칙적으로는 불가능하지만, dyncall이라는
원칙적으로는 불가능하지만, dyncall이라는 library가 있습니다. 지원가능한 컴파일러/OS가 좀 제한적이긴 하지만. :)
http://dyncall.org/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
댓글 달기