-
Notifications
You must be signed in to change notification settings - Fork 0
/
dyncall-test.c
101 lines (81 loc) · 3.08 KB
/
dyncall-test.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// dyncall-test.c
// cxw42, 2018
// Based on https://github.com/MoarVM/MoarVM/blob/2018.11/src/core/nativecall_dyncall.c:MVM_nativecall_invoke()
// and https://github.com/MoarVM/MoarVM/blob/2018.11/src/core/nativecall.c:MVM_nativecall_build()
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#include <setjmp.h>
#include <stddef.h>
#include <dynload.h>
#include <dyncall.h>
#include <dyncall_callback.h>
typedef int (*printf_ptr)(
const char *format,
...
);
int main(void) {
DCCallVM *vm;
void *native_result = (void *)0xcafebabe;
int native_int;
DLLib *pLib = (void *)0x31337;
void *msvcrt_printf = (void *)42;
char msg[]=">> Hello, world!\n";
/* Create and set up call VM. */
vm = dcNewCallVM(8192);
dcMode(vm, DC_CALL_C_DEFAULT);
// since nqp/t/nativecall/01 passes '' for the convention,
// which https://github.com/MoarVM/MoarVM/blob/2018.11/src/core/nativecall_dyncall.c:MVM_nativecall_get_calling_convention() maps to C_DEFAULT.
dcReset(vm);
// Call to a specific identifier
dcArgPointer(vm, msg);
printf("About to dcCall\n");
native_result = dcCallPointer(vm, &printf);
printf("After dcCall; result %p\n", native_result);
// ///////////////////////////////////////////////////////////
// Call to a dynamically-loaded function
pLib = dlLoadLibrary("msvcrt.dll");
if(!pLib) {
fprintf(stderr, "Could not load msvcrt\n");
return 1;
}
msvcrt_printf = dlFindSymbol(pLib, "printf");
if(!msvcrt_printf) {
fprintf(stderr, "Could not find printf in msvcrt\n");
return 1;
}
printf("About to dcFree\n");
dcFree(vm);
printf("after dcFree\n");
vm = dcNewCallVM(8192);
//dcMode(vm, DC_CALL_C_X64_WIN64); // No output with this in Cygwin
//dcMode(vm, DC_CALL_C_X86_WIN32_STD); //ditto
//dcMode(vm, DC_CALL_C_ELLIPSIS); //Ditto
//dcMode(vm, DC_CALL_C_ELLIPSIS_VARARGS); //Ditto
//dcMode(vm, DC_CALL_C_X86_CDECL); //ditto
//dcMode(vm, DC_CALL_C_X86_WIN32_FAST_MS); //ditto
//dcMode(vm, DC_CALL_C_X86_WIN32_FAST_GNU); //ditto
//dcMode(vm, DC_CALL_C_X86_WIN32_THIS_MS); //ditto
//dcMode(vm, DC_CALL_C_X86_WIN32_FAST_GNU); //ditto
//dcMode(vm, DC_CALL_SYS_DEFAULT); //ditto
// OF INTEREST: with no dcMode() call, both the dcCall dynamic and the
// direct-call dynamic produce no output. However, when run under cmd,
// both produce the desired output!
dcReset(vm);
dcArgPointer(vm, msg);
printf("\nAbout to dcCall dynamic symbol\n");
native_result = (void *)0xdeadbeef;
// so we know if it doesn't get assigned
native_result = dcCallPointer(vm, msvcrt_printf);
printf("After dcCall; result %p\n", native_result);
printf("About to dcFree\n");
dcFree(vm);
printf("after dcFree\n");
printf("\nAbout to directly call dynamic symbol\n");
native_result = (void *)0xdeadbee;
// so we know if it doesn't get assigned
native_int = (*((printf_ptr)msvcrt_printf))(msg);
printf("After direct call; result %x\n", native_int);
return 0;
}
// vi: set fo-=ro: