// 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.

// This is a minimal interface for the logic of loading ELF files.  It
// is specifically designed to work entirely without memory allocation
// or long-lived data variables.  Callers are responsible for all memory
// allocation.  This code itself is position-independent code that does
// not need any writable memory anywhere but the stack.

#pragma once

#include <elf.h>
#include <zircon/types.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#ifdef _LP64
#define MY_ELFCLASS ELFCLASS64
typedef Elf64_Ehdr elf_ehdr_t;
typedef Elf64_Phdr elf_phdr_t;
#else
#define MY_ELFCLASS ELFCLASS32
typedef Elf32_Ehdr elf_ehdr_t;
typedef Elf32_Phdr elf_phdr_t;
#endif

typedef struct {
  zx_vaddr_t e_entry;
  uint_fast16_t e_phnum;
} elf_load_header_t;

// These routines use this error code to indicate an invalid file format,
// including wrong machine, wrong endian, etc. as well as a truncated file.
#define ERR_ELF_BAD_FORMAT ZX_ERR_NOT_FOUND

__BEGIN_CDECLS

// Validate the ELF headers and fill in basic header information. 'hdr_buf'
// represents bytes already read from the start of the file.
zx_status_t elf_load_prepare(zx_handle_t vmo, const void* hdr_buf, size_t buf_sz,
                             elf_load_header_t* header, uintptr_t* phoff);

// Read the ELF program headers in.
zx_status_t elf_load_read_phdrs(zx_handle_t vmo, elf_phdr_t* phdrs, uintptr_t phoff, size_t phnum);

// Load the image into the process.
zx_status_t elf_load_map_segments(zx_handle_t vmar, const elf_load_header_t* header,
                                  const elf_phdr_t* phdrs, zx_handle_t vmo,
                                  zx_handle_t* segments_vmar, zx_vaddr_t* bias, zx_vaddr_t* entry);

// Locate the PT_INTERP program header and extract its bounds in the file.
// Returns false if there was no PT_INTERP.
bool elf_load_find_interp(const elf_phdr_t* phdrs, size_t phnum, uintptr_t* interp_off,
                          size_t* interp_len);

__END_CDECLS
