546bf07f7d
TEST=ci Change-Id: I65c315e9efc3cd7b8b47d2c167681986278644da Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/502780 Reviewed-by: Alexander Markov <alexmarkov@google.com> Commit-Queue: Ryan Macnak <rmacnak@google.com>
81 lines
3.9 KiB
C
81 lines
3.9 KiB
C
// Copyright (c) 2019, 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_ELF_LOADER_H_
|
|
#define RUNTIME_BIN_ELF_LOADER_H_
|
|
|
|
#include "../include/dart_api.h"
|
|
|
|
typedef struct {
|
|
} Dart_LoadedElf;
|
|
|
|
/// Load an ELF object from a file.
|
|
///
|
|
/// On success, return a handle to the library which may be used to close it
|
|
/// in Dart_UnloadELF. On error, returns 'nullptr' and sets 'error'. The error
|
|
/// string should not be 'free'-d.
|
|
///
|
|
/// `file_offset` may be non-zero to read an ELF object embedded inside another
|
|
/// type of file.
|
|
///
|
|
/// Look up the Dart snapshot symbols `_kDartSnapshotData` and
|
|
/// `_kDartSnapshotText` into the respectively named out-parameters.
|
|
///
|
|
/// Dart_LoadELF_Fd takes ownership of the file descriptor. Dart_LoadELF_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_LoadELF_Memory returns.
|
|
#if defined(__Fuchsia__) || defined(__linux__) || defined(__FreeBSD__)
|
|
DART_EXPORT Dart_LoadedElf* Dart_LoadELF_Fd(int fd,
|
|
uint64_t file_offset,
|
|
const char** error,
|
|
const uint8_t** snapshot_data,
|
|
const uint8_t** snapshot_text);
|
|
inline Dart_LoadedElf* Dart_LoadELF_Fd2(int fd,
|
|
uint64_t file_offset,
|
|
const char** error,
|
|
const uint8_t** snapshot_data,
|
|
const uint8_t** snapshot_text) {
|
|
return Dart_LoadELF_Fd(fd, file_offset, error, snapshot_data, snapshot_text);
|
|
}
|
|
#endif
|
|
|
|
/// Please see documentation for Dart_LoadElf_Fd.
|
|
DART_EXPORT Dart_LoadedElf* Dart_LoadELF(const char* filename,
|
|
uint64_t file_offset,
|
|
const char** error,
|
|
const uint8_t** snapshot_data,
|
|
const uint8_t** snapshot_text);
|
|
inline Dart_LoadedElf* Dart_LoadELF2(const char* filename,
|
|
uint64_t file_offset,
|
|
const char** error,
|
|
const uint8_t** snapshot_data,
|
|
const uint8_t** snapshot_text) {
|
|
return Dart_LoadELF(filename, file_offset, error, snapshot_data,
|
|
snapshot_text);
|
|
}
|
|
|
|
/// Please see documentation for Dart_LoadElf_Fd.
|
|
DART_EXPORT Dart_LoadedElf* Dart_LoadELF_Memory(const uint8_t* snapshot,
|
|
uint64_t snapshot_size,
|
|
const char** error,
|
|
const uint8_t** snapshot_data,
|
|
const uint8_t** snapshot_text);
|
|
inline Dart_LoadedElf* Dart_LoadELF_Memory2(const uint8_t* snapshot,
|
|
uint64_t snapshot_size,
|
|
const char** error,
|
|
const uint8_t** snapshot_data,
|
|
const uint8_t** snapshot_text) {
|
|
return Dart_LoadELF_Memory(snapshot, snapshot_size, error, snapshot_data,
|
|
snapshot_text);
|
|
}
|
|
|
|
/// Unloads an ELF object loaded through Dart_LoadELF{_Fd, _Memory}.
|
|
///
|
|
/// Unlike dlclose(), this does not use reference counting.
|
|
/// Dart_LoadELF{_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_UnloadELF(Dart_LoadedElf* loaded);
|
|
|
|
#endif // RUNTIME_BIN_ELF_LOADER_H_
|