| #include <stdio.h> |
| #include <assert.h> |
| #ifdef _WIN32 |
| #include <windows.h> |
| #else |
| #include <dlfcn.h> |
| #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; |
| } |