| // Copyright 2016 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #pragma once |
| |
| #include <zircon/types.h> |
| #include <stddef.h> |
| |
| typedef struct elf_load_info elf_load_info_t; |
| |
| // Validate the ELF headers and set up for further use. |
| // The pointer returned must be passed to elf_load_destroy when finished. |
| zx_status_t elf_load_start(zx_handle_t vmo, const void* buf, size_t buf_sz, |
| elf_load_info_t** infop); |
| |
| // Clean up and free the data structure created by elf_load_start. |
| void elf_load_destroy(elf_load_info_t* info); |
| |
| // Check if the ELF file has a PT_INTERP header. On success, *interp |
| // is NULL if it had none or a malloc'd string of the contents; |
| // *interp_len is strlen(*interp). |
| zx_status_t elf_load_get_interp(elf_load_info_t* info, zx_handle_t vmo, char** interp, |
| size_t* interp_len); |
| |
| // Check if the ELF file has a PT_GNU_STACK header, and return its p_memsz. |
| // Returns zero if no header was found. |
| size_t elf_load_get_stack_size(elf_load_info_t* info); |
| |
| // Load the file's segments into the process. |
| // If this fails, the state of the process address space is unspecified. |
| // Regardless of success/failure this does not consume |vmo|. |
| zx_status_t elf_load_finish(zx_handle_t vmar, elf_load_info_t* info, zx_handle_t vmo, |
| zx_handle_t* segments_vmar, zx_vaddr_t* base, zx_vaddr_t* entry); |