Deleted Added
sdiff udiff text old ( 100272 ) new ( 109607 )
full compact
1/*
2 * Copyright (c) 2000, Boris Popov
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

--- 15 unchanged lines hidden (view full) ---

24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 *
32 * $FreeBSD: head/usr.sbin/kldxref/ef.c 100272 2002-07-17 23:41:58Z peter $
33 */
34
35#include <sys/param.h>
36#include <sys/linker.h>
37#include <string.h>
38#include <stdio.h>
39#include <stdlib.h>
40#include <unistd.h>

--- 105 unchanged lines hidden (view full) ---

146
147int
148ef_parse_dynamic(elf_file_t ef)
149{
150 Elf_Dyn *dp;
151 Elf_Hashelt hashhdr[2];
152/* int plttype = DT_REL;*/
153 int error;
154
155 for (dp = ef->ef_dyn; dp->d_tag != DT_NULL; dp++) {
156 switch (dp->d_tag) {
157 case DT_HASH:
158 error = ef_read(ef, ef_get_offset(ef, dp->d_un.d_ptr),
159 sizeof(hashhdr), hashhdr);
160 if (error) {
161 warnx("can't read hash header (%lx)",
162 ef_get_offset(ef, dp->d_un.d_ptr));

--- 19 unchanged lines hidden (view full) ---

182 break;
183 case DT_SYMTAB:
184 ef->ef_symoff = dp->d_un.d_ptr;
185 break;
186 case DT_SYMENT:
187 if (dp->d_un.d_val != sizeof(Elf_Sym))
188 return EFTYPE;
189 break;
190 }
191 }
192 if (ef->ef_symoff == 0) {
193 warnx("%s: no .dynsym section found\n", ef->ef_name);
194 return EFTYPE;
195 }
196 if (ef->ef_stroff == 0) {
197 warnx("%s: no .dynstr section found\n", ef->ef_name);

--- 7 unchanged lines hidden (view full) ---

205 ef->ef_name, (long)ef->ef_symoff);
206 return EIO;
207 }
208 if (ef_read_entry(ef, ef_get_offset(ef, ef->ef_stroff), ef->ef_strsz,
209 (void**)&ef->ef_strtab) != 0) {
210 warnx("can't load .dynstr section");
211 return EIO;
212 }
213 return 0;
214}
215
216int
217ef_read(elf_file_t ef, Elf_Off offset, size_t len, void*dest)
218{
219 ssize_t r;
220

--- 33 unchanged lines hidden (view full) ---

254 warnx("ef_seg_read(%s): zero offset (%lx:%ld)",
255 ef->ef_name, (long)offset, ofs);
256 return EFAULT;
257 }
258 return ef_read(ef, ofs, len, dest);
259}
260
261int
262ef_seg_read_entry(elf_file_t ef, Elf_Off offset, size_t len, void**ptr)
263{
264 int error;
265
266 *ptr = malloc(len);
267 if (*ptr == NULL)
268 return ENOMEM;
269 error = ef_seg_read(ef, offset, len, *ptr);
270 if (error)
271 free(*ptr);
272 return error;
273}
274
275int
276ef_open(const char *filename, elf_file_t ef, int verbose)
277{
278 Elf_Ehdr *hdr;
279 int fd;
280 int error;
281 int phlen, res;
282 int nsegs;
283 Elf_Phdr *phdr, *phdyn, *phphdr, *phlimit;

--- 102 unchanged lines hidden ---