2 /* Code to test runtime linking functionality.
3 * Load a shared object at runtime and verify that arguments passed to
4 * and from a function that is dynamically looked up make sense.
5 * This tests that (a) dynamic linking works at all (otherwise all the dl*
6 * functions don't work) and (b) the dynamic loading functionality works
7 * and (c) the PLT is sane and calling convention makes sense.
9 * We have to pass an absolute path to dlopen() for which we rely on
10 * the test run script.
12 * The module we load is in mod.c.
24 int main (int argc
, char *argv
[])
27 long (*modf
) (long, long *, long);
28 long v
, *cookie
= NULL
, cookie2
= 0;
33 fprintf(stderr
, "Usage: %s <module>\n", argv
[0]);
37 if(!(dlhandle
= dlopen(argv
[1], RTLD_LAZY
))) e(1);
39 if(!(modf
= dlsym(dlhandle
, "modfunction"))) e(2);
40 if(!(cookie
= (long *) dlsym(dlhandle
, "cookie"))) e(3);
42 if(*cookie
== MAGIC2
) { fprintf(stderr
, "cookie already set\n"); e(4); }
43 if(cookie2
== MAGIC3
) { fprintf(stderr
, "cookie2 already set\n"); e(5); }
45 v
= modf(MAGIC4
, &cookie2
, MAGIC5
);
47 if(v
!= MAGIC1
) { fprintf(stderr
, "return value wrong\n"); e(9); }
48 if(*cookie
!= MAGIC2
) { fprintf(stderr
, "cookie set wrongly\n"); e(6); }
49 if(cookie2
!= MAGIC3
) { fprintf(stderr
, "cookie2 set wrongly\n"); e(7); }
53 if(v
!= MAGIC1
) { fprintf(stderr
, "wrong return value.\n"); e(8); }