
#if 0
	*** dlinfo.c ***
	gets information about a shared symbol
	usage: $0 <symbol_name>
#endif

#include <stdio.h>
#include <dlfcn.h>

void usage();


int main(argc, argv)
	int argc;
	char **argv;
{
	unsigned int n = 0;
	void (*func)();
	Dl_info dlinfo;

	if (argc < 2) {
		usage(argv[0]);
	}

	dlerror();
	while (++n < argc) {
		char *symname = argv[n];
		if (!(func = dlsym (RTLD_NEXT, symname))) {
			char *errstr = dlerror();
			if (errstr) {
				fprintf (stderr, "... %s\n\n", errstr);
				fflush (stderr);
				continue;
			}
		}

		if (!(dladdr (func, &dlinfo))) {
			fprintf (stderr, "... %s: dlsym() found symbol, but"
					" does not exist\n\n", symname);
			fflush (stderr);
			continue;
		}

		fprintf (stdout,
				"*** %s ***\n" 
				"object name:    %s\n"
				"load address:   %p\n"
				"nearest symbol: %s\n"
				"symbol value:   %p\n\n",
				symname,
				dlinfo.dli_fname,
				dlinfo.dli_fbase,
				dlinfo.dli_sname,
				dlinfo.dli_saddr);
		fflush (stdout);
	}
	return (0);
}

void usage(name)
	char *name;
{
	fprintf (stderr, "usage: %s <symbol_name> [...]\n", name);
	_exit(1);
}
