• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /freebsd-12-stable/contrib/elftoolchain/elfcopy/

Lines Matching refs:ecp

80 static int	is_needed_symbol(struct elfcopy *ecp, int i, GElf_Sym *s);
81 static int is_remove_symbol(struct elfcopy *ecp, size_t sc, int i,
86 static int generate_symbols(struct elfcopy *ecp);
87 static void mark_reloc_symbols(struct elfcopy *ecp, size_t sc);
88 static void mark_section_group_symbols(struct elfcopy *ecp, size_t sc);
164 is_needed_symbol(struct elfcopy *ecp, int i, GElf_Sym *s)
168 if (BIT_ISSET(ecp->v_rel, i))
172 if (BIT_ISSET(ecp->v_grp, i))
179 if (ecp->flags & RELOCATABLE) {
188 is_remove_symbol(struct elfcopy *ecp, size_t sc, int i, GElf_Sym *s,
209 ecp->secndx[s->st_shndx] == 0)
213 if (lookup_symop_list(ecp, name, SYMOP_KEEP) != NULL)
216 if (ecp->strip == STRIP_ALL)
220 if (ecp->v_rel == NULL)
221 mark_reloc_symbols(ecp, sc);
224 if (ecp->v_grp == NULL)
225 mark_section_group_symbols(ecp, sc);
231 if (lookup_symop_list(ecp, name, SYMOP_STRIP) != NULL) {
232 if (BIT_ISSET(ecp->v_rel, i)) {
240 if (is_needed_symbol(ecp, i, s))
243 if (ecp->strip == STRIP_UNNEEDED)
246 if ((ecp->flags & DISCARD_LOCAL) && is_local_symbol(s->st_info) &&
250 if ((ecp->flags & DISCARD_LLABEL) && is_local_symbol(s->st_info) &&
254 if (ecp->strip == STRIP_DEBUG && is_debug_symbol(s->st_info))
264 mark_reloc_symbols(struct elfcopy *ecp, size_t sc)
275 ecp->v_rel = calloc((sc + 7) / 8, 1);
276 if (ecp->v_rel == NULL)
279 if (elf_getshstrndx(ecp->ein, &indx) == 0)
284 while ((s = elf_nextscn(ecp->ein, s)) != NULL) {
296 if ((name = elf_strptr(ecp->ein, indx, sh.sh_name)) == NULL)
299 if (is_remove_section(ecp, name) ||
300 is_remove_reloc_sec(ecp, sh.sh_info))
304 if (sh.sh_link != elf_ndxscn(ecp->symtab->is))
326 BIT_SET(ecp->v_rel, n);
343 mark_section_group_symbols(struct elfcopy *ecp, size_t sc)
351 ecp->v_grp = calloc((sc + 7) / 8, 1);
352 if (ecp->v_grp == NULL)
355 if (elf_getshstrndx(ecp->ein, &indx) == 0)
360 while ((s = elf_nextscn(ecp->ein, s)) != NULL) {
368 if ((name = elf_strptr(ecp->ein, indx, sh.sh_name)) == NULL)
371 if (is_remove_section(ecp, name))
375 BIT_SET(ecp->v_grp, sh.sh_info);
386 generate_symbols(struct elfcopy *ecp)
402 if (elf_getshstrndx(ecp->ein, &ishstrndx) == 0)
405 if ((ec = gelf_getclass(ecp->eout)) == ELFCLASSNONE)
420 ecp->symtab->sz = 0;
421 ecp->strtab->sz = 0;
422 ecp->symtab->buf = sy_buf;
423 ecp->strtab->buf = st_buf;
431 ecp->v_secsym = calloc((ecp->nos + 7) / 8, 1);
432 if (ecp->v_secsym == NULL)
439 while ((is = elf_nextscn(ecp->ein, is)) != NULL) {
443 if ((name = elf_strptr(ecp->ein, ishstrndx, ish.sh_name)) ==
465 while ((is = elf_nextscn(ecp->ein, is)) != NULL) {
469 if ((name = elf_strptr(ecp->ein, ishstrndx, ish.sh_name)) ==
491 ecp->symndx = calloc(sc, sizeof(*ecp->symndx));
492 if (ecp->symndx == NULL)
512 if ((name = elf_strptr(ecp->ein, symndx, sym.st_name)) == NULL)
517 if (is_remove_symbol(ecp, sc, i, &sym, name) != 0)
527 if (ecp->flags & WEAKEN_ALL ||
528 lookup_symop_list(ecp, name, SYMOP_WEAKEN) != NULL)
533 lookup_symop_list(ecp, name, SYMOP_LOCALIZE) !=
537 if (ecp->flags & KEEP_GLOBAL &&
539 lookup_symop_list(ecp, name, SYMOP_KEEPG) == NULL)
542 if (ecp->flags & LOCALIZE_HIDDEN &&
549 if (lookup_symop_list(ecp, name, SYMOP_GLOBALIZE) !=
557 if ((sp = lookup_symop_list(ecp, name, SYMOP_REDEF)) != NULL)
562 if (ecp->prefix_sym != NULL && name != NULL && *name != '\0') {
563 namelen = strlen(name) + strlen(ecp->prefix_sym) + 1;
566 snprintf(newname, namelen, "%s%s", ecp->prefix_sym,
575 ecp->symndx[i] = sy_buf->ngs;
577 ecp->symndx[i] = sy_buf->nls;
578 add_to_symtab(ecp, name, sym.st_value, sym.st_size,
590 assert(ecp->secndx[sym.st_shndx] < (uint64_t)ecp->nos);
591 BIT_SET(ecp->v_secsym, ecp->secndx[sym.st_shndx]);
608 TAILQ_FOREACH(s, &ecp->v_sec, sec_list) {
615 if ((ecp->flags & RELOCATABLE) != 0 &&
623 if (!BIT_ISSET(ecp->v_secsym, ndx)) {
633 add_to_symtab(ecp, NULL, sym.st_value, sym.st_size,
649 sy_buf->g32[ecp->symndx[i]].st_name +=
652 sy_buf->g64[ecp->symndx[i]].st_name +=
656 ecp->symndx[i] += sy_buf->nls;
665 free_symtab(ecp);
671 create_symtab(struct elfcopy *ecp)
676 sy = ecp->symtab;
677 st = ecp->strtab;
690 TAILQ_FOREACH(s, &ecp->v_sec, sec_list) {
699 ecp->secndx[elf_ndxscn(sy->is)] = maxndx + 1;
700 ecp->secndx[elf_ndxscn(st->is)] = maxndx + 2;
708 if (((ecp->flags & SYMTAB_INTACT) == 0) && !generate_symbols(ecp)) {
709 TAILQ_REMOVE(&ecp->v_sec, ecp->symtab, sec_list);
710 TAILQ_REMOVE(&ecp->v_sec, ecp->strtab, sec_list);
711 free(ecp->symtab->buf);
712 free(ecp->symtab);
713 free(ecp->strtab->buf);
714 free(ecp->strtab);
715 ecp->symtab = NULL;
716 ecp->strtab = NULL;
717 ecp->flags &= ~SYMTAB_EXIST;
722 if ((sy->os = elf_newscn(ecp->eout)) == NULL ||
723 (st->os = elf_newscn(ecp->eout)) == NULL)
727 ecp->secndx[elf_ndxscn(sy->is)] = elf_ndxscn(sy->os);
728 ecp->secndx[elf_ndxscn(st->is)] = elf_ndxscn(st->os);
734 copy_shdr(ecp, sy, ".symtab", 1, 0);
735 copy_shdr(ecp, st, ".strtab", 1, 0);
738 if (ecp->flags & SYMTAB_INTACT) {
744 create_symtab_data(ecp);
748 free_symtab(struct elfcopy *ecp)
755 if (ecp->symtab != NULL && ecp->symtab->buf != NULL) {
756 sy_buf = ecp->symtab->buf;
767 if (ecp->strtab != NULL && ecp->strtab->buf != NULL) {
768 st_buf = ecp->strtab->buf;
787 if (ecp->symndx != NULL) {
788 free(ecp->symndx);
789 ecp->symndx = NULL;
791 if (ecp->v_rel != NULL) {
792 free(ecp->v_rel);
793 ecp->v_rel = NULL;
795 if (ecp->v_grp != NULL) {
796 free(ecp->v_grp);
797 ecp->v_grp = NULL;
799 if (ecp->v_secsym != NULL) {
800 free(ecp->v_secsym);
801 ecp->v_secsym = NULL;
806 create_external_symtab(struct elfcopy *ecp)
814 if (ecp->oec == ELFCLASS32)
815 ecp->symtab = create_external_section(ecp, ".symtab", NULL,
818 ecp->symtab = create_external_section(ecp, ".symtab", NULL,
821 ecp->strtab = create_external_section(ecp, ".strtab", NULL, NULL, 0, 0,
825 if (gelf_getshdr(ecp->symtab->os, &sh) == NULL)
828 sh.sh_link = elf_ndxscn(ecp->strtab->os);
829 if (!gelf_update_shdr(ecp->symtab->os, &sh))
844 ecp->symtab->sz = 0;
845 ecp->strtab->sz = 0;
846 ecp->symtab->buf = sy_buf;
847 ecp->strtab->buf = st_buf;
850 add_to_symtab(ecp, NULL, 0, 0, SHN_UNDEF,
854 TAILQ_FOREACH(s, &ecp->v_sec, sec_list) {
867 add_to_symtab(ecp, NULL, 0, 0, ndx,
873 add_to_symtab(struct elfcopy *ecp, const char *name, uint64_t st_value,
914 ecp->secndx[st_shndx]; \
955 sy_buf = ecp->symtab->buf;
956 st_buf = ecp->strtab->buf;
958 if (ecp->oec == ELFCLASS32) {
971 ecp->symtab->sz = (sy_buf->nls + sy_buf->ngs) *
972 (ecp->oec == ELFCLASS32 ? sizeof(Elf32_Sym) : sizeof(Elf64_Sym));
973 ecp->strtab->sz = st_buf->l.sz + st_buf->g.sz;
981 finalize_external_symtab(struct elfcopy *ecp)
991 sy_buf = ecp->symtab->buf;
992 st_buf = ecp->strtab->buf;
994 if (ecp->oec == ELFCLASS32) {
1009 create_symtab_data(struct elfcopy *ecp)
1017 sy = ecp->symtab;
1018 st = ecp->strtab;
1037 if (ecp->oec == ELFCLASS32) {
1059 if (ecp->oec == ELFCLASS32) {
1109 shy.sh_addralign = (ecp->oec == ELFCLASS32 ? 4 : 8);
1113 shy.sh_entsize = gelf_fsize(ecp->eout, ELF_T_SYM, 1,
1140 add_to_symop_list(struct elfcopy *ecp, const char *name, const char *newname,
1146 STAILQ_FOREACH(s, &ecp->v_symop, symop_list)
1152 STAILQ_INSERT_TAIL(&ecp->v_symop, s, symop_list);
1161 lookup_symop_list(struct elfcopy *ecp, const char *name, unsigned int op)
1166 STAILQ_FOREACH(s, &ecp->v_symop, symop_list) {
1171 if ((ecp->flags & WILDCARD) == 0)