Lines Matching full:elf
50 static inline Elf *
52 Elf_Cmd cmd, Elf *parent) in file_read_ar()
54 Elf *elf; in file_read_ar() local
57 elf = allocate_elf (fildes, map_address, offset, maxsize, cmd, parent, in file_read_ar()
59 if (elf != NULL) in file_read_ar()
63 elf->state.ar.offset = offset + SARMAG; in file_read_ar()
65 elf->state.ar.elf_ar_hdr.ar_rawname = elf->state.ar.raw_name; in file_read_ar()
68 return elf; in file_read_ar()
97 /* Make the ELF header available. */ in get_shnum()
106 /* We already read the ELF header. We have to copy the header in get_shnum()
147 /* Get the number of sections from the ELF header. */ in get_shnum()
207 /* Get the number of sections from the ELF header. */ in get_shnum()
279 /* Create descriptor for ELF file in memory. */
280 static Elf *
282 int64_t offset, size_t maxsize, Elf_Cmd cmd, Elf *parent) in file_read_elf()
297 if the file handle or elf file is invalid. Returns zero if there in file_read_elf()
323 Elf *elf = allocate_elf (fildes, map_address, offset, maxsize, cmd, parent, in file_read_elf() local
325 if (elf == NULL) in file_read_elf()
330 assert (offsetof (struct Elf, state.elf32.scns) in file_read_elf()
331 == offsetof (struct Elf, state.elf64.scns)); in file_read_elf()
332 elf->state.elf32.scns.cnt = scncnt; in file_read_elf()
333 elf->state.elf32.scns.max = scnmax; in file_read_elf()
336 elf->state.elf.scnincr = 10; in file_read_elf()
339 elf->class = e_ident[EI_CLASS]; in file_read_elf()
353 elf->state.elf32.ehdr = (Elf32_Ehdr *) ehdr; in file_read_elf()
357 /* Copy the ELF header. */ in file_read_elf()
358 elf->state.elf32.ehdr = memcpy (&elf->state.elf32.ehdr_mem, e_ident, in file_read_elf()
363 CONVERT (elf->state.elf32.ehdr_mem.e_type); in file_read_elf()
364 CONVERT (elf->state.elf32.ehdr_mem.e_machine); in file_read_elf()
365 CONVERT (elf->state.elf32.ehdr_mem.e_version); in file_read_elf()
366 CONVERT (elf->state.elf32.ehdr_mem.e_entry); in file_read_elf()
367 CONVERT (elf->state.elf32.ehdr_mem.e_phoff); in file_read_elf()
368 CONVERT (elf->state.elf32.ehdr_mem.e_shoff); in file_read_elf()
369 CONVERT (elf->state.elf32.ehdr_mem.e_flags); in file_read_elf()
370 CONVERT (elf->state.elf32.ehdr_mem.e_ehsize); in file_read_elf()
371 CONVERT (elf->state.elf32.ehdr_mem.e_phentsize); in file_read_elf()
372 CONVERT (elf->state.elf32.ehdr_mem.e_phnum); in file_read_elf()
373 CONVERT (elf->state.elf32.ehdr_mem.e_shentsize); in file_read_elf()
374 CONVERT (elf->state.elf32.ehdr_mem.e_shnum); in file_read_elf()
375 CONVERT (elf->state.elf32.ehdr_mem.e_shstrndx); in file_read_elf()
382 Elf32_Off e_shoff = elf->state.elf32.ehdr->e_shoff; in file_read_elf()
393 free (elf); in file_read_elf()
399 elf->state.elf32.shdr = (Elf32_Shdr *) (ehdr + e_shoff); in file_read_elf()
403 elf->state.elf32.scns.data[cnt].index = cnt; in file_read_elf()
404 elf->state.elf32.scns.data[cnt].elf = elf; in file_read_elf()
405 elf->state.elf32.scns.data[cnt].shdr.e32 = in file_read_elf()
406 &elf->state.elf32.shdr[cnt]; in file_read_elf()
407 if (likely (elf->state.elf32.shdr[cnt].sh_offset < maxsize) in file_read_elf()
408 && likely (elf->state.elf32.shdr[cnt].sh_size in file_read_elf()
409 <= maxsize - elf->state.elf32.shdr[cnt].sh_offset)) in file_read_elf()
410 elf->state.elf32.scns.data[cnt].rawdata_base = in file_read_elf()
411 elf->state.elf32.scns.data[cnt].data_base = in file_read_elf()
413 + elf->state.elf32.shdr[cnt].sh_offset); in file_read_elf()
414 elf->state.elf32.scns.data[cnt].list = &elf->state.elf32.scns; in file_read_elf()
419 if (elf->state.elf32.shdr[cnt].sh_type == SHT_SYMTAB_SHNDX in file_read_elf()
420 && elf->state.elf32.shdr[cnt].sh_link < scncnt) in file_read_elf()
421 elf->state.elf32.scns.data[elf->state.elf32.shdr[cnt].sh_link].shndx_index in file_read_elf()
426 if (elf->state.elf32.scns.data[cnt].shndx_index == 0) in file_read_elf()
427 elf->state.elf32.scns.data[cnt].shndx_index = -1; in file_read_elf()
434 elf->state.elf32.scns.data[cnt].index = cnt; in file_read_elf()
435 elf->state.elf32.scns.data[cnt].elf = elf; in file_read_elf()
436 elf->state.elf32.scns.data[cnt].list = &elf->state.elf32.scns; in file_read_elf()
441 elf->state.elf32.scns_last = &elf->state.elf32.scns; in file_read_elf()
455 elf->state.elf64.ehdr = (Elf64_Ehdr *) ehdr; in file_read_elf()
459 /* Copy the ELF header. */ in file_read_elf()
460 elf->state.elf64.ehdr = memcpy (&elf->state.elf64.ehdr_mem, e_ident, in file_read_elf()
465 CONVERT (elf->state.elf64.ehdr_mem.e_type); in file_read_elf()
466 CONVERT (elf->state.elf64.ehdr_mem.e_machine); in file_read_elf()
467 CONVERT (elf->state.elf64.ehdr_mem.e_version); in file_read_elf()
468 CONVERT (elf->state.elf64.ehdr_mem.e_entry); in file_read_elf()
469 CONVERT (elf->state.elf64.ehdr_mem.e_phoff); in file_read_elf()
470 CONVERT (elf->state.elf64.ehdr_mem.e_shoff); in file_read_elf()
471 CONVERT (elf->state.elf64.ehdr_mem.e_flags); in file_read_elf()
472 CONVERT (elf->state.elf64.ehdr_mem.e_ehsize); in file_read_elf()
473 CONVERT (elf->state.elf64.ehdr_mem.e_phentsize); in file_read_elf()
474 CONVERT (elf->state.elf64.ehdr_mem.e_phnum); in file_read_elf()
475 CONVERT (elf->state.elf64.ehdr_mem.e_shentsize); in file_read_elf()
476 CONVERT (elf->state.elf64.ehdr_mem.e_shnum); in file_read_elf()
477 CONVERT (elf->state.elf64.ehdr_mem.e_shstrndx); in file_read_elf()
484 Elf64_Off e_shoff = elf->state.elf64.ehdr->e_shoff; in file_read_elf()
496 elf->state.elf64.shdr = (Elf64_Shdr *) (ehdr + (ptrdiff_t) e_shoff); in file_read_elf()
500 elf->state.elf64.scns.data[cnt].index = cnt; in file_read_elf()
501 elf->state.elf64.scns.data[cnt].elf = elf; in file_read_elf()
502 elf->state.elf64.scns.data[cnt].shdr.e64 = in file_read_elf()
503 &elf->state.elf64.shdr[cnt]; in file_read_elf()
504 if (likely (elf->state.elf64.shdr[cnt].sh_offset < maxsize) in file_read_elf()
505 && likely (elf->state.elf64.shdr[cnt].sh_size in file_read_elf()
506 <= maxsize - elf->state.elf64.shdr[cnt].sh_offset)) in file_read_elf()
507 elf->state.elf64.scns.data[cnt].rawdata_base = in file_read_elf()
508 elf->state.elf64.scns.data[cnt].data_base = in file_read_elf()
510 + elf->state.elf64.shdr[cnt].sh_offset); in file_read_elf()
511 elf->state.elf64.scns.data[cnt].list = &elf->state.elf64.scns; in file_read_elf()
516 if (elf->state.elf64.shdr[cnt].sh_type == SHT_SYMTAB_SHNDX in file_read_elf()
517 && elf->state.elf64.shdr[cnt].sh_link < scncnt) in file_read_elf()
518 elf->state.elf64.scns.data[elf->state.elf64.shdr[cnt].sh_link].shndx_index in file_read_elf()
523 if (elf->state.elf64.scns.data[cnt].shndx_index == 0) in file_read_elf()
524 elf->state.elf64.scns.data[cnt].shndx_index = -1; in file_read_elf()
531 elf->state.elf64.scns.data[cnt].index = cnt; in file_read_elf()
532 elf->state.elf64.scns.data[cnt].elf = elf; in file_read_elf()
533 elf->state.elf64.scns.data[cnt].list = &elf->state.elf64.scns; in file_read_elf()
538 elf->state.elf64.scns_last = &elf->state.elf64.scns; in file_read_elf()
541 return elf; in file_read_elf()
545 Elf *
548 size_t maxsize, Elf_Cmd cmd, Elf *parent) in __libelf_read_mmaped_file()
550 /* We have to find out what kind of file this is. We handle ELF in __libelf_read_mmaped_file()
552 header. The header for an ELF file is EI_NIDENT bytes in size, in __libelf_read_mmaped_file()
579 static Elf *
581 Elf *parent) in read_unmmaped_file()
583 /* We have to find out what kind of file this is. We handle ELF in read_unmmaped_file()
585 header. The identification header for an ELF file is EI_NIDENT in read_unmmaped_file()
586 bytes in size, but we read the whole ELF header since we will in read_unmmaped_file()
622 /* Make sure at least the ELF header is contained in the file. */ in read_unmmaped_file()
641 static struct Elf *
643 Elf_Cmd cmd, Elf *parent) in read_file()
697 struct Elf *result = __libelf_read_mmaped_file (fildes, map_address, in read_file()
722 read_long_names (Elf *elf) in read_long_names() argument
732 if (elf->map_address != NULL) in read_long_names()
734 if ((size_t) offset > elf->maximum_size in read_long_names()
735 || elf->maximum_size - offset < sizeof (struct ar_hdr)) in read_long_names()
739 hdr = (struct ar_hdr *) (elf->map_address + offset); in read_long_names()
744 if (unlikely (pread_retry (elf->fildes, &hdrm, sizeof (hdrm), in read_long_names()
745 elf->start_offset + offset) in read_long_names()
776 if (elf->map_address != NULL) in read_long_names()
778 if (len > elf->maximum_size - offset - sizeof (struct ar_hdr)) in read_long_names()
790 if (elf->map_address != NULL) in read_long_names()
793 elf->state.ar.long_names = (char *) memcpy (newp, in read_long_names()
794 elf->map_address + offset in read_long_names()
800 if (unlikely ((size_t) pread_retry (elf->fildes, newp, len, in read_long_names()
801 elf->start_offset + offset in read_long_names()
807 elf->state.ar.long_names = NULL; in read_long_names()
810 elf->state.ar.long_names = newp; in read_long_names()
813 elf->state.ar.long_names_len = len; in read_long_names()
845 __libelf_next_arhdr_wrlock (Elf *elf) in __libelf_next_arhdr_wrlock() argument
850 if (elf->map_address != NULL) in __libelf_next_arhdr_wrlock()
853 if (unlikely ((size_t) elf->state.ar.offset in __libelf_next_arhdr_wrlock()
854 > elf->start_offset + elf->maximum_size in __libelf_next_arhdr_wrlock()
855 || (elf->start_offset + elf->maximum_size in __libelf_next_arhdr_wrlock()
856 - elf->state.ar.offset) < sizeof (struct ar_hdr))) in __libelf_next_arhdr_wrlock()
862 ar_hdr = (struct ar_hdr *) (elf->map_address + elf->state.ar.offset); in __libelf_next_arhdr_wrlock()
866 ar_hdr = &elf->state.ar.ar_hdr; in __libelf_next_arhdr_wrlock()
868 if (unlikely (pread_retry (elf->fildes, ar_hdr, sizeof (struct ar_hdr), in __libelf_next_arhdr_wrlock()
869 elf->state.ar.offset) in __libelf_next_arhdr_wrlock()
887 *((char *) mempcpy (elf->state.ar.raw_name, ar_hdr->ar_name, 16)) = '\0'; in __libelf_next_arhdr_wrlock()
889 elf_ar_hdr = &elf->state.ar.elf_ar_hdr; in __libelf_next_arhdr_wrlock()
898 elf_ar_hdr->ar_name = memcpy (elf->state.ar.ar_name, "/", 2); in __libelf_next_arhdr_wrlock()
902 elf_ar_hdr->ar_name = memcpy (elf->state.ar.ar_name, "/SYM64/", 8); in __libelf_next_arhdr_wrlock()
906 elf_ar_hdr->ar_name = memcpy (elf->state.ar.ar_name, "//", 3); in __libelf_next_arhdr_wrlock()
913 if (unlikely (elf->state.ar.long_names == NULL in __libelf_next_arhdr_wrlock()
914 && read_long_names (elf) == NULL)) in __libelf_next_arhdr_wrlock()
923 if (unlikely (offset >= elf->state.ar.long_names_len)) in __libelf_next_arhdr_wrlock()
929 elf_ar_hdr->ar_name = elf->state.ar.long_names + offset; in __libelf_next_arhdr_wrlock()
943 endp = (char *) memccpy (elf->state.ar.ar_name, ar_hdr->ar_name, in __libelf_next_arhdr_wrlock()
953 elf->state.ar.ar_name[i] = '\0'; in __libelf_next_arhdr_wrlock()
954 while (i > 0 && elf->state.ar.ar_name[--i] == ' '); in __libelf_next_arhdr_wrlock()
957 elf_ar_hdr->ar_name = elf->state.ar.ar_name; in __libelf_next_arhdr_wrlock()
1029 maxsize = (elf->start_offset + elf->maximum_size in __libelf_next_arhdr_wrlock()
1030 - elf->state.ar.offset - sizeof (struct ar_hdr)); in __libelf_next_arhdr_wrlock()
1041 static Elf *
1042 dup_elf (int fildes, Elf_Cmd cmd, Elf *ref) in dup_elf()
1044 struct Elf *result; in dup_elf()
1104 static struct Elf *
1107 /* We simply create an empty `Elf' structure. */ in write_file()
1109 Elf *result = allocate_elf (fd, NULL, 0, 0, cmd, NULL, ELF_K_ELF, in write_file()
1118 result->state.elf.scnincr = NSCNSALLOC; in write_file()
1121 assert (offsetof (struct Elf, state.elf32.scns) in write_file()
1122 == offsetof (struct Elf, state.elf64.scns)); in write_file()
1123 result->state.elf.scns_last = &result->state.elf32.scns; in write_file()
1131 static inline Elf *
1132 lock_dup_elf (int fildes, Elf_Cmd cmd, Elf *ref) in lock_dup_elf()
1145 Elf *
1146 elf_begin (int fildes, Elf_Cmd cmd, Elf *ref) in elf_begin()
1148 Elf *retval; in elf_begin()