Lines Matching +full:de +full:- +full:assert

1 /*-
31 #include <assert.h>
55 ELFTC_VCSID("$Id: nm.c 3722 2019-03-23 17:01:58Z jkoshy $");
158 * possible function - cmp_name, cmp_none, cmp_size, cmp_value
164 * possible function - sym_elem_print_all
176 #define CHECK_SYM_PRINT_DATA(p) (p->headp == NULL || p->sh_num == 0 || \
177 p->t_table == NULL || p->s_table == NULL || p->filename == NULL)
254 { "debug-syms", no_argument, NULL, 'a' },
255 { "defined-only", no_argument, &nm_opts.def_only, 1},
258 { "extern-only", no_argument, NULL, 'g' },
261 { "line-numbers", no_argument, NULL, 'l' },
262 { "no-demangle", no_argument, &nm_opts.no_demangle,
264 { "no-sort", no_argument, NULL, 'p' },
265 { "numeric-sort", no_argument, NULL, 'v' },
266 { "print-armap", no_argument, NULL, 's' },
267 { "print-file-name", no_argument, NULL, 'A' },
268 { "print-size", no_argument, NULL, 'S' },
270 { "reverse-sort", no_argument, NULL, 'r' },
271 { "size-sort", no_argument, &nm_opts.sort_size, 1},
272 { "undefined-only", no_argument, NULL, 'u' },
315 assert(l != NULL); in cmp_name()
316 assert(r != NULL); in cmp_name()
317 assert(((const struct sym_entry *)l)->name != NULL); in cmp_name()
318 assert(((const struct sym_entry *)r)->name != NULL); in cmp_name()
320 return (strcmp(((const struct sym_entry *)l)->name, in cmp_name()
321 ((const struct sym_entry *)r)->name)); in cmp_name()
343 assert(l != NULL); in cmp_size()
344 assert(l->name != NULL); in cmp_size()
345 assert(l->sym != NULL); in cmp_size()
346 assert(r != NULL); in cmp_size()
347 assert(r->name != NULL); in cmp_size()
348 assert(r->sym != NULL); in cmp_size()
350 if (l->sym->st_size == r->sym->st_size) in cmp_size()
351 return (strcmp(l->name, r->name)); in cmp_size()
353 return (l->sym->st_size - r->sym->st_size); in cmp_size()
367 assert(nm_print_data != NULL); in cmp_value()
368 ttable = nm_print_data->t_table; in cmp_value()
370 assert(l != NULL); in cmp_value()
371 assert(l->name != NULL); in cmp_value()
372 assert(l->sym != NULL); in cmp_value()
373 assert(r != NULL); in cmp_value()
374 assert(r->name != NULL); in cmp_value()
375 assert(r->sym != NULL); in cmp_value()
376 assert(ttable != NULL); in cmp_value()
378 l_is_undef = IS_UNDEF_SYM_TYPE(get_sym_type(l->sym, ttable)) ? 1 : 0; in cmp_value()
379 r_is_undef = IS_UNDEF_SYM_TYPE(get_sym_type(r->sym, ttable)) ? 1 : 0; in cmp_value()
381 assert(l_is_undef + r_is_undef >= 0); in cmp_value()
382 assert(l_is_undef + r_is_undef <= 2); in cmp_value()
387 if (l->sym->st_value == r->sym->st_value) in cmp_value()
388 return (strcmp(l->name, r->name)); in cmp_value()
389 return (l->sym->st_value > r->sym->st_value ? 1 : -1); in cmp_value()
392 return (l_is_undef == 0 ? 1 : -1); in cmp_value()
395 return (strcmp(l->name, r->name)); in cmp_value()
399 return (l->sym->st_value - r->sym->st_value); in cmp_value()
449 assert(filter_fn != NULL); in filter_insert()
455 e->fn = filter_fn; in filter_insert()
467 else if (!strncasecmp(opt, "gnu-v2", 6)) in parse_demangle_option()
469 else if (!strncasecmp(opt, "gnu-v3", 6)) in parse_demangle_option()
492 nm_longopts, NULL)) != -1) { in get_opt()
607 nm_opts.demangle_type = -1; in get_opt()
613 *argc -= optind; in get_opt()
617 * In POSIX mode, the '-o' option controls the output radix. in get_opt()
618 * In non-POSIX mode, the option is a synonym for the '-A' and in get_opt()
619 * '--print-file-name' options. in get_opt()
628 assert(nm_opts.sort_fn != NULL && "nm_opts.sort_fn is null"); in get_opt()
629 assert(nm_opts.elem_print_fn != NULL && in get_opt()
631 assert(nm_opts.value_print_fn != NULL && in get_opt()
639 "--size-sort with -u is meaningless"); in get_opt()
642 "-u with --defined-only is meaningless"); in get_opt()
670 assert(elf != NULL); in get_sym()
671 assert(headp != NULL); in get_sym()
676 warnx("elf_getscn failed: %s", elf_errmsg(-1)); in get_sym()
680 warnx("gelf_getshdr failed: %s", elf_errmsg(-1)); in get_sym()
704 if (!fep->fn(type, &sym, sym_name)) { in get_sym()
731 if (GELF_ST_TYPE(sym->st_info) == STT_SECTION) { in get_sym_name()
732 if (sec_table != NULL && sym->st_shndx < sec_table_size) in get_sym_name()
733 sym_name = sec_table[sym->st_shndx]; in get_sym_name()
735 sym_name = elf_strptr(elf, ndx, sym->st_name); in get_sym_name()
751 is_local = sym->st_info >> 4 == STB_LOCAL; in get_sym_type()
753 if (sym->st_shndx == SHN_ABS) /* absolute */ in get_sym_type()
756 if (sym->st_shndx == SHN_COMMON) /* common */ in get_sym_type()
759 if ((sym->st_info) >> 4 == STB_WEAK) { /* weak */ in get_sym_type()
760 if ((sym->st_info & 0xf) == STT_OBJECT) in get_sym_type()
761 return (sym->st_shndx == SHN_UNDEF ? 'v' : 'V'); in get_sym_type()
763 return (sym->st_shndx == SHN_UNDEF ? 'w' : 'W'); in get_sym_type()
766 if (sym->st_shndx == SHN_UNDEF) /* undefined */ in get_sym_type()
769 return (is_local == true && type_table[sym->st_shndx] != 'N' ? in get_sym_type()
770 tolower((unsigned char) type_table[sym->st_shndx]) : in get_sym_type()
771 type_table[sym->st_shndx]); in get_sym_type()
792 nm_opts.demangle_type = -1; in global_init()
814 assert(s != NULL && "shdr is NULL"); in is_sec_data()
816 return (((s->sh_flags & SHF_ALLOC) != 0) && s->sh_type != SHT_NOBITS); in is_sec_data()
848 assert(s != NULL && "shdr is NULL"); in is_sec_nobits()
850 return (s->sh_type == SHT_NOBITS); in is_sec_nobits()
857 assert(s != NULL && "shdr is NULL"); in is_sec_readonly()
859 return ((s->sh_flags & SHF_WRITE) == 0); in is_sec_readonly()
866 assert(s != NULL && "shdr is NULL"); in is_sec_text()
868 return ((s->sh_flags & SHF_EXECINSTR) != 0); in is_sec_text()
889 start = arsym->as_off; in print_ar_index()
892 if (elf_rand(arf, arsym->as_off) == arsym->as_off && in print_ar_index()
895 printf("%s in %s\n", arsym->as_name, in print_ar_index()
896 arhdr->ar_name != NULL ? in print_ar_index()
897 arhdr->ar_name : arhdr->ar_rawname); in print_ar_index()
901 --arsym_size; in print_ar_index()
936 /* archive file without -A option and POSIX */ in print_header()
943 /* multiple files(not archive) without -A option */ in print_header()
965 Dwarf_Error de; in get_block_value() local
967 if (dwarf_get_elf(dbg, &elf, &de) != DW_DLV_OK) { in get_block_value()
968 warnx("dwarf_get_elf failed: %s", dwarf_errmsg(de)); in get_block_value()
973 warnx("gelf_getehdr failed: %s", elf_errmsg(-1)); in get_block_value()
977 if (block->bl_len == 5) { in get_block_value()
979 return (le32dec((uint8_t *) block->bl_data + 1)); in get_block_value()
981 return (be32dec((uint8_t *) block->bl_data + 1)); in get_block_value()
982 } else if (block->bl_len == 9) { in get_block_value()
984 return (le64dec((uint8_t *) block->bl_data + 1)); in get_block_value()
986 return (be64dec((uint8_t *) block->bl_data + 1)); in get_block_value()
998 Dwarf_Error de; in find_object_name() local
1002 if (dwarf_attrval_string(die, DW_AT_name, &str, &de) == DW_DLV_OK) { in find_object_name()
1010 if (dwarf_attr(die, DW_AT_specification, &at, &de) != DW_DLV_OK) in find_object_name()
1013 if (dwarf_global_formref(at, &off, &de) != DW_DLV_OK) in find_object_name()
1016 if (dwarf_offdie(dbg, off, &ret_die, &de) != DW_DLV_OK) in find_object_name()
1033 Dwarf_Error de; in search_line_attr() local
1038 if (dwarf_tag(die, &tag, &de) != DW_DLV_OK) { in search_line_attr()
1039 warnx("dwarf_tag failed: %s", dwarf_errmsg(de)); in search_line_attr()
1051 if (dwarf_attrval_flag(die, DW_AT_artificial, &flag, &de) == in search_line_attr()
1056 if (dwarf_attrval_flag(die, DW_AT_declaration, &flag, &de) == in search_line_attr()
1061 if (dwarf_attrval_flag(die, DW_AT_external, &flag, &de) != in search_line_attr()
1071 &de) == DW_DLV_OK && udata > 0 && in search_line_attr()
1072 (Dwarf_Signed) (udata - 1) < filecount) { in search_line_attr()
1073 var->file = strdup(src_files[udata - 1]); in search_line_attr()
1074 if (var->file == NULL) { in search_line_attr()
1081 if (dwarf_attrval_unsigned(die, DW_AT_decl_line, &udata, &de) == in search_line_attr()
1083 var->line = udata; in search_line_attr()
1085 var->name = find_object_name(dbg, die); in search_line_attr()
1086 if (var->name == NULL) { in search_line_attr()
1087 if (var->file) in search_line_attr()
1088 free(var->file); in search_line_attr()
1093 if (dwarf_attr(die, DW_AT_location, &at, &de) == DW_DLV_OK && in search_line_attr()
1094 dwarf_formblock(at, &block, &de) == DW_DLV_OK) { in search_line_attr()
1100 if (*((uint8_t *)block->bl_data) == DW_OP_addr) in search_line_attr()
1101 var->addr = get_block_value(dbg, block); in search_line_attr()
1119 &de) == DW_DLV_OK && udata > 0 && in search_line_attr()
1120 (Dwarf_Signed) (udata - 1) < filecount) { in search_line_attr()
1121 func->file = strdup(src_files[udata - 1]); in search_line_attr()
1122 if (func->file == NULL) { in search_line_attr()
1129 if (dwarf_attrval_unsigned(die, DW_AT_decl_line, &udata, &de) == in search_line_attr()
1131 func->line = udata; in search_line_attr()
1133 func->name = find_object_name(dbg, die); in search_line_attr()
1134 if (func->name == NULL) { in search_line_attr()
1135 if (func->file) in search_line_attr()
1136 free(func->file); in search_line_attr()
1141 if (dwarf_attrval_unsigned(die, DW_AT_low_pc, &udata, &de) == in search_line_attr()
1143 func->lowpc = udata; in search_line_attr()
1144 if (dwarf_attrval_unsigned(die, DW_AT_high_pc, &udata, &de) == in search_line_attr()
1146 func->highpc = udata; in search_line_attr()
1154 ret = dwarf_child(die, &ret_die, &de); in search_line_attr()
1156 warnx("dwarf_child: %s", dwarf_errmsg(de)); in search_line_attr()
1162 ret = dwarf_siblingof(dbg, die, &ret_die, &de); in search_line_attr()
1164 warnx("dwarf_siblingof: %s", dwarf_errmsg(de)); in search_line_attr()
1181 Dwarf_Error de; in read_elf() local
1205 assert(filename != NULL && "filename is null"); in read_elf()
1223 objname = arhdr->ar_name != NULL ? arhdr->ar_name : in read_elf()
1224 arhdr->ar_rawname; in read_elf()
1289 OBJNAME, elf_errmsg(-1)); in read_elf()
1297 OBJNAME, elf_errmsg(-1)); in read_elf()
1343 if (dwarf_elf_init(elf, DW_DLC_READ, NULL, NULL, &dbg, &de) != in read_elf()
1345 warnx("dwarf_elf_init failed: %s", dwarf_errmsg(de)); in read_elf()
1360 (void) dwarf_finish(dbg, &de); in read_elf()
1365 &de)) == DW_DLV_OK) { in read_elf()
1367 while (dwarf_siblingof(dbg, die, &die, &de) == DW_DLV_OK) { in read_elf()
1368 if (dwarf_tag(die, &tag, &de) != DW_DLV_OK) { in read_elf()
1370 dwarf_errmsg(de)); in read_elf()
1383 ret = dwarf_srcfiles(die, &src_files, &filecount, &de); in read_elf()
1385 warnx("dwarf_srclines: %s", dwarf_errmsg(de)); in read_elf()
1393 ret = dwarf_srclines(die, &lbuf, &lcount, &de); in read_elf()
1395 warnx("dwarf_srclines: %s", dwarf_errmsg(de)); in read_elf()
1399 if (dwarf_lineaddr(lbuf[i], &lineaddr, &de)) { in read_elf()
1400 warnx("dwarf_lineaddr: %s", dwarf_errmsg(de)); in read_elf()
1403 if (dwarf_lineno(lbuf[i], &lineno, &de)) { in read_elf()
1404 warnx("dwarf_lineno: %s", dwarf_errmsg(de)); in read_elf()
1407 if (dwarf_linesrc(lbuf[i], &sfile, &de)) { in read_elf()
1408 warnx("dwarf_linesrc: %s", dwarf_errmsg(de)); in read_elf()
1415 lie->addr = lineaddr; in read_elf()
1416 lie->line = lineno; in read_elf()
1417 lie->file = strdup(sfile); in read_elf()
1418 if (lie->file == NULL) { in read_elf()
1431 (void) dwarf_finish(dbg, &de); in read_elf()
1456 free(func->file); in read_elf()
1457 free(func->name); in read_elf()
1467 free(var->file); in read_elf()
1468 free(var->name); in read_elf()
1478 free(lie->file); in read_elf()
1507 assert(filename != NULL && "filename is null"); in read_object()
1509 if ((fd = fileargs_open(nm_opts.fileargs, filename)) == -1) { in read_object()
1524 assert(arf != NULL && "arf is null."); in read_object()
1573 --argc; in read_files()
1590 if ((ep->sym->st_info & 0xf) == STT_FUNC && func_info != NULL) { in print_lineno()
1592 if (func->name != NULL && in print_lineno()
1593 !strcmp(ep->name, func->name) && in print_lineno()
1594 ep->sym->st_value >= func->lowpc && in print_lineno()
1595 ep->sym->st_value < func->highpc) { in print_lineno()
1596 printf("\t%s:%" PRIu64, func->file, func->line); in print_lineno()
1603 if ((ep->sym->st_info & 0xf) == STT_OBJECT && var_info != NULL) { in print_lineno()
1605 if (!strcmp(ep->name, var->name) && in print_lineno()
1606 ep->sym->st_value == var->addr) { in print_lineno()
1607 printf("\t%s:%" PRIu64, var->file, var->line); in print_lineno()
1616 if (ep->sym->st_value == lie->addr) { in print_lineno()
1617 printf("\t%s:%" PRIu64, lie->file, lie->line); in print_lineno()
1645 assert(nm_opts.value_print_fn != NULL && in set_opt_value_print_fn()
1660 printf("%-8s", ""); in sym_elem_print_all()
1662 printf("%-16s", ""); in sym_elem_print_all()
1667 if (sym->st_size != 0) { in sym_elem_print_all()
1675 if (sym->st_size != 0) in sym_elem_print_all()
1681 if (sym->st_size != 0) { in sym_elem_print_all()
1711 if (sym->st_size != 0) in sym_elem_print_all_portable()
1726 PRINT_DEMANGLED_NAME("%-20s|", name); in sym_elem_print_all_sysv()
1734 switch (sym->st_info & 0xf) { in sym_elem_print_all_sysv()
1764 if (sym->st_size != 0) in sym_elem_print_all_sysv()
1776 assert(IS_SYM_TYPE((unsigned char) type)); in sym_elem_def()
1788 assert(IS_SYM_TYPE((unsigned char) type)); in sym_elem_global()
1802 assert(sym != NULL); in sym_elem_global_static()
1807 info = sym->st_info >> 4; in sym_elem_global_static()
1818 assert(sym != NULL); in sym_elem_nondebug()
1823 if (sym->st_value == 0 && (sym->st_info & 0xf) == STT_FILE) in sym_elem_nondebug()
1825 if (sym->st_name == 0) in sym_elem_nondebug()
1835 assert(sym != NULL); in sym_elem_nonzero_size()
1840 return (sym->st_size > 0); in sym_elem_nonzero_size()
1847 assert(IS_SYM_TYPE((unsigned char) type)); in sym_elem_undef()
1866 free(ep->sym); in sym_list_dest()
1867 free(ep->name); in sym_list_dest()
1884 if ((e->name = strdup(name)) == NULL) { in sym_list_insert()
1889 if ((e->sym = malloc(sizeof(GElf_Sym))) == NULL) { in sym_list_insert()
1891 free(e->name); in sym_list_insert()
1896 memcpy(e->sym, sym, sizeof(GElf_Sym)); in sym_list_insert()
1899 if (sym->st_shndx == SHN_COMMON) in sym_list_insert()
1900 e->sym->st_value = sym->st_size; in sym_list_insert()
1921 for (si = 0; si != p->list_num; ++si) in sym_list_print()
1925 for (i = p->list_num - 1; i != -1; --i) in sym_list_print()
1944 assert(ep->name != NULL); in sym_list_print_each()
1945 assert(ep->sym != NULL); in sym_list_print_each()
1947 type = get_sym_type(ep->sym, p->t_table); in sym_list_print_each()
1950 printf("%s", p->filename); in sym_list_print_each()
1952 if (p->objname != NULL) in sym_list_print_each()
1953 printf("[%s]", p->objname); in sym_list_print_each()
1956 if (p->objname != NULL) in sym_list_print_each()
1957 printf(":%s", p->objname); in sym_list_print_each()
1962 switch (ep->sym->st_shndx) { in sym_list_print_each()
1987 if (ep->sym->st_shndx > p->sh_num) in sym_list_print_each()
1989 sec = p->s_table[ep->sym->st_shndx]; in sym_list_print_each()
1993 nm_opts.elem_print_fn(type, sec, ep->sym, ep->name); in sym_list_print_each()
2010 if ((e_v = malloc(sizeof(struct sym_entry) * p->list_num)) == NULL) { in sym_list_sort()
2016 STAILQ_FOREACH(ep, p->headp, sym_entries) { in sym_list_sort()
2017 if (ep->name != NULL && ep->sym != NULL) { in sym_list_sort()
2018 e_v[idx].name = ep->name; in sym_list_sort()
2019 e_v[idx].sym = ep->sym; in sym_list_sort()
2024 assert((size_t)idx == p->list_num); in sym_list_sort()
2028 assert(nm_print_data != NULL); in sym_list_sort()
2029 qsort(e_v, p->list_num, sizeof(struct sym_entry), in sym_list_sort()
2040 assert(sym != NULL && "sym is null"); in sym_size_oct_print()
2041 printf("%016" PRIo64, sym->st_size); in sym_size_oct_print()
2048 assert(sym != NULL && "sym is null"); in sym_size_hex_print()
2050 printf("%08" PRIx64, sym->st_size); in sym_size_hex_print()
2052 printf("%016" PRIx64, sym->st_size); in sym_size_hex_print()
2059 assert(sym != NULL && "sym is null"); in sym_size_dec_print()
2060 printf("%016" PRId64, sym->st_size); in sym_size_dec_print()
2067 assert(sym != NULL && "sym is null"); in sym_value_oct_print()
2068 printf("%016" PRIo64, sym->st_value); in sym_value_oct_print()
2075 assert(sym != NULL && "sym is null"); in sym_value_hex_print()
2077 printf("%08" PRIx64, sym->st_value); in sym_value_hex_print()
2079 printf("%016" PRIx64, sym->st_value); in sym_value_hex_print()
2086 assert(sym != NULL && "sym is null"); in sym_value_dec_print()
2087 printf("%016" PRId64, sym->st_value); in sym_value_dec_print()
2097 \n -A, --print-file-name Write the full pathname or library name of an\ in usage()
2099 \n -a, --debug-syms Display all symbols include debugger-only\ in usage()
2102 \n -B Equivalent to specifying \"--format=bsd\".\ in usage()
2103 \n -C, --demangle[=style] Decode low-level symbol names.\ in usage()
2104 \n --no-demangle Do not demangle low-level symbol names.\ in usage()
2105 \n -D, --dynamic Display only dynamic symbols.\ in usage()
2106 \n -e Display only global and static symbols."); in usage()
2108 \n -f Produce full output (default).\ in usage()
2109 \n --format=format Display output in specific format. Allowed\ in usage()
2111 \n -g, --extern-only Display only global symbol information.\ in usage()
2112 \n -h, --help Show this help message.\ in usage()
2113 \n -l, --line-numbers Display filename and linenumber using\ in usage()
2115 \n -n, --numeric-sort Sort symbols numerically by value."); in usage()
2117 \n -o Write numeric values in octal. Equivalent to\ in usage()
2118 \n specifying \"-t o\".\ in usage()
2119 \n -p, --no-sort Do not sort symbols.\ in usage()
2120 \n -P Write information in a portable output format.\ in usage()
2121 \n Equivalent to specifying \"--format=posix\".\ in usage()
2122 \n -r, --reverse-sort Reverse the order of the sort.\ in usage()
2123 \n -S, --print-size Print symbol sizes instead values.\ in usage()
2124 \n -s, --print-armap Include an index of archive members.\ in usage()
2125 \n --size-sort Sort symbols by size."); in usage()
2127 \n -t, --radix=format Write each numeric value in the specified\ in usage()
2133 \n -u, --undefined-only Display only undefined symbols.\ in usage()
2134 \n --defined-only Display only defined symbols.\ in usage()
2135 \n -V, --version Show the version identifier for %s.\ in usage()
2136 \n -v Sort output by value.\ in usage()
2137 \n -x Write numeric values in hexadecimal.\ in usage()
2138 \n Equivalent to specifying \"-t x\".", in usage()