#ifndef RUSTLD_H
#define RUSTLD_H
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
enum {
RUSTLD_OK = 0,
RUSTLD_EINVAL = 1,
RUSTLD_EPANIC = 2,
RUSTLD_EIO = 3
};
typedef struct RustLdJumpInfo {
uintptr_t entry;
uintptr_t stack;
} RustLdJumpInfo;
typedef struct RustLdAuxvItem {
uintptr_t a_type;
uintptr_t a_val;
} RustLdAuxvItem;
char **rustld_host_environment_pointer(void);
int32_t rustld_elfloader_prepare_from_bytes(
const uint8_t *elf_bytes,
size_t elf_len,
size_t argc,
const char *const *argv,
const char *const *envp,
const RustLdAuxvItem *auxv,
size_t auxv_len,
int32_t verbose,
int32_t indirect_syscalls,
RustLdJumpInfo *out_jump
);
int32_t rustld_elfloader_execute_from_bytes(
const uint8_t *elf_bytes,
size_t elf_len,
size_t argc,
const char *const *argv,
const char *const *envp,
const RustLdAuxvItem *auxv,
size_t auxv_len,
int32_t verbose,
int32_t indirect_syscalls
);
int32_t rustld_elfloader_execute_from_bytes_with_entry(
const uint8_t *elf_bytes,
size_t elf_len,
size_t argc,
const char *const *argv,
const char *entry_symbol,
uintptr_t entry_address,
int32_t entry_address_is_set,
const char *const *envp,
const RustLdAuxvItem *auxv,
size_t auxv_len,
int32_t verbose,
int32_t indirect_syscalls
);
#ifdef __cplusplus
}
#endif
#endif