diff --git a/pressure-vessel/adverb.c b/pressure-vessel/adverb.c index ad371a53d5f509bfb1f225aba1864ea53ddd5208..7208a400378f5add667d64d76372f1a48c0afe81 100644 --- a/pressure-vessel/adverb.c +++ b/pressure-vessel/adverb.c @@ -97,6 +97,8 @@ typedef struct { char *name; gsize index_in_preload_variables; + /* An index in pv_multiarch_details, or G_MAXSIZE if unspecified */ + gsize abi_index; } AdverbPreloadModule; static void @@ -256,7 +258,7 @@ opt_ld_something (const char *option, gpointer data, GError **error) { - AdverbPreloadModule module = { NULL, 0 }; + AdverbPreloadModule module = { NULL, 0, G_MAXSIZE }; if (opt_preload_modules == NULL) { @@ -1012,12 +1014,16 @@ main (int argc, AdverbPreloadModule, i); GPtrArray *search_path = preload_search_paths[module->index_in_preload_variables]; const char *preload = module->name; + const char *base; + gsize abi_index = module->abi_index; g_assert (preload != NULL); if (*preload == '\0') continue; + base = glnx_basename (preload); + if (search_path == NULL) { preload_search_paths[module->index_in_preload_variables] @@ -1033,14 +1039,10 @@ main (int argc, continue; } - if (module->index_in_preload_variables == PRELOAD_VARIABLE_INDEX_LD_PRELOAD - && g_str_has_suffix (preload, "/gameoverlayrenderer.so")) + if (abi_index == G_MAXSIZE + && module->index_in_preload_variables == PRELOAD_VARIABLE_INDEX_LD_PRELOAD + && strcmp (base, "gameoverlayrenderer.so") == 0) { - g_autofree gchar *link = NULL; - g_autofree gchar *platform_overlay_path = g_build_filename (lib_temp_dirs->platform_token_path, - "gameoverlayrenderer.so", - NULL); - for (gsize abi = 0; abi < PV_N_SUPPORTED_ARCHITECTURES; abi++) { g_autofree gchar *expected_suffix = g_strdup_printf ("/%s/gameoverlayrenderer.so", @@ -1048,19 +1050,30 @@ main (int argc, if (g_str_has_suffix (preload, expected_suffix)) { - link = g_build_filename (lib_temp_dirs->abi_paths[abi], - "gameoverlayrenderer.so", NULL); + abi_index = abi; break; } } - if (link == NULL) + if (abi_index == G_MAXSIZE) { - g_ptr_array_add (search_path, g_strdup (preload)); - g_debug ("Preloading gameoverlayrenderer.so from an unexpected path \"%s\", " - "just leave it as is without adjusting", preload); - continue; + g_debug ("Preloading %s from an unexpected path \"%s\", " + "just leave it as is without adjusting", + base, preload); } + } + + if (abi_index != G_MAXSIZE) + { + g_autofree gchar *link = NULL; + g_autofree gchar *platform_path = NULL; + + g_debug ("Module %s is for %s", + preload, pv_multiarch_details[abi_index].tuple); + platform_path = g_build_filename (lib_temp_dirs->platform_token_path, + base, NULL); + link = g_build_filename (lib_temp_dirs->abi_paths[abi_index], + base, NULL); if (symlink (preload, link) != 0) { @@ -1072,12 +1085,14 @@ main (int argc, link, preload); goto out; } + g_debug ("created symlink %s -> %s", link, preload); - ptr_array_add_unique (search_path, platform_overlay_path, + ptr_array_add_unique (search_path, platform_path, g_str_equal, generic_strdup); } else { + g_debug ("Module %s is for all architectures", preload); g_ptr_array_add (search_path, g_strdup (preload)); } }