From 383cd496ce577d33c30c3ee1d62794a774d4fc8b Mon Sep 17 00:00:00 2001 From: Ryan Macnak Date: Wed, 2 Apr 2025 12:46:55 -0700 Subject: [PATCH] [vm] Use dlopen for loading AOT snapshots on Fuchsia. This will play better with native tooling compared to Dart_LoadELF. Cq-Include-Trybots: luci.dart.try:vm-fuchsia-release-arm64-try,vm-fuchsia-release-x64-try Change-Id: If5265d079200d7be754b82a9775d977aa66c15f9 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/419684 Commit-Queue: Ryan Macnak Reviewed-by: Zijie He --- runtime/platform/utils.cc | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/runtime/platform/utils.cc b/runtime/platform/utils.cc index 67bbe138589..074c5398871 100644 --- a/runtime/platform/utils.cc +++ b/runtime/platform/utils.cc @@ -8,8 +8,15 @@ #include "platform/globals.h" #if defined(DART_HOST_OS_LINUX) || defined(DART_HOST_OS_MACOS) || \ - defined(DART_HOST_OS_ANDROID) || defined(DART_HOST_OS_FUCHSIA) + defined(DART_HOST_OS_ANDROID) #include +#elif defined(DART_HOST_OS_FUCHSIA) +#include +#include +#include +#include +#include +#include #endif namespace dart { @@ -294,6 +301,28 @@ void* Utils::LoadDynamicLibrary(const char* library_path, #if defined(DART_HOST_OS_LINUX) || defined(DART_HOST_OS_MACOS) || \ defined(DART_HOST_OS_ANDROID) || defined(DART_HOST_OS_FUCHSIA) handle = dlopen(library_path, RTLD_LAZY); +#if defined(DART_HOST_OS_FUCHSIA) + if (handle == nullptr) { + // Fuchsia's search path is different. + // https://fuchsia.dev/fuchsia-src/concepts/process/program_loading#zircons_standard_elf_dynamic_linker + fuchsia::io::Flags flags = + fuchsia::io::PERM_READABLE | fuchsia::io::PERM_EXECUTABLE; + int fd = -1; + zx_status_t status = fdio_open3_fd(library_path, uint64_t{flags}, &fd); + if (status != ZX_OK) { + *error = strdup(zx_status_get_string(status)); + return nullptr; + } + zx_handle_t vmo = ZX_HANDLE_INVALID; + status = fdio_get_vmo_exec(fd, &vmo); + close(fd); + if (status != ZX_OK) { + *error = strdup(zx_status_get_string(status)); + return nullptr; + } + handle = dlopen_vmo(vmo, RTLD_LAZY); + } +#endif // defined(DART_HOST_OS_FUCHSIA) #elif defined(DART_HOST_OS_WINDOWS) SetLastError(0); // Clear any errors.