Skip to content

Commit 383cd49

Browse files
rmacnak-googleCommit Queue
authored andcommitted
[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 <[email protected]> Reviewed-by: Zijie He <[email protected]>
1 parent a946459 commit 383cd49

File tree

1 file changed

+30
-1
lines changed

1 file changed

+30
-1
lines changed

runtime/platform/utils.cc

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,15 @@
88
#include "platform/globals.h"
99

1010
#if defined(DART_HOST_OS_LINUX) || defined(DART_HOST_OS_MACOS) || \
11-
defined(DART_HOST_OS_ANDROID) || defined(DART_HOST_OS_FUCHSIA)
11+
defined(DART_HOST_OS_ANDROID)
12+
#include <dlfcn.h>
13+
#elif defined(DART_HOST_OS_FUCHSIA)
1214
#include <dlfcn.h>
15+
#include <fuchsia/io/cpp/fidl.h>
16+
#include <lib/fdio/directory.h>
17+
#include <lib/fdio/io.h>
18+
#include <zircon/dlfcn.h>
19+
#include <zircon/status.h>
1320
#endif
1421

1522
namespace dart {
@@ -294,6 +301,28 @@ void* Utils::LoadDynamicLibrary(const char* library_path,
294301
#if defined(DART_HOST_OS_LINUX) || defined(DART_HOST_OS_MACOS) || \
295302
defined(DART_HOST_OS_ANDROID) || defined(DART_HOST_OS_FUCHSIA)
296303
handle = dlopen(library_path, RTLD_LAZY);
304+
#if defined(DART_HOST_OS_FUCHSIA)
305+
if (handle == nullptr) {
306+
// Fuchsia's search path is different.
307+
// https://fuchsia.dev/fuchsia-src/concepts/process/program_loading#zircons_standard_elf_dynamic_linker
308+
fuchsia::io::Flags flags =
309+
fuchsia::io::PERM_READABLE | fuchsia::io::PERM_EXECUTABLE;
310+
int fd = -1;
311+
zx_status_t status = fdio_open3_fd(library_path, uint64_t{flags}, &fd);
312+
if (status != ZX_OK) {
313+
*error = strdup(zx_status_get_string(status));
314+
return nullptr;
315+
}
316+
zx_handle_t vmo = ZX_HANDLE_INVALID;
317+
status = fdio_get_vmo_exec(fd, &vmo);
318+
close(fd);
319+
if (status != ZX_OK) {
320+
*error = strdup(zx_status_get_string(status));
321+
return nullptr;
322+
}
323+
handle = dlopen_vmo(vmo, RTLD_LAZY);
324+
}
325+
#endif // defined(DART_HOST_OS_FUCHSIA)
297326
#elif defined(DART_HOST_OS_WINDOWS)
298327
SetLastError(0); // Clear any errors.
299328

0 commit comments

Comments
 (0)