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 --- |