#include #include #ifdef _WIN32 #include #else #include #endif #if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif typedef int (*fptr) (void); int DLL_PUBLIC func_from_executable(void) { return 42; } int main(int argc, char **argv) { int expected, actual; fptr importedfunc; (void)argc; // noop #ifdef _WIN32 HMODULE h = LoadLibraryA(argv[1]); #else void *h = dlopen(argv[1], RTLD_NOW); #endif assert(h != NULL); #ifdef _WIN32 importedfunc = (fptr) GetProcAddress (h, "func"); #else importedfunc = (fptr) dlsym(h, "func"); #endif assert(importedfunc != NULL); assert(importedfunc != func_from_executable); actual = (*importedfunc)(); expected = func_from_executable(); assert(actual == expected); #ifdef _WIN32 FreeLibrary(h); #else dlclose(h); #endif return 0; }