blob: 9bc6664ca3f48c09fa6202140b0058e5a1e9ef1e [file] [log] [blame]
/* @LICENSE(UNSW_OZPLB) */
/*
* Australian Public Licence B (OZPLB)
*
* Version 1-0
*
* Copyright (c) 2004 University of New South Wales
*
* All rights reserved.
*
* Developed by: Operating Systems and Distributed Systems Group (DiSy)
* University of New South Wales
* http://www.disy.cse.unsw.edu.au
*
* Permission is granted by University of New South Wales, free of charge, to
* any person obtaining a copy of this software and any associated
* documentation files (the "Software") to deal with the Software without
* restriction, including (without limitation) the rights to use, copy,
* modify, adapt, merge, publish, distribute, communicate to the public,
* sublicense, and/or sell, lend or rent out copies of the Software, and
* to permit persons to whom the Software is furnished to do so, subject
* to the following conditions:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimers.
*
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimers in the documentation and/or other materials provided
* with the distribution.
*
* * Neither the name of University of New South Wales, nor the names of its
* contributors, may be used to endorse or promote products derived
* from this Software without specific prior written permission.
*
* EXCEPT AS EXPRESSLY STATED IN THIS LICENCE AND TO THE FULL EXTENT
* PERMITTED BY APPLICABLE LAW, THE SOFTWARE IS PROVIDED "AS-IS", AND
* NATIONAL ICT AUSTRALIA AND ITS CONTRIBUTORS MAKE NO REPRESENTATIONS,
* WARRANTIES OR CONDITIONS OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
* BUT NOT LIMITED TO ANY REPRESENTATIONS, WARRANTIES OR CONDITIONS
* REGARDING THE CONTENTS OR ACCURACY OF THE SOFTWARE, OR OF TITLE,
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT,
* THE ABSENCE OF LATENT OR OTHER DEFECTS, OR THE PRESENCE OR ABSENCE OF
* ERRORS, WHETHER OR NOT DISCOVERABLE.
*
* TO THE FULL EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL
* NATIONAL ICT AUSTRALIA OR ITS CONTRIBUTORS BE LIABLE ON ANY LEGAL
* THEORY (INCLUDING, WITHOUT LIMITATION, IN AN ACTION OF CONTRACT,
* NEGLIGENCE OR OTHERWISE) FOR ANY CLAIM, LOSS, DAMAGES OR OTHER
* LIABILITY, INCLUDING (WITHOUT LIMITATION) LOSS OF PRODUCTION OR
* OPERATION TIME, LOSS, DAMAGE OR CORRUPTION OF DATA OR RECORDS; OR LOSS
* OF ANTICIPATED SAVINGS, OPPORTUNITY, REVENUE, PROFIT OR GOODWILL, OR
* OTHER ECONOMIC LOSS; OR ANY SPECIAL, INCIDENTAL, INDIRECT,
* CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES, ARISING OUT OF OR IN
* CONNECTION WITH THIS LICENCE, THE SOFTWARE OR THE USE OF OR OTHER
* DEALINGS WITH THE SOFTWARE, EVEN IF NATIONAL ICT AUSTRALIA OR ITS
* CONTRIBUTORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH CLAIM, LOSS,
* DAMAGES OR OTHER LIABILITY.
*
* If applicable legislation implies representations, warranties, or
* conditions, or imposes obligations or liability on University of New South
* Wales or one of its contributors in respect of the Software that
* cannot be wholly or partly excluded, restricted or modified, the
* liability of University of New South Wales or the contributor is limited, to
* the full extent permitted by the applicable legislation, at its
* option, to:
* a. in the case of goods, any one or more of the following:
* i. the replacement of the goods or the supply of equivalent goods;
* ii. the repair of the goods;
* iii. the payment of the cost of replacing the goods or of acquiring
* equivalent goods;
* iv. the payment of the cost of having the goods repaired; or
* b. in the case of services:
* i. the supplying of the services again; or
* ii. the payment of the cost of having the services supplied again.
*
* The construction, validity and performance of this licence is governed
* by the laws in force in New South Wales, Australia.
*/
#pragma once
#include <stdint.h>
#include <elf/elf.h>
/* ELF header functions */
int elf32_checkFile(elf_t *elf);
int elf32_checkProgramHeaderTable(elf_t *elf);
int elf32_checkSectionTable(elf_t *elf);
static inline bool elf_isElf32(elf_t *elf)
{
return elf->elfClass == ELFCLASS32;
}
static inline Elf32_Ehdr elf32_getHeader(elf_t *elf)
{
return *(Elf32_Ehdr *) elf->elfFile;
}
static inline uintptr_t elf32_getEntryPoint(elf_t *elf)
{
return elf32_getHeader(elf).e_entry;
}
static inline Elf32_Phdr *elf32_getProgramHeaderTable(elf_t *file)
{
return file->elfFile + elf32_getHeader(file).e_phoff;
}
static inline Elf32_Shdr *elf32_getSectionTable(elf_t *elf)
{
return elf->elfFile + elf32_getHeader(elf).e_shoff;
}
static inline size_t elf32_getNumProgramHeaders(elf_t *elf)
{
return elf32_getHeader(elf).e_phnum;
}
static inline size_t elf32_getNumSections(elf_t *elf)
{
return elf32_getHeader(elf).e_shnum;
}
static inline size_t elf32_getSectionStringTableIndex(elf_t *elf)
{
return elf32_getHeader(elf).e_shstrndx;
}
/* Section header functions */
static inline size_t elf32_getSectionNameOffset(elf_t *elf, size_t s)
{
return elf32_getSectionTable(elf)[s].sh_name;
}
static inline uint32_t elf32_getSectionType(elf_t *elf, size_t i)
{
return elf32_getSectionTable(elf)[i].sh_type;
}
static inline size_t elf32_getSectionFlags(elf_t *elf, size_t i)
{
return elf32_getSectionTable(elf)[i].sh_flags;
}
static inline uintptr_t elf32_getSectionAddr(elf_t *elf, size_t i)
{
return elf32_getSectionTable(elf)[i].sh_addr;
}
static inline size_t elf32_getSectionOffset(elf_t *elf, size_t i)
{
return elf32_getSectionTable(elf)[i].sh_offset;
}
static inline size_t elf32_getSectionSize(elf_t *elf, size_t i)
{
return elf32_getSectionTable(elf)[i].sh_size;
}
static inline uint32_t elf32_getSectionLink(elf_t *elf, size_t i)
{
return elf32_getSectionTable(elf)[i].sh_link;
}
static inline uint32_t elf32_getSectionInfo(elf_t *elf, size_t i)
{
return elf32_getSectionTable(elf)[i].sh_info;
}
static inline size_t elf32_getSectionAddrAlign(elf_t *elf, size_t i)
{
return elf32_getSectionTable(elf)[i].sh_addralign;
}
static inline size_t elf32_getSectionEntrySize(elf_t *elf, size_t i)
{
return elf32_getSectionTable(elf)[i].sh_entsize;
}
/* Program header functions */
static inline uint32_t elf32_getProgramHeaderType(elf_t *file, size_t ph)
{
return elf32_getProgramHeaderTable(file)[ph].p_type;
}
static inline size_t elf32_getProgramHeaderOffset(elf_t *file, size_t ph)
{
return elf32_getProgramHeaderTable(file)[ph].p_offset;
}
static inline uintptr_t elf32_getProgramHeaderVaddr(elf_t *file, size_t ph)
{
return elf32_getProgramHeaderTable(file)[ph].p_vaddr;
}
static inline uintptr_t elf32_getProgramHeaderPaddr(elf_t *file, size_t ph)
{
return elf32_getProgramHeaderTable(file)[ph].p_paddr;
}
static inline size_t elf32_getProgramHeaderFileSize(elf_t *file, size_t ph)
{
return elf32_getProgramHeaderTable(file)[ph].p_filesz;
}
static inline size_t elf32_getProgramHeaderMemorySize(elf_t *file, size_t ph)
{
return elf32_getProgramHeaderTable(file)[ph].p_memsz;
}
static inline uint32_t elf32_getProgramHeaderFlags(elf_t *file, size_t ph)
{
return elf32_getProgramHeaderTable(file)[ph].p_flags;
}
static inline size_t elf32_getProgramHeaderAlign(elf_t *file, size_t ph)
{
return elf32_getProgramHeaderTable(file)[ph].p_align;
}