On Tue, Oct 09, 2012 at 01:43:06PM -0700, Ian Lance Taylor wrote: > On Tue, Oct 9, 2012 at 11:32 AM, Basile Starynkevitch > <bas...@starynkevitch.net> wrote: > > > > You could provide an extra API to register dlopen & dlclose to > > libbacktrace, if that helps you > > (of course, I would prefer avoiding that) > > I would prefer avoiding that as well. > > Calling dl_iterate_phdr can tell libbacktrace reliably the set of > shared libraries that are currently loaded. The trick is knowing when > to call it. It may simply be OK to call it every time we look up a PC > value, in which case we can look at the dlpi_adds and dlpi_subs field. > I'm not sure.
See unwind-dw2-fde-dip.c how it uses it. I think for all PC queries from one backtrace you should get away with using a cache of last looked up library even without calling dl_iterate_phdr. PCs in the backtrace can't go away from under you in a properly written application (but only those, not others). In between different backtrace calls you need to call dl_iterate_phdr (primarily to lock the ld.so lock and prevent dlopen/dlclose from other threads), but can use a cache there and use dlpi_adds/dlpi_subs to find out when to invalidate the cache. Jakub