diff --git a/bin/system-info.c b/bin/system-info.c index 9e79e4bb22973d918c1bf43f03cca6b47fda53ea..e4a7bce3316bbd5be3b5baa781e46bdf4bd0cf08 100644 --- a/bin/system-info.c +++ b/bin/system-info.c @@ -389,8 +389,11 @@ print_libraries_details (JsonBuilder *builder, for (GList *l = libraries; l != NULL; l = l->next) { const char *name = srt_library_get_requested_name (l->data); - if (verbose || srt_library_get_issues (l->data) != SRT_LIBRARY_ISSUES_NONE) + const char *soname = srt_library_get_real_soname (l->data); + if (verbose || + srt_library_get_issues (l->data) != SRT_LIBRARY_ISSUES_NONE || + g_strcmp0 (name, soname) != 0) { const char *messages; const char * const *missing_symbols; @@ -406,6 +409,9 @@ print_libraries_details (JsonBuilder *builder, json_builder_add_string_value (builder, messages); } + json_builder_set_member_name (builder, "soname"); + json_builder_add_string_value (builder, soname); + json_builder_set_member_name (builder, "path"); json_builder_add_string_value (builder, srt_library_get_absolute_path (l->data)); diff --git a/bin/system-info.md b/bin/system-info.md index b921f4b18df9d55562ef4d8b21b43f939b2a792e..b71411d93b9ca55ead3cbe8225d69b754b5b70fb 100644 --- a/bin/system-info.md +++ b/bin/system-info.md @@ -376,6 +376,11 @@ keys: **path** : The absolute path to the library. + **soname** + : The real SONAME of the library, which might be different from + the name that was requested if it is a compatibility alias, + or **null** if it could not be determined. + **issues** : Problems with the library, as arrays of the same strings described in **library-issues-summary** above. diff --git a/steam-runtime-tools/library-internal.h b/steam-runtime-tools/library-internal.h index dcd790af9e145e2fd60cd6558d03ca91a3231a4e..218d741e8b393908cd242c97158536dcfa11f3a9 100644 --- a/steam-runtime-tools/library-internal.h +++ b/steam-runtime-tools/library-internal.h @@ -61,6 +61,7 @@ static inline SrtLibrary *_srt_library_new (const char *multiarch_tuple, const char * const *missing_symbols, const char * const *misversioned_symbols, const char * const *dependencies, + const char *real_soname, int exit_status, int terminating_signal); @@ -74,6 +75,7 @@ _srt_library_new (const char *multiarch_tuple, const char * const *missing_symbols, const char * const *misversioned_symbols, const char * const *dependencies, + const char *real_soname, int exit_status, int terminating_signal) { @@ -88,6 +90,7 @@ _srt_library_new (const char *multiarch_tuple, "multiarch-tuple", multiarch_tuple, "misversioned-symbols", misversioned_symbols, "exit-status", exit_status, + "real-soname", real_soname, "requested-name", requested_name, "terminating-signal", terminating_signal, NULL); diff --git a/steam-runtime-tools/library.c b/steam-runtime-tools/library.c index 2c8b404335137ce5f6be13c8794b53af03592801..8a522713e939220c825d19f62da32431218a7e76 100644 --- a/steam-runtime-tools/library.c +++ b/steam-runtime-tools/library.c @@ -59,6 +59,7 @@ struct _SrtLibrary SrtLibraryIssues issues; int exit_status; int terminating_signal; + gchar *real_soname; }; struct _SrtLibraryClass @@ -66,7 +67,6 @@ struct _SrtLibraryClass /*< private >*/ GObjectClass parent_class; }; - enum { PROP_0, PROP_ABSOLUTE_PATH, @@ -76,6 +76,7 @@ enum { PROP_MISSING_SYMBOLS, PROP_MULTIARCH_TUPLE, PROP_SONAME, + PROP_REAL_SONAME, PROP_REQUESTED_NAME, PROP_MISVERSIONED_SYMBOLS, PROP_EXIT_STATUS, @@ -124,6 +125,10 @@ srt_library_get_property (GObject *object, g_value_set_static_string (value, g_quark_to_string (self->multiarch_tuple)); break; + case PROP_REAL_SONAME: + g_value_set_string (value, self->real_soname); + break; + case PROP_REQUESTED_NAME: case PROP_SONAME: /* deprecated alias */ g_value_set_string (value, self->requested_name); @@ -225,6 +230,12 @@ srt_library_set_property (GObject *object, } break; + case PROP_REAL_SONAME: + /* Construct-only */ + g_return_if_fail (self->real_soname == NULL); + self->real_soname = g_value_dup_string (value); + break; + case PROP_MISVERSIONED_SYMBOLS: /* Construct-only */ g_return_if_fail (self->misversioned_symbols == NULL); @@ -257,6 +268,7 @@ srt_library_finalize (GObject *object) g_free (self->absolute_path); g_free (self->messages); g_free (self->requested_name); + g_free (self->real_soname); g_strfreev (self->dependencies); g_strfreev (self->missing_symbols); g_strfreev (self->misversioned_symbols); @@ -327,6 +339,12 @@ srt_library_class_init (SrtLibraryClass *cls) NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS | G_PARAM_DEPRECATED); + properties[PROP_REAL_SONAME] = + g_param_spec_string ("real-soname", "Real SONAME", + "ELF DT_SONAME found when loading the library", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); properties[PROP_MISVERSIONED_SYMBOLS] = g_param_spec_boxed ("misversioned-symbols", "Misversioned symbols", "Symbols that were expected to be in this library, " @@ -408,6 +426,8 @@ srt_library_get_requested_name (SrtLibrary *self) * @self: a library * * Deprecated alias for srt_library_get_requested_name(). + * See also srt_library_get_real_soname(), which might be what you + * thought this did. * * Returns: A string like `libz.so.1`, which is valid as long as @self * is not destroyed. @@ -418,6 +438,24 @@ srt_library_get_soname (SrtLibrary *self) return srt_library_get_requested_name (self); } +/** + * srt_library_get_real_soname: + * @self: a library + * + * Return the ELF `DT_SONAME` found by parsing the loaded library. + * This is often the same as srt_library_get_requested_name(), + * but can differ when compatibility aliases are involved. + * + * Returns: A string like `libz.so.1`, which is valid as long as @self + * is not destroyed, or %NULL if the SONAME could not be determined. + */ +const char * +srt_library_get_real_soname (SrtLibrary *self) +{ + g_return_val_if_fail (SRT_IS_LIBRARY (self), NULL); + return self->real_soname; +} + /** * srt_library_get_multiarch_tuple: * @self: a library @@ -593,6 +631,7 @@ _srt_check_library_presence (const char *helpers_path, gchar *output = NULL; gchar *child_stderr = NULL; gchar *absolute_path = NULL; + gchar *real_soname = NULL; int wait_status = -1; int exit_status = -1; int terminating_signal = 0; @@ -742,6 +781,9 @@ _srt_check_library_presence (const char *helpers_path, absolute_path = g_strdup (json_object_get_string_member (json, "path")); + if (json_object_has_member (json, "SONAME")) + real_soname = g_strdup (json_object_get_string_member (json, "SONAME")); + if (json_object_has_member (json, "missing_symbols")) missing_array = json_object_get_array_member (json, "missing_symbols"); if (missing_array != NULL) @@ -796,6 +838,7 @@ out: (const char **) missing_symbols, (const char **) misversioned_symbols, (const char **) dependencies, + real_soname, exit_status, terminating_signal); @@ -810,6 +853,7 @@ out: g_free (absolute_path); g_free (child_stderr); g_free (output); + g_free (real_soname); g_free (filtered_preload); g_clear_error (&error); return issues; diff --git a/steam-runtime-tools/library.h b/steam-runtime-tools/library.h index db2f33f1fcb8f3b9f32d911f7c88cf55128e7d9a..0c01230e16e7dd6b70fd4b255cc22e969f6e6f3f 100644 --- a/steam-runtime-tools/library.h +++ b/steam-runtime-tools/library.h @@ -102,6 +102,7 @@ SrtLibraryIssues srt_library_get_issues (SrtLibrary *self); const char * const *srt_library_get_missing_symbols (SrtLibrary *self); const char * const *srt_library_get_misversioned_symbols (SrtLibrary *self); const char * const *srt_library_get_dependencies (SrtLibrary *self); +const char *srt_library_get_real_soname (SrtLibrary *self); SrtLibraryIssues srt_check_library_presence (const char *requested_name, const char *multiarch, const char *symbols_path, diff --git a/tests/library.c b/tests/library.c index 4bac09ad8002f77bf29b616eda80b1c2a4c33dbb..64142ee6ab33adc08c9bb9008df31961382c1238 100644 --- a/tests/library.c +++ b/tests/library.c @@ -74,6 +74,7 @@ test_object (Fixture *f, gchar *tuple; gchar *requested_name; gchar *compat_soname; + gchar *real_soname; gchar *absolute_path; GStrv missing_mutable; GStrv misversioned_mutable; @@ -90,6 +91,7 @@ test_object (Fixture *f, NULL, NULL, NULL, + "libz_special.so.1", 0, 0); g_assert_cmpint (srt_library_get_issues (library), ==, @@ -103,6 +105,8 @@ test_object (Fixture *f, g_assert_cmpstr (srt_library_get_soname (library), ==, srt_library_get_requested_name (library)); G_GNUC_END_IGNORE_DEPRECATIONS + g_assert_cmpstr (srt_library_get_real_soname (library), ==, + "libz_special.so.1"); g_assert_cmpstr (srt_library_get_absolute_path (library), ==, "/usr/lib/libz.so.1"); missing = srt_library_get_missing_symbols (library); @@ -118,6 +122,7 @@ test_object (Fixture *f, "messages", &messages, "multiarch-tuple", &tuple, "requested-name", &requested_name, + "real-soname", &real_soname, "absolute-path", &absolute_path, "missing-symbols", &missing_mutable, "misversioned-symbols", &misversioned_mutable, @@ -130,6 +135,7 @@ test_object (Fixture *f, g_assert_cmpstr (tuple, ==, "arm-linux-gnueabihf"); g_assert_cmpstr (requested_name, ==, "libz.so.1"); g_assert_cmpstr (compat_soname, ==, requested_name); + g_assert_cmpstr (real_soname, ==, "libz_special.so.1"); g_assert_cmpstr (absolute_path, ==, "/usr/lib/libz.so.1"); g_assert_nonnull (missing_mutable); g_assert_cmpstr (missing_mutable[0], ==, NULL); @@ -141,6 +147,7 @@ test_object (Fixture *f, g_free (tuple); g_free (requested_name); g_free (compat_soname); + g_free (real_soname); g_free (absolute_path); g_strfreev (missing_mutable); g_strfreev (misversioned_mutable); @@ -156,6 +163,7 @@ test_object (Fixture *f, one_missing, one_misversioned, two_deps, + NULL, 0, 0); g_assert_cmpint (srt_library_get_issues (library) & @@ -168,6 +176,7 @@ test_object (Fixture *f, "s390x-linux-gnu"); g_assert_cmpstr (srt_library_get_requested_name (library), ==, "libjpeg.so.62"); + g_assert_cmpstr (srt_library_get_real_soname (library), ==, NULL); g_assert_cmpstr (srt_library_get_absolute_path (library), ==, "/usr/lib/libjpeg.so.62"); missing = srt_library_get_missing_symbols (library); @@ -187,6 +196,7 @@ test_object (Fixture *f, "messages", &messages, "multiarch-tuple", &tuple, "requested-name", &requested_name, + "real-soname", &real_soname, "absolute-path", &absolute_path, "missing-symbols", &missing_mutable, "misversioned-symbols", &misversioned_mutable, @@ -198,6 +208,7 @@ test_object (Fixture *f, g_assert_cmpstr (messages, ==, "ld.so: libjpeg.so.62: nope\n"); g_assert_cmpstr (tuple, ==, "s390x-linux-gnu"); g_assert_cmpstr (requested_name, ==, "libjpeg.so.62"); + g_assert_cmpstr (real_soname, ==, NULL); g_assert_cmpstr (absolute_path, ==, "/usr/lib/libjpeg.so.62"); g_assert_nonnull (missing_mutable); g_assert_cmpstr (missing_mutable[0], ==, one_missing[0]); @@ -211,6 +222,7 @@ test_object (Fixture *f, g_assert_cmpstr (dependencies_mutable[2], ==, NULL); g_free (messages); g_free (tuple); + g_free (real_soname); g_free (requested_name); g_free (absolute_path); g_strfreev (missing_mutable);