2011-02-09 8 views
1

char *function_name = "foo"을 사용하여 C 프로그램에서 foo()으로 전화를 걸 수 있습니다. foo() 루틴은 공유 라이브러리에 있습니다. 나는 모든 dlopen 등에 액세스 할 수 없으며 일반 실행 파일의로드 단계 만 수행합니다. 이 이름을 해결하고 공유 라이브러리에서로드 할 수있는 방법이 있습니까?이름에서 라이브러리 함수를 호출하려면 어떻게해야합니까?

+1

대상 OS는 무엇입니까? – pascal

+0

파스칼이 지적했듯이이 질문에는 실제로 OS 또는 OS 제품군에 대한 태그가 필요합니다. (아마도 POSIX ..?) –

답변

5

아니요. dlopendlsym 중 하나를 사용하거나 함수 이름과 함수 포인터를 배열하여 원하는 방식으로 찾아보십시오.

+1

'dlsym'은 가상 핸들'RTLD_DEFAULT'를 취할 수 있으므로'dlopen'은 필요하지 않을 수도 있습니다. –

+0

사실, 나는 그것을 언급 했어야했다. '-rdynamic'을 사용하여 링크하지 않으면 주 프로그램에 정의 된 기호를 찾지 않습니다. –

+0

나는 이것이 사실이라고 생각했지만 확신해야했다. –

2

함수 이름과로드 주소에 대한 액세스 권한이 없으면이 작업을 수행 할 수 없습니다. Windows에서 LoadLibrary()GetProcAddress()을 사용하여이 작업을 수행 할 수 있습니다.

귀하의 경우, 귀하의 플랫폼, 컴파일러 등을 언급하지 않았거나 가능한지 정확히 알 수 없습니다. 그러나 나는 그렇지 않다고 강력하게 의심합니다.

0

함수를 이름으로 호출하는 일반적인 방법은 이름과 함수 포인터 테이블을 사용하는 것입니다. 이 기술에 대한주의 사항은 함수가 모두 동일한 서명을 가져야한다는 것입니다.

기능 이름은 다르지만 기능 서명이 다를 경우 if-then-else 사다리를 사용해야합니다.

+1

동일한 서명을 가질 필요는 없으며 반환 유형은 동일합니다. 'rettype (*)()'을 프로토 타입 대신에 함수 타입으로 사용할 수 있습니다. 그러면 당신이 그것을 호출 할 때 올바른 인자 타입을 전달할 책임이 있습니다. 또는 모든 함수 포인터 타입이 다른 함수 포인터 타입으로의 라운드 트립 캐스트를 견뎌 낼 수 있기 때문에 all을 호출하기 전에'void (*)()'를 사용하여 올바른 타입으로 캐스트 할 수 있습니다. –

관련 문제