// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. #ifndef RUNTIME_BIN_MACHO_LOADER_H_ #define RUNTIME_BIN_MACHO_LOADER_H_ #include "../include/dart_api.h" typedef struct { } Dart_LoadedMachODylib; /// Load an Mach-O dynamic library object from a file. /// /// On success, return a handle to the library which may be used to close it /// in Dart_UnloadMachODylib. On error, returns 'nullptr' and sets 'error'. The /// error string should not be 'free'-d. /// /// `file_offset` may be non-zero to read an snapshot embedded inside another /// type of file. /// /// Look up the Dart snapshot symbols "_kVmSnapshotData", /// "_kVmSnapshotInstructions", "_kVmIsolateData" and "_kVmIsolateInstructions" /// into the respectively named out-parameters. /// /// Dart_LoadMachODylib_Fd takes ownership of the file descriptor. /// Dart_LoadMachODylib_Memory does not take ownership of the memory, but /// borrows it for the duration of the call. The memory can be release as soon // as Dart_LoadAOTSnapshot_Memory returns. #if defined(__Fuchsia__) || defined(__linux__) || defined(__FreeBSD__) DART_EXPORT Dart_LoadedMachODylib* Dart_LoadMachODylib_Fd2( int fd, uint64_t file_offset, const char** error, const uint8_t** snapshot_data, const uint8_t** snapshot_text); inline Dart_LoadedMachODylib* Dart_LoadMachODylib_Fd( int fd, uint64_t file_offset, const char** error, const uint8_t** vm_data, const uint8_t** vm_text, const uint8_t** snapshot_data, const uint8_t** snapshot_text) { *vm_data = nullptr; *vm_text = nullptr; return Dart_LoadMachODylib_Fd2(fd, file_offset, error, snapshot_data, snapshot_text); } #endif /// Please see documentation for Dart_LoadMachODylib_Fd. DART_EXPORT Dart_LoadedMachODylib* Dart_LoadMachODylib2( const char* filename, uint64_t file_offset, const char** error, const uint8_t** snapshot_data, const uint8_t** snapshot_text); inline Dart_LoadedMachODylib* Dart_LoadMachODylib( const char* filename, uint64_t file_offset, const char** error, const uint8_t** vm_data, const uint8_t** vm_text, const uint8_t** snapshot_data, const uint8_t** snapshot_text) { *vm_data = nullptr; *vm_text = nullptr; return Dart_LoadMachODylib2(filename, file_offset, error, snapshot_data, snapshot_text); } /// Please see documentation for Dart_LoadMachODylib_Fd. DART_EXPORT Dart_LoadedMachODylib* Dart_LoadMachODylib_Memory2( const uint8_t* snapshot, uint64_t snapshot_size, const char** error, const uint8_t** snapshot_data, const uint8_t** snapshot_text); inline Dart_LoadedMachODylib* Dart_LoadMachODylib_Memory( const uint8_t* snapshot, uint64_t snapshot_size, const char** error, const uint8_t** vm_data, const uint8_t** vm_text, const uint8_t** snapshot_data, const uint8_t** snapshot_text) { *vm_data = nullptr; *vm_text = nullptr; return Dart_LoadMachODylib_Memory2(snapshot, snapshot_size, error, snapshot_data, snapshot_text); } /// Unloads an MachO dynamic library object loaded through /// Dart_LoadMachODylib{_Fd, _Memory}. /// /// Unlike dlclose(), this does not use reference counting. /// Dart_LoadMachODylib{_Fd, _Memory} will return load the target library /// separately each time it is called, and the results must be unloaded /// separately. DART_EXPORT void Dart_UnloadMachODylib(Dart_LoadedMachODylib* loaded); #endif // RUNTIME_BIN_MACHO_LOADER_H_