There is no libc function to do that. However, you can write one yourself (though the code is somewhat involved).
On Linux, dlopen()
in fact returns the address of a link_map
structure, which has a member named l_addr
that points to the base address of the loaded shared object (assuming your system doesn't randomize shared library placement, and that your library has not been prelinked).
On Linux, a sure way to find the base address (the address of Elf*_Ehdr
) is to use dl_iterate_phdr()
after dlopen()
ing the library.
Having the ELF header, you should be able to iterate over a list of exported symbols (the dynamic symbol table), by first locating the Elf*_Phdr
of type PT_DYNAMIC
, and then locating DT_SYMTAB
, DT_STRTAB
entries, and iterating over all symbols in the dynamic symbol table. Use /usr/include/elf.h
to guide you.
Additionally, you could use libelf, but I'm unable to guide you since I don't have previous experience with it.
Finally note that the exercise is somewhat futile: you'll get a list of defined functions, but you'll have no idea how to call them (what parameters they expect), so what's the point?