HP-UX Linker and Libraries User's Guide
1. Declare a pointer to a data structure of the same type as the data structure to access in the
library
2. Using shl_findsym with the type parameter set to TYPE_DATA, find the symbol in the
shared library and assign its address to the pointer declared in Step 1
3. Access the data through the pointer obtained in Step 2
shl_findsym Example
Suppose you have a set of libraries that output to various graphics devices. Each graphics device
has its own library. Although the actual code in each library varies, the routines in these shared
libraries have the same name and parameters, and the global data is the same. For instance, they
all have these routines and data:
opens the graphics device for outputgopen()
closes the graphics devicegclose()
moves to pixel location x,ymove2d(x,y)
draws to pixel location x,y from current x,ydraw2d(x,y)
contains the maximum X pixel location on the output devicemaxX
contains the maximum Y pixel location on the output devicemaxY
The following example shows a C program that can load any supported graphics library at run
time, and call the routines and access data in the library. The program calls load_lib (see
“shl_load Example” (page 170) ) to load the library.
Load a Shared Library and Call its Routines and Access its Data
#include <stdio.h> /* contains standard I/O defs */
#include <stdlib.h> /* contains getenv definition */
#include <dl.h> /* contains shared library type defs */
/*
* Define linker symbols:
*/
#define GOPEN "gopen"
#define GCLOSE "gclose"
#define MOVE2D "move2d"
#define DRAW2D "draw2d"
#define MAXX "maxX"
#define MAXY "maxY"
shl_t load_lib(int argc, char * argv[]);
main(int argc,
char * argv[])
{
shl_t lib_handle; /* handle of shared library */
int (*gopen)(void); /* opens the graphics device */
int (*gclose)(void); /* closes the graphics device */
int (*move2d)(int, int); /* moves to specified x,y location */
int (*draw2d)(int, int); /* draw line to specified x,y location*/
int *maxX; /* maximum X pixel on device */
int *maxY; /* maximum Y pixel on device */
lib_handle = load_lib(argc, argv); /* load required shared library */
/*
* Get addresses of all functions and data that will be used:
*/
if (shl_findsym(&lib_handle, GOPEN, TYPE_PROCEDURE, (void *) &gopen))
perror("shl_findsym: error finding function gopen"), exit(1);
if (shl_findsym(&lib_handle, GCLOSE, TYPE_PROCEDURE, (void *) &gclose))
perror("shl_findsym: error finding function gclose"), exit(1);
if (shl_findsym(&lib_handle, MOVE2D, TYPE_PROCEDURE, (void *) &move2d))
perror("shl_findsym: error finding function move2d"), exit(1);
174 Shared Library Management Routines