knlist - look up symbols in the currently running kernel
#include <nlist.h>
int knlist(
struct nlist namelist );
Standard C Library (libc.a, libc.so)
On input, lists the symbol names for which you are
requesting addresses. The namelist must be terminated with
a null name at end. Without a terminating null name at
end, knlist() cannot determine how many symbols are in the
namelist and therefore may dump core.
On return, contains a list of symbol addresses (or
0 if the attempt to find the addresses was unsuccessful).
The knlist() library routine looks up addresses of kernel
symbols in the currently running kernel. In addition to
finding symbols associated with the kernel image, knlist()
will also find symbols defined in dynamically loaded subsystems.
Communication with the knlist() routine occurs using an
array of type struct nlist. The <nlist.h> header file
declares that type as follows:
struct nlist {
char *n_name;
unsigned long n_value;
short n_type; /* 0 if not there, 1 if
found */
short reserved; };
When your application calls knlist(), it passes the names
of symbols in the n_name field of the structure.
For each symbol, the knlist() routine attempts to determine
its current address in memory. If the routine can
determine the address of the symbol, it returns that
address in the n_value field, and it returns one (1) in
the n_type field. If the routine cannot determine the
address, it returns zero (0) in both the n_value field and
the n_type field.
For BSD compatibility, the knlist() routine allows symbol
names to be preceded by an underscore. If it does not find
a symbol that matches the name as specified, knlist()
attempts to locate the symbol name with the leading underscore
removed.
The knlist() routine returns zero on success. The routine
returns -1 if it was unable to connect to the kloadsrv
daemon. In this case, the routine was unable to determine
any of the requested addresses. The routine returns a positive
integer if it successfully finds some addresses and
fails to find others. The integer value indicates the number
of addresses knlist() was unable to return.
The routine returns the negative value of EINVAL if the
argument is bad.
The following example illustrates the use of the knlist()
routine:
#include <stdio.h> #include <string.h> #include <stdlib.h>
#include <nlist.h> main () {
struct nlist nl[3];
int retval, i;
nl[0].n_name = (char *)malloc(10);
nl[1].n_name = (char *)malloc(10);
nl[2].n_name = ;
/*******************************************************/
/* Store names of kernel symbols in the nl array
*/
strcpy (nl[0].n_name, "ncpus");
strcpy (nl[1].n_name, "lockmode");
/*******************************************************/
/* Call the knlist routine
*/
retval = knlist(nl);
/******************************************************/
/* Display addresses if returned. Otherwise, display
*/
/* the appropriate error message.
*/
if (retval < 0)
printf ("No kernel symbol addresses returned.\n");
else
if (retval >= 0 )
for (i=0; i<2; i++)
if (nl[i].n_type == 0)
printf ("Unable to return address of symbol
%s\n",
nl[i].n_name);
else
printf ("The address of symbol %s is
%lx\n",
nl[i].n_name, nl[i].n_value);
free (nl[0].n_name);
free (nl[1].n_name); }
This example tests the return value from the knlist() routine.
If the routine returns an error status, a message is
displayed to the application user. Otherwise, the application
checks the status of each kernel symbol. If the
knlist() routine was unable to return an address, the
application displays a message and the symbol name. If the
knlist() routine returns an address, the application displays
the symbol name and address to the application user.
Routines: nlist(3)
knlist(3)
[ Back ] |