// r.c
#include <stdio.h>
// gcc -shared r.c -o r.so -m32
char* a(double d)
{
printf("r.c: %f\n", d * d);
return "hello";
}
// runso.c
#include <stdio.h>
#include <dlfcn.h>
// gcc runso.c -o runso -ldl -m32
// ./runso ./r.so a d3.0 d
// ./runso ./r.so a d3.0 s
#define SETUP_STACK \
i =2; \
while(++i < argc -1) { \
switch(argv[i][0]) { \
case 'i': \
asm volatile("push %0" :: \
"r"(atoi(&argv[i][1]))); \
esp += 4; \
break; \
case 'd': \
atof(&argv[i][1]); \
asm volatile("subl $8, %esp\n" \
"fstpl (%esp)"); \
esp += 8; \
break; \
case 's': \
asm volatile("push %0" :: \