blob: 5aea7b1a41145e4514de0579d2d10fbace7aebd6 [file] [log] [blame] [edit]
/*
* Copyright (c) 1999-2004 University of New South Wales
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <elf/elf.h>
#include <elf/elf32.h>
#include <inttypes.h>
#include <string.h>
/* ELF header functions */
int elf32_checkFile(elf_t *elf)
{
if (elf->elfSize < sizeof(Elf32_Ehdr)) {
return -1; /* file smaller than ELF header */
}
if (elf_check_magic(elf->elfFile) < 0) {
return -1; /* not an ELF file */
}
Elf32_Ehdr const *header = elf->elfFile;
if (header->e_ident[EI_CLASS] != ELFCLASS32) {
return -1; /* not a 32-bit ELF */
}
if (header->e_phentsize != sizeof(Elf32_Phdr)) {
return -1; /* unexpected program header size */
}
if (header->e_shentsize != sizeof(Elf32_Shdr)) {
return -1; /* unexpected section header size */
}
if (header->e_shstrndx >= header->e_shnum) {
return -1; /* invalid section header string table section */
}
elf->elfClass = header->e_ident[EI_CLASS];
return 0; /* elf header looks OK */
}
int elf32_checkProgramHeaderTable(const elf_t *elf)
{
const Elf32_Ehdr *header = elf->elfFile;
size_t ph_end = header->e_phoff + header->e_phentsize * header->e_phnum;
if (elf->elfSize < ph_end || ph_end < header->e_phoff) {
return -1; /* invalid program header table */
}
return 0;
}
int elf32_checkSectionTable(const elf_t *elf)
{
const Elf32_Ehdr *header = elf->elfFile;
size_t sh_end = header->e_shoff + header->e_shentsize * header->e_shnum;
if (elf->elfSize < sh_end || sh_end < header->e_shoff) {
return -1; /* invalid section header table */
}
return 0;
}