Deleted Added
full compact
ef.c (100272) ef.c (109607)
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 *
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 $
32 * $FreeBSD: head/usr.sbin/kldxref/ef.c 109607 2003-01-21 03:51:53Z jake $
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;
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 Elf_Off rel_off;
155 Elf_Off rela_off;
156 int rel_sz;
157 int rela_sz;
158 int rel_entry;
159 int rela_entry;
154
160
161 rel_off = rela_off = 0;
162 rel_sz = rela_sz = 0;
163 rel_entry = rela_entry = 0;
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;
164 for (dp = ef->ef_dyn; dp->d_tag != DT_NULL; dp++) {
165 switch (dp->d_tag) {
166 case DT_HASH:
167 error = ef_read(ef, ef_get_offset(ef, dp->d_un.d_ptr),
168 sizeof(hashhdr), hashhdr);
169 if (error) {
170 warnx("can't read hash header (%lx)",
171 ef_get_offset(ef, dp->d_un.d_ptr));

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

191 break;
192 case DT_SYMTAB:
193 ef->ef_symoff = dp->d_un.d_ptr;
194 break;
195 case DT_SYMENT:
196 if (dp->d_un.d_val != sizeof(Elf_Sym))
197 return EFTYPE;
198 break;
199 case DT_REL:
200 if (rel_off != 0)
201 warnx("second DT_REL entry ignored");
202 rel_off = dp->d_un.d_ptr;
203 break;
204 case DT_RELSZ:
205 if (rel_sz != 0)
206 warnx("second DT_RELSZ entry ignored");
207 rel_sz = dp->d_un.d_val;
208 break;
209 case DT_RELENT:
210 if (rel_entry != 0)
211 warnx("second DT_RELENT entry ignored");
212 rel_entry = dp->d_un.d_val;
213 break;
214 case DT_RELA:
215 if (rela_off != 0)
216 warnx("second DT_RELA entry ignored");
217 rela_off = dp->d_un.d_ptr;
218 break;
219 case DT_RELASZ:
220 if (rela_sz != 0)
221 warnx("second DT_RELASZ entry ignored");
222 rela_sz = dp->d_un.d_val;
223 break;
224 case DT_RELAENT:
225 if (rela_entry != 0)
226 warnx("second DT_RELAENT entry ignored");
227 rela_entry = dp->d_un.d_val;
228 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 }
229 }
230 }
231 if (ef->ef_symoff == 0) {
232 warnx("%s: no .dynsym section found\n", ef->ef_name);
233 return EFTYPE;
234 }
235 if (ef->ef_stroff == 0) {
236 warnx("%s: no .dynstr section found\n", ef->ef_name);

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

244 ef->ef_name, (long)ef->ef_symoff);
245 return EIO;
246 }
247 if (ef_read_entry(ef, ef_get_offset(ef, ef->ef_stroff), ef->ef_strsz,
248 (void**)&ef->ef_strtab) != 0) {
249 warnx("can't load .dynstr section");
250 return EIO;
251 }
252 if (rel_off != 0) {
253 if (rel_entry == 0) {
254 warnx("%s: no DT_RELENT for DT_REL", ef->ef_name);
255 return (EFTYPE);
256 }
257 if (rel_entry != sizeof(Elf_Rel)) {
258 warnx("%s: inconsistent DT_RELENT value",
259 ef->ef_name);
260 return (EFTYPE);
261 }
262 if (rel_sz % rel_entry != 0) {
263 warnx("%s: inconsistent values for DT_RELSZ and "
264 "DT_RELENT", ef->ef_name);
265 return (EFTYPE);
266 }
267 if (ef_read_entry(ef, ef_get_offset(ef, rel_off), rel_sz,
268 (void **)&ef->ef_rel) != 0) {
269 warnx("%s: cannot load DT_REL section", ef->ef_name);
270 return (EIO);
271 }
272 ef->ef_relsz = rel_sz / rel_entry;
273 if (ef->ef_verbose)
274 warnx("%s: %d REL entries", ef->ef_name,
275 ef->ef_relsz);
276 }
277 if (rela_off != 0) {
278 if (rela_entry == 0) {
279 warnx("%s: no DT_RELAENT for DT_RELA", ef->ef_name);
280 return (EFTYPE);
281 }
282 if (rela_entry != sizeof(Elf_Rela)) {
283 warnx("%s: inconsistent DT_RELAENT value",
284 ef->ef_name);
285 return (EFTYPE);
286 }
287 if (rela_sz % rela_entry != 0) {
288 warnx("%s: inconsistent values for DT_RELASZ and "
289 "DT_RELAENT", ef->ef_name);
290 return (EFTYPE);
291 }
292 if (ef_read_entry(ef, ef_get_offset(ef, rela_off), rela_sz,
293 (void **)&ef->ef_rela) != 0) {
294 warnx("%s: cannot load DT_RELA section", ef->ef_name);
295 return (EIO);
296 }
297 ef->ef_relasz = rela_sz / rela_entry;
298 if (ef->ef_verbose)
299 warnx("%s: %d RELA entries", ef->ef_name,
300 ef->ef_relasz);
301 }
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
302 return 0;
303}
304
305int
306ef_read(elf_file_t ef, Elf_Off offset, size_t len, void*dest)
307{
308 ssize_t r;
309

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

343 warnx("ef_seg_read(%s): zero offset (%lx:%ld)",
344 ef->ef_name, (long)offset, ofs);
345 return EFAULT;
346 }
347 return ef_read(ef, ofs, len, dest);
348}
349
350int
351ef_seg_read_rel(elf_file_t ef, Elf_Off offset, size_t len, void*dest)
352{
353 u_long ofs = ef_get_offset(ef, offset);
354 int error;
355
356 if (ofs == 0) {
357 if (ef->ef_verbose)
358 warnx("ef_seg_read(%s): zero offset (%lx:%ld)",
359 ef->ef_name, (long)offset, ofs);
360 return EFAULT;
361 }
362 if ((error = ef_read(ef, ofs, len, dest)) != 0)
363 return (error);
364 return (ef_reloc(ef, offset, len, dest));
365}
366
367int
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
368ef_seg_read_entry(elf_file_t ef, Elf_Off offset, size_t len, void**ptr)
369{
370 int error;
371
372 *ptr = malloc(len);
373 if (*ptr == NULL)
374 return ENOMEM;
375 error = ef_seg_read(ef, offset, len, *ptr);
376 if (error)
377 free(*ptr);
378 return error;
379}
380
381int
382ef_seg_read_entry_rel(elf_file_t ef, Elf_Off offset, size_t len, void**ptr)
383{
384 int error;
385
386 *ptr = malloc(len);
387 if (*ptr == NULL)
388 return ENOMEM;
389 error = ef_seg_read_rel(ef, offset, len, *ptr);
390 if (error)
391 free(*ptr);
392 return error;
393}
394
395int
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 ---
396ef_open(const char *filename, elf_file_t ef, int verbose)
397{
398 Elf_Ehdr *hdr;
399 int fd;
400 int error;
401 int phlen, res;
402 int nsegs;
403 Elf_Phdr *phdr, *phdyn, *phphdr, *phlimit;

--- 102 unchanged lines hidden ---