diff --git a/src/libsysprof-analyze/sysprof-elf-private.h b/src/libsysprof-analyze/sysprof-elf-private.h index e8d5ac92..146bc2de 100644 --- a/src/libsysprof-analyze/sysprof-elf-private.h +++ b/src/libsysprof-analyze/sysprof-elf-private.h @@ -35,6 +35,7 @@ SysprofElf *sysprof_elf_new (const char *filename, gboolean sysprof_elf_matches (SysprofElf *self, guint64 file_inode, const char *build_id); +const char *sysprof_elf_get_nick (SysprofElf *self); const char *sysprof_elf_get_file (SysprofElf *self); const char *sysprof_elf_get_build_id (SysprofElf *self); const char *sysprof_elf_get_debug_link (SysprofElf *self); diff --git a/src/libsysprof-analyze/sysprof-elf-symbolizer.c b/src/libsysprof-analyze/sysprof-elf-symbolizer.c index 14a26fdb..5994219e 100644 --- a/src/libsysprof-analyze/sysprof-elf-symbolizer.c +++ b/src/libsysprof-analyze/sysprof-elf-symbolizer.c @@ -100,7 +100,7 @@ sysprof_elf_symbolizer_symbolize (SysprofSymbolizer *symbolizer, goto fallback; return _sysprof_symbol_new (sysprof_strings_get (strings, name), - NULL, + sysprof_strings_get (strings, sysprof_elf_get_nick (elf)), sysprof_strings_get (strings, path), start_address + (begin_address - file_offset), start_address + (end_address - file_offset)); diff --git a/src/libsysprof-analyze/sysprof-elf.c b/src/libsysprof-analyze/sysprof-elf.c index ac4e66bd..54b5e493 100644 --- a/src/libsysprof-analyze/sysprof-elf.c +++ b/src/libsysprof-analyze/sysprof-elf.c @@ -27,6 +27,7 @@ struct _SysprofElf { GObject parent_instance; + const char *nick; char *build_id; char *file; SysprofElf *debug_link_elf; @@ -46,6 +47,51 @@ enum { G_DEFINE_FINAL_TYPE (SysprofElf, sysprof_elf, G_TYPE_OBJECT) static GParamSpec *properties [N_PROPS]; +static GHashTable *nicks; +static const struct { + const char *library; + const char *nick; +} nick_table[] = { + { "libEGL.so", "EGL" }, + { "libEGL_mesa.so", "Mesa EGL" }, + { "libGL.so", "GL" }, + { "libX11-xcb.so", "X11" }, + { "libX11.so", "X11" }, + { "libc.so", "libc" }, + { "libcairo-gobject.so", "Cairo" }, + { "libcairo.so", "Cairo" }, + { "libclutter-1.0.so", "Clutter" }, + { "libclutter-glx-1.0.so", "Clutter" }, + { "libffi.so", "libffi" }, + { "libgdk-3.so", "GDK 3" }, + { "libgio-2.0.so", "Gio" }, + { "libgirepository-1.0.so", "Introspection" }, + { "libgjs.so", "GJS" }, + { "libglib-2.0.so", "GLib" }, + { "libgobject-2.0.so", "GObject" }, + { "libgstreamer-1-0.so", "GStreamer" }, + { "libgtk-3.so", "GTK 3" }, + { "libgtk-4.so", "GTK 4" }, + { "libgtksourceview-3.0.so", "GtkSourceView 3" }, + { "libgtksourceview-4.so", "GtkSourceView 4" }, + { "libgtksourceview-5.so", "GtkSourceView 5" }, + { "libharfbuzz-cairo.so", "Harfbuzz" }, + { "libharfbuzz-gobject.so", "Harfbuzz" }, + { "libharfbuzz-icu.so", "Harfbuzz" }, + { "libharfbuzz-subset.so", "Harfbuzz" }, + { "libharfbuzz.so", "Harfbuzz" }, + { "libinput.so", "Mutter" }, + { "libmutter-12.so", "Mutter" }, + { "libpango-1.0.so", "Pango" }, + { "libpangocairo-1.0.so", "Pango" }, + { "libpipewire-0.3.so", "Pipewire" }, + { "libpixman-1.so", "Pixman" }, + { "libstdc++.so", "libc" }, + { "libwayland-client.so", "Wayland Client" }, + { "libwayland-cursor.so", "Wayland Cursor" }, + { "libwayland-egl.so", "Wayland EGL" }, + { "libwayland-server.so", "Wayland Server" }, +}; static void sysprof_elf_finalize (GObject *object) @@ -140,6 +186,12 @@ sysprof_elf_class_init (SysprofElfClass *klass) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_properties (object_class, N_PROPS, properties); + + nicks = g_hash_table_new (g_str_hash, g_str_equal); + for (guint i = 0; i < G_N_ELEMENTS (nick_table); i++) + g_hash_table_insert (nicks, + (char *)nick_table[i].library, + (char *)nick_table[i].nick); } static void @@ -147,6 +199,25 @@ sysprof_elf_init (SysprofElf *self) { } +static void +guess_nick (SysprofElf *self, + const char *name, + const char *endptr) +{ + char key[32]; + + if (endptr <= name) + return; + + if (endptr - name >= sizeof key) + return; + + memcpy (key, name, endptr-name); + key[endptr-name] = 0; + + self->nick = g_hash_table_lookup (nicks, key); +} + SysprofElf * sysprof_elf_new (const char *filename, GMappedFile *mapped_file, @@ -166,6 +237,20 @@ sysprof_elf_new (const char *filename, self->parser = g_steal_pointer (&parser); self->file_inode = file_inode; + if (filename != NULL) + { + const char *base; + const char *endptr; + + if ((base = strrchr (filename, '/'))) + { + endptr = strstr (++base, ".so"); + + if (endptr != NULL && (endptr[3] == 0 || endptr[3] == '.')) + guess_nick (self, base, &endptr[3]); + } + } + return self; } @@ -284,3 +369,11 @@ sysprof_elf_matches (SysprofElf *self, return TRUE; } + +const char * +sysprof_elf_get_nick (SysprofElf *self) +{ + g_return_val_if_fail (SYSPROF_IS_ELF (self), NULL); + + return self->nick; +}