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);