xref: /openbsd-src/gnu/usr.bin/binutils/gdb/testsuite/gdb.base/solib.c (revision b725ae7711052a2233e31a66fefb8a752c388d7a)
1*b725ae77Skettenis /* This program uses HP-UX-specific features to load and unload SOM
2*b725ae77Skettenis    shared libraries that it wasn't linked against (i.e., libraries
3*b725ae77Skettenis    that the loader doesn't automatically load along with the program
4*b725ae77Skettenis    itself).
5*b725ae77Skettenis    */
6*b725ae77Skettenis 
7*b725ae77Skettenis #include <stdio.h>
8*b725ae77Skettenis #include <dl.h>
9*b725ae77Skettenis 
main()10*b725ae77Skettenis int main ()
11*b725ae77Skettenis {
12*b725ae77Skettenis   shl_t  solib_handle;
13*b725ae77Skettenis   int  dummy;
14*b725ae77Skettenis   int  status;
15*b725ae77Skettenis   int  (*solib_main) (int);
16*b725ae77Skettenis 
17*b725ae77Skettenis   /* Load a shlib, with immediate binding of all symbols.
18*b725ae77Skettenis 
19*b725ae77Skettenis      Note that the pathname of the loaded shlib is assumed to be relative
20*b725ae77Skettenis      to the testsuite directory (from whence the tested GDB is run), not
21*b725ae77Skettenis      from dot/.
22*b725ae77Skettenis    */
23*b725ae77Skettenis   dummy = 1;  /* Put some code between shl_ calls... */
24*b725ae77Skettenis   solib_handle = shl_load ("gdb.base/solib1.sl", BIND_IMMEDIATE, 0);
25*b725ae77Skettenis 
26*b725ae77Skettenis   /* Find a function within the shlib, and call it. */
27*b725ae77Skettenis   status = shl_findsym (&solib_handle,
28*b725ae77Skettenis                         "solib_main",
29*b725ae77Skettenis                         TYPE_PROCEDURE,
30*b725ae77Skettenis                         (long *) &solib_main);
31*b725ae77Skettenis   status = (*solib_main) (dummy);
32*b725ae77Skettenis 
33*b725ae77Skettenis   /* Unload the shlib. */
34*b725ae77Skettenis   status = shl_unload (solib_handle);
35*b725ae77Skettenis 
36*b725ae77Skettenis   /* Load a different shlib, with deferred binding of all symbols. */
37*b725ae77Skettenis   dummy = 2;
38*b725ae77Skettenis   solib_handle = shl_load ("gdb.base/solib2.sl", BIND_DEFERRED, 0);
39*b725ae77Skettenis 
40*b725ae77Skettenis   /* Find a function within the shlib, and call it. */
41*b725ae77Skettenis   status = shl_findsym (&solib_handle,
42*b725ae77Skettenis                         "solib_main",
43*b725ae77Skettenis                         TYPE_PROCEDURE,
44*b725ae77Skettenis                         (long *) &solib_main);
45*b725ae77Skettenis   status = (*solib_main) (dummy);
46*b725ae77Skettenis 
47*b725ae77Skettenis   /* Unload the shlib. */
48*b725ae77Skettenis   status = shl_unload (solib_handle);
49*b725ae77Skettenis 
50*b725ae77Skettenis   /* Reload the first shlib again, with deferred symbol binding this time. */
51*b725ae77Skettenis   dummy = 3;
52*b725ae77Skettenis   solib_handle = shl_load ("gdb.base/solib1.sl", BIND_IMMEDIATE, 0);
53*b725ae77Skettenis 
54*b725ae77Skettenis   /* Unload it without trying to find any symbols in it. */
55*b725ae77Skettenis   status = shl_unload (solib_handle);
56*b725ae77Skettenis 
57*b725ae77Skettenis   /* All done. */
58*b725ae77Skettenis   dummy = -1;
59*b725ae77Skettenis   return 0;
60*b725ae77Skettenis }
61