123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- #include <stdio.h>
- int func_from_language_runtime(void);
- typedef int (*fptr) (void);
- #ifdef _WIN32
- #include <windows.h>
- wchar_t*
- win32_get_last_error (void)
- {
- wchar_t *msg = NULL;
- FormatMessageW (FORMAT_MESSAGE_ALLOCATE_BUFFER
- | FORMAT_MESSAGE_IGNORE_INSERTS
- | FORMAT_MESSAGE_FROM_SYSTEM,
- NULL, GetLastError (), 0,
- (LPWSTR) &msg, 0, NULL);
- return msg;
- }
- int
- main (int argc, char **argv)
- {
- HINSTANCE handle;
- fptr importedfunc;
- int expected, actual;
- int ret = 1;
- handle = LoadLibraryA (argv[1]);
- if (!handle) {
- wchar_t *msg = win32_get_last_error ();
- printf ("Could not open %s: %S\n", argv[1], msg);
- goto nohandle;
- }
- importedfunc = (fptr) GetProcAddress (handle, "func");
- if (importedfunc == NULL) {
- wchar_t *msg = win32_get_last_error ();
- printf ("Could not find 'func': %S\n", msg);
- goto out;
- }
- actual = importedfunc ();
- expected = func_from_language_runtime ();
- if (actual != expected) {
- printf ("Got %i instead of %i\n", actual, expected);
- goto out;
- }
- ret = 0;
- out:
- FreeLibrary (handle);
- nohandle:
- return ret;
- }
- #else
- #include<dlfcn.h>
- #include<assert.h>
- int main(int argc, char **argv) {
- void *dl;
- fptr importedfunc;
- int expected, actual;
- char *error;
- int ret = 1;
- dlerror();
- dl = dlopen(argv[1], RTLD_LAZY);
- error = dlerror();
- if(error) {
- printf("Could not open %s: %s\n", argv[1], error);
- goto nodl;
- }
- importedfunc = (fptr) dlsym(dl, "func");
- if (importedfunc == NULL) {
- printf ("Could not find 'func'\n");
- goto out;
- }
- assert(importedfunc != func_from_language_runtime);
- actual = (*importedfunc)();
- expected = func_from_language_runtime ();
- if (actual != expected) {
- printf ("Got %i instead of %i\n", actual, expected);
- goto out;
- }
- ret = 0;
- out:
- dlclose(dl);
- nodl:
- return ret;
- }
- #endif
|