From: Milian Wolff Date: Thu, 7 Jul 2022 17:33:35 +0000 (+0200) Subject: Introduce public dwfl_get_debuginfod_client API X-Git-Tag: elfutils-0.188~58 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a4b1839c3c46d461765de894dc4b4b0c5580fc1b;p=thirdparty%2Felfutils.git Introduce public dwfl_get_debuginfod_client API Dwfl can use debuginfod internally, which was so far totally opaque to the outside. While the functionality is great for users of the dwfl API, the long wait times induced by downloading of data over debuginfod lead to complaints by endusers. To offer them a bit more insight into the internal ongoings, one can now use e.g. `debuginfod_set_progressfn` on the handle returned by `dwfl_get_debuginfod_client` to report download progress. Rename get_client to dwfl_get_debuginfod_client and make it public. Unconditionally compile debuginfod-client.c and stub the new public function and always return NULL when debuginfod integration was disabled. Signed-off-by: Milian Wolff --- diff --git a/libdw/libdw.map b/libdw/libdw.map index 4f530378e..3fdf3f936 100644 --- a/libdw/libdw.map +++ b/libdw/libdw.map @@ -366,3 +366,8 @@ ELFUTILS_0.186 { dwarf_linecontext; dwarf_linefunctionname; } ELFUTILS_0.177; + +ELFUTILS_0.187 { + global: + dwfl_get_debuginfod_client; +} ELFUTILS_0.186; diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog index b3ca56cb4..890df156e 100644 --- a/libdwfl/ChangeLog +++ b/libdwfl/ChangeLog @@ -1,3 +1,8 @@ +2022-06-22 Milian Wolff + + * libdwfl.h, debuginfod-client.c (dwfl_get_debuginfod_client): + Rename get_client to dwfl_get_debuginfod_client and make it public. + 2022-05-15 Mark Wielaard * libdwfl.h (dwfl_module_addrinfo): Update docs and nonnull diff --git a/libdwfl/Makefile.am b/libdwfl/Makefile.am index a0013e410..3278358d8 100644 --- a/libdwfl/Makefile.am +++ b/libdwfl/Makefile.am @@ -70,7 +70,7 @@ libdwfl_a_SOURCES = dwfl_begin.c dwfl_end.c dwfl_error.c dwfl_version.c \ link_map.c core-file.c open.c image-header.c \ dwfl_frame.c frame_unwind.c dwfl_frame_pc.c \ linux-pid-attach.c linux-core-attach.c dwfl_frame_regs.c \ - gzip.c + gzip.c debuginfod-client.c if BZLIB libdwfl_a_SOURCES += bzip2.c @@ -81,9 +81,6 @@ endif if ZSTD libdwfl_a_SOURCES += zstd.c endif -if LIBDEBUGINFOD -libdwfl_a_SOURCES += debuginfod-client.c -endif libdwfl = $(libdw) libdw = ../libdw/libdw.so diff --git a/libdwfl/debuginfod-client.c b/libdwfl/debuginfod-client.c index 153260c3f..813043b13 100644 --- a/libdwfl/debuginfod-client.c +++ b/libdwfl/debuginfod-client.c @@ -32,6 +32,9 @@ #endif #include "libdwflP.h" + +#ifdef ENABLE_LIBDEBUGINFOD + #include #include @@ -46,8 +49,8 @@ static pthread_once_t init_control = PTHREAD_ONCE_INIT; /* NB: this is slightly thread-unsafe */ -static debuginfod_client * -get_client (Dwfl *dwfl) +debuginfod_client * +dwfl_get_debuginfod_client (Dwfl *dwfl) { if (dwfl->debuginfod != NULL) return dwfl->debuginfod; @@ -71,7 +74,7 @@ __libdwfl_debuginfod_find_executable (Dwfl *dwfl, int fd = -1; if (build_id_len > 0) { - debuginfod_client *c = get_client (dwfl); + debuginfod_client *c = dwfl_get_debuginfod_client (dwfl); if (c != NULL) fd = (*fp_debuginfod_find_executable) (c, build_id_bits, build_id_len, NULL); @@ -88,7 +91,7 @@ __libdwfl_debuginfod_find_debuginfo (Dwfl *dwfl, int fd = -1; if (build_id_len > 0) { - debuginfod_client *c = get_client (dwfl); + debuginfod_client *c = dwfl_get_debuginfod_client (dwfl); if (c != NULL) fd = (*fp_debuginfod_find_debuginfo) (c, build_id_bits, build_id_len, NULL); @@ -105,7 +108,7 @@ __libdwfl_debuginfod_end (debuginfod_client *c) } /* Try to get the libdebuginfod library functions. - Only needs to be called once from get_client. */ + Only needs to be called once from dwfl_get_debuginfod_client. */ static void __libdwfl_debuginfod_init (void) { @@ -134,3 +137,13 @@ __libdwfl_debuginfod_init (void) } } } + +#else // ENABLE_LIBDEBUGINFOD + +debuginfod_client * +dwfl_get_debuginfod_client (Dwfl *) +{ + return NULL; +} + +#endif // ENABLE_LIBDEBUGINFOD diff --git a/libdwfl/libdwfl.h b/libdwfl/libdwfl.h index c55a8eaa3..b323e8fb9 100644 --- a/libdwfl/libdwfl.h +++ b/libdwfl/libdwfl.h @@ -49,6 +49,9 @@ typedef struct Dwfl_Thread Dwfl_Thread; PC location described by an FDE belonging to Dwfl_Thread. */ typedef struct Dwfl_Frame Dwfl_Frame; +/* Handle for debuginfod-client connection. */ +typedef struct debuginfod_client debuginfod_client; + /* Callbacks. */ typedef struct { @@ -795,6 +798,13 @@ int dwfl_getthread_frames (Dwfl *dwfl, pid_t tid, bool dwfl_frame_pc (Dwfl_Frame *state, Dwarf_Addr *pc, bool *isactivation) __nonnull_attribute__ (1, 2); +/* Return the internal debuginfod-client connection handle for the DWFL session. + When the client connection has not yet been initialized, it will be done on the + first call to this function. If elfutils is compiled without support for debuginfod, + NULL will be returned. + */ +extern debuginfod_client *dwfl_get_debuginfod_client (Dwfl *dwfl); + #ifdef __cplusplus } #endif diff --git a/libdwfl/libdwflP.h b/libdwfl/libdwflP.h index 7503a6273..9f598370f 100644 --- a/libdwfl/libdwflP.h +++ b/libdwfl/libdwflP.h @@ -786,6 +786,7 @@ INTDECL (dwfl_getthread_frames) INTDECL (dwfl_getthreads) INTDECL (dwfl_thread_getframes) INTDECL (dwfl_frame_pc) +INTDECL (dwfl_get_debuginfod_client) /* Leading arguments standard to callbacks passed a Dwfl_Module. */ #define MODCB_ARGS(mod) (mod), &(mod)->userdata, (mod)->name, (mod)->low_addr