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.