source: rtems-tools/rtemstoolkit/elftoolchain/libelf/gelf_phdr.c @ 0c5db2d

5
Last change on this file since 0c5db2d was 0c5db2d, checked in by Chris Johns <chrisj@…>, on 04/29/18 at 01:55:37

rtemstoolkit: Update elftoolchain to the latest code.

The update is taken from https://github.com/elftoolchain/elftoolchain.

Update #3417

  • Property mode set to 100644
File size: 4.2 KB
Line 
1/*-
2 * Copyright (c) 2006,2008 Joseph Koshy
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
28
29#include <gelf.h>
30#include <libelf.h>
31
32#include "_libelf.h"
33
34LIBELF_VCSID("$Id$");
35
36Elf32_Phdr *
37elf32_getphdr(Elf *e)
38{
39        return (_libelf_getphdr(e, ELFCLASS32));
40}
41
42Elf64_Phdr *
43elf64_getphdr(Elf *e)
44{
45        return (_libelf_getphdr(e, ELFCLASS64));
46}
47
48GElf_Phdr *
49gelf_getphdr(Elf *e, int index, GElf_Phdr *d)
50{
51        int ec;
52        Elf32_Ehdr *eh32;
53        Elf64_Ehdr *eh64;
54        Elf32_Phdr *ep32;
55        Elf64_Phdr *ep64;
56
57        if (d == NULL || e == NULL ||
58            ((ec = e->e_class) != ELFCLASS32 && ec != ELFCLASS64) ||
59            (e->e_kind != ELF_K_ELF) || index < 0) {
60                LIBELF_SET_ERROR(ARGUMENT, 0);
61                return (NULL);
62        }
63
64        if (ec == ELFCLASS32) {
65                if ((eh32 = _libelf_ehdr(e, ELFCLASS32, 0)) == NULL ||
66                    ((ep32 = _libelf_getphdr(e, ELFCLASS32)) == NULL))
67                        return (NULL);
68
69                if (index >= eh32->e_phnum) {
70                        LIBELF_SET_ERROR(ARGUMENT, 0);
71                        return (NULL);
72                }
73
74                ep32 += index;
75
76                d->p_type   = ep32->p_type;
77                d->p_offset = ep32->p_offset;
78                d->p_vaddr  = (Elf64_Addr) ep32->p_vaddr;
79                d->p_paddr  = (Elf64_Addr) ep32->p_paddr;
80                d->p_filesz = (Elf64_Xword) ep32->p_filesz;
81                d->p_memsz  = (Elf64_Xword) ep32->p_memsz;
82                d->p_flags  = ep32->p_flags;
83                d->p_align  = (Elf64_Xword) ep32->p_align;
84
85        } else {
86                if ((eh64 = _libelf_ehdr(e, ELFCLASS64, 0)) == NULL ||
87                    (ep64 = _libelf_getphdr(e, ELFCLASS64)) == NULL)
88                        return (NULL);
89
90                if (index >= eh64->e_phnum) {
91                        LIBELF_SET_ERROR(ARGUMENT, 0);
92                        return (NULL);
93                }
94
95                ep64 += index;
96
97                *d = *ep64;
98        }
99
100        return (d);
101}
102
103Elf32_Phdr *
104elf32_newphdr(Elf *e, size_t count)
105{
106        return (_libelf_newphdr(e, ELFCLASS32, count));
107}
108
109Elf64_Phdr *
110elf64_newphdr(Elf *e, size_t count)
111{
112        return (_libelf_newphdr(e, ELFCLASS64, count));
113}
114
115void *
116gelf_newphdr(Elf *e, size_t count)
117{
118        if (e == NULL) {
119                LIBELF_SET_ERROR(ARGUMENT, 0);
120                return (NULL);
121        }
122        return (_libelf_newphdr(e, e->e_class, count));
123}
124
125int
126gelf_update_phdr(Elf *e, int ndx, GElf_Phdr *s)
127{
128        int ec, phnum;
129        void *ehdr;
130        Elf32_Phdr *ph32;
131        Elf64_Phdr *ph64;
132
133        if (s == NULL || e == NULL || e->e_kind != ELF_K_ELF ||
134            ((ec = e->e_class) != ELFCLASS32 && ec != ELFCLASS64)) {
135                LIBELF_SET_ERROR(ARGUMENT, 0);
136                return (0);
137        }
138
139        if (e->e_cmd == ELF_C_READ) {
140                LIBELF_SET_ERROR(MODE, 0);
141                return (0);
142        }
143
144        if ((ehdr = _libelf_ehdr(e, ec, 0)) == NULL)
145                return (0);
146
147        if (ec == ELFCLASS32)
148                phnum = ((Elf32_Ehdr *) ehdr)->e_phnum;
149        else
150                phnum = ((Elf64_Ehdr *) ehdr)->e_phnum;
151
152        if (ndx < 0 || ndx > phnum) {
153                LIBELF_SET_ERROR(ARGUMENT, 0);
154                return (0);
155        }
156
157        (void) elf_flagphdr(e, ELF_C_SET, ELF_F_DIRTY);
158
159        if (ec == ELFCLASS64) {
160                ph64 = e->e_u.e_elf.e_phdr.e_phdr64 + ndx;
161                *ph64 = *s;
162                return (1);
163        }
164
165        ph32 = e->e_u.e_elf.e_phdr.e_phdr32 + ndx;
166
167        ph32->p_type     =  s->p_type;
168        ph32->p_flags    =  s->p_flags;
169        LIBELF_COPY_U32(ph32, s, p_offset);
170        LIBELF_COPY_U32(ph32, s, p_vaddr);
171        LIBELF_COPY_U32(ph32, s, p_paddr);
172        LIBELF_COPY_U32(ph32, s, p_filesz);
173        LIBELF_COPY_U32(ph32, s, p_memsz);
174        LIBELF_COPY_U32(ph32, s, p_align);
175
176        return (1);
177}
Note: See TracBrowser for help on using the repository browser.