diff options
Diffstat (limited to 'src/libelf/elf32_newphdr.c')
-rw-r--r-- | src/libelf/elf32_newphdr.c | 182 |
1 files changed, 0 insertions, 182 deletions
diff --git a/src/libelf/elf32_newphdr.c b/src/libelf/elf32_newphdr.c deleted file mode 100644 index 01038e73..00000000 --- a/src/libelf/elf32_newphdr.c +++ /dev/null @@ -1,182 +0,0 @@ -/* Create new ELF program header table. - Copyright (C) 1999-2010, 2014 Red Hat, Inc. - This file is part of elfutils. - Written by Ulrich Drepper <drepper@redhat.com>, 1998. - - This file is free software; you can redistribute it and/or modify - it under the terms of either - - * the GNU Lesser General Public License as published by the Free - Software Foundation; either version 3 of the License, or (at - your option) any later version - - or - - * the GNU General Public License as published by the Free - Software Foundation; either version 2 of the License, or (at - your option) any later version - - or both in parallel, as here. - - elfutils is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received copies of the GNU General Public License and - the GNU Lesser General Public License along with this program. If - not, see <http://www.gnu.org/licenses/>. */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include <assert.h> -#include <stdlib.h> -#include <string.h> - -#include "libelfP.h" - -#ifndef LIBELFBITS -# define LIBELFBITS 32 -#endif - - -ElfW2(LIBELFBITS,Phdr) * -elfw2(LIBELFBITS,newphdr) (elf, count) - Elf *elf; - size_t count; -{ - ElfW2(LIBELFBITS,Phdr) *result; - - if (elf == NULL) - return NULL; - - if (unlikely (elf->kind != ELF_K_ELF)) - { - __libelf_seterrno (ELF_E_INVALID_HANDLE); - return NULL; - } - - if (unlikely ((ElfW2(LIBELFBITS,Word)) count != count)) - { - __libelf_seterrno (ELF_E_INVALID_OPERAND); - return NULL; - } - - rwlock_wrlock (elf->lock); - - if (elf->class == 0) - elf->class = ELFW(ELFCLASS,LIBELFBITS); - else if (unlikely (elf->class != ELFW(ELFCLASS,LIBELFBITS))) - { - __libelf_seterrno (ELF_E_INVALID_CLASS); - result = NULL; - goto out; - } - - if (unlikely (elf->state.ELFW(elf,LIBELFBITS).ehdr == NULL)) - { - __libelf_seterrno (ELF_E_WRONG_ORDER_EHDR); - result = NULL; - goto out; - } - - /* A COUNT of zero means remove existing table. */ - if (count == 0) - { - /* Free the old program header. */ - if (elf->state.ELFW(elf,LIBELFBITS).phdr != NULL) - { - if (elf->state.ELFW(elf,LIBELFBITS).phdr_flags & ELF_F_MALLOCED) - free (elf->state.ELFW(elf,LIBELFBITS).phdr); - - /* Set the pointer to NULL. */ - elf->state.ELFW(elf,LIBELFBITS).phdr = NULL; - /* Set the `e_phnum' member to the new value. */ - elf->state.ELFW(elf,LIBELFBITS).ehdr->e_phnum = 0; - /* Also clear any old PN_XNUM extended value. */ - if (elf->state.ELFW(elf,LIBELFBITS).scns.cnt > 0) - elf->state.ELFW(elf,LIBELFBITS).scns.data[0] - .shdr.ELFW(e,LIBELFBITS)->sh_info = 0; - /* Also set the size. */ - elf->state.ELFW(elf,LIBELFBITS).ehdr->e_phentsize = - sizeof (ElfW2(LIBELFBITS,Phdr)); - - elf->state.ELFW(elf,LIBELFBITS).phdr_flags |= ELF_F_DIRTY; - elf->flags |= ELF_F_DIRTY; - __libelf_seterrno (ELF_E_NOERROR); - } - - result = NULL; - } - else if (elf->state.ELFW(elf,LIBELFBITS).ehdr->e_phnum != count - || count == PN_XNUM - || elf->state.ELFW(elf,LIBELFBITS).phdr == NULL) - { - if (unlikely (count > SIZE_MAX / sizeof (ElfW2(LIBELFBITS,Phdr)))) - { - result = NULL; - goto out; - } - - /* Allocate a new program header with the appropriate number of - elements. */ - result = (ElfW2(LIBELFBITS,Phdr) *) - realloc (elf->state.ELFW(elf,LIBELFBITS).phdr, - count * sizeof (ElfW2(LIBELFBITS,Phdr))); - if (result == NULL) - __libelf_seterrno (ELF_E_NOMEM); - else - { - /* Now set the result. */ - elf->state.ELFW(elf,LIBELFBITS).phdr = result; - if (count >= PN_XNUM) - { - /* We have to write COUNT into the zeroth section's sh_info. */ - Elf_Scn *scn0 = &elf->state.ELFW(elf,LIBELFBITS).scns.data[0]; - if (elf->state.ELFW(elf,LIBELFBITS).scns.cnt == 0) - { - assert (elf->state.ELFW(elf,LIBELFBITS).scns.max > 0); - elf->state.ELFW(elf,LIBELFBITS).scns.cnt = 1; - } - scn0->shdr.ELFW(e,LIBELFBITS)->sh_info = count; - scn0->shdr_flags |= ELF_F_DIRTY; - elf->state.ELFW(elf,LIBELFBITS).ehdr->e_phnum = PN_XNUM; - } - else - /* Set the `e_phnum' member to the new value. */ - elf->state.ELFW(elf,LIBELFBITS).ehdr->e_phnum = count; - /* Clear the whole memory. */ - memset (result, '\0', count * sizeof (ElfW2(LIBELFBITS,Phdr))); - /* Also set the size. */ - elf->state.ELFW(elf,LIBELFBITS).ehdr->e_phentsize = - elf_typesize (LIBELFBITS, ELF_T_PHDR, 1); - /* Remember we allocated the array and mark the structure is - modified. */ - elf->state.ELFW(elf,LIBELFBITS).phdr_flags |= - ELF_F_DIRTY | ELF_F_MALLOCED; - /* We have to rewrite the entire file if the size of the - program header is changed. */ - elf->flags |= ELF_F_DIRTY; - } - } - else - { - /* We have the same number of entries. Just clear the array. */ - assert (elf->state.ELFW(elf,LIBELFBITS).ehdr->e_phentsize - == elf_typesize (LIBELFBITS, ELF_T_PHDR, 1)); - - /* Mark the structure as modified. */ - elf->state.ELFW(elf,LIBELFBITS).phdr_flags |= ELF_F_DIRTY; - - result = elf->state.ELFW(elf,LIBELFBITS).phdr; - memset (result, '\0', count * sizeof (ElfW2(LIBELFBITS,Phdr))); - } - - out: - rwlock_unlock (elf->lock); - - return result; -} -INTDEF(elfw2(LIBELFBITS,newphdr)) |