FreeBSD에서 dlopen과 친구들의 맨 페이지를 읽고 있습니다. 로드 가능한 플러그인에 공유 라이브러리를 사용하는 교차 플랫폼 응용 프로그램에서 작업하고 있습니다. 나는 전에 이것을 해 본 적이 없지만 그것이 어떻게 작동하는지 잘 알고있다. 맨 페이지에는 공유 라이브러리에서 함수 포인터를 가져 오는 일반적인 방법 인 dlsym()과 void *를 함수 포인터로 캐스팅하는 것에 대한 컴파일러 불만을 피할 수있는 dlfunc()가 언급되어 있습니다. dlsym()이 더 일반적인 이유 (이식성)가 있습니까? 컴파일러 문제를 피하기 위해 dlfunc()를 사용해야하는지 dlsym()을 사용해야하는지 궁금합니다. dlfunc()는 이식 가능합니까?dlfunc의 이식성?
1
A
답변
3
dlfunc
을 다른 UNIX에 제공 할 수는 없지만 구현은 간단하고 이식성이 뛰어납니다. Autoconf를 사용하는 경우
# configure.ac
AC_SYSTEM_EXTENSIONS
AC_CHECK_FUNCS([dlfunc])
// some common header
#include "config.h"
#ifndef HAVE_DLFUNC
/* copied from FreeBSD, source/include/dlfcn.h */
struct __dlfunc_arg {
int __dlfunc_dummy;
};
typedef void (*dlfunc_t)(struct __dlfunc_arg);
dlfunc_t dlfunc(void *restrict handle, void *restrict symbol);
#endif
// some source file
#include "config.h"
#ifndef HAVE_DLFUNC
/* copied from FreeBSD, lib/libc/gen/dlfunc.c */
dlfunc_t dlfunc(void *restrict handle, void *restrict symbol) {
union {
void *d;
dlfunc_t f;
} rv;
rv.d = dlsym(handle, symbol);
return rv.f;
}
#endif
과 같이 할 수 있으며 다른 빌드 + 구성 시스템은 비슷한 기능을 가지고있을 수 있습니다. (dlsym
훨씬 더 광범위하게 사용할 수 있습니다.)
, 나는 컴파일러 경고가 C 표준은하지 않는 바보 – 생각하지만 POSIX는 void *
포인터 안전하게 모든 함수 포인터 중 & hellip를 나타낼 수 있음을 보장;
1
크로스 플랫폼이라고 할 때 크로스 POSIX 플랫폼을 의미합니까 아니면 Windows 지원이 필요합니까?
C++에서 작업하는 경우 Boost.Extension proposal code을 살펴볼 수 있습니다. 이것은 Windows와 UNIX의 이식성을 관리합니다.
UNIX 전용 조언을 찾으려면 Single UNIX Specification을보십시오.
필자가 아는 한 dlsym은 표준 UNIX 방식으로 작업을 수행합니다. Windows는 동등하지만 완전히 다른 방식을 사용합니다.
이 경우 크로스 플랫폼은 크로스 POSIX입니다. 나는 윈도우 프로그래밍의 어두운면을 파고 들기를 갈망하고있다. – Edward
HP-UX - 최소한 PA-RISC 시스템 (고풍에 가까워지고 있음)에는 별도의 시스템이 있습니다. 나는 IA64 기계가 dlsym()/dlopen()을 사용한다고 생각한다. –
예, PA-RISC의 32 비트 HP-UX는 SOM 형식 (shlib_ * 기능)을 사용합니다.이 기능은 다소 고약하며 (분명히 참조 카운팅을하지 않습니다). PA-RISC의 64 비트 HP-UX는 ia64에서 32 비트 및 64 비트 HP-UX와 마찬가지로 ELF를 사용합니다.이 인터페이스는 더 정교한 dl * 인터페이스를 가지고 있습니다. –