FreeCalypso > hg > freecalypso-reveng
changeset 81:192da19c7506
tiobjd: symbol sorting implemented
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Wed, 26 Mar 2014 03:23:20 +0000 |
parents | da103b9377e3 |
children | c20dc315a9d4 |
files | ticoff/main.c ticoff/symtab.c |
diffstat | 2 files changed, 80 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/ticoff/main.c Wed Mar 26 02:44:19 2014 +0000 +++ b/ticoff/main.c Wed Mar 26 03:23:20 2014 +0000 @@ -10,6 +10,7 @@ #include "globals.h" extern int cmd_basics(); +extern int cmd_nm(); extern int cmd_profile(); extern int cmd_sechdr(); extern int cmd_symtab(); @@ -22,6 +23,7 @@ {"basics", cmd_basics}, {"dumpsym", cmd_symtab}, /* backward compat */ {"hdr", dump_filehdr_info}, + {"nm", cmd_nm}, {"profile", cmd_profile}, {"sechdr", cmd_sechdr}, {"symtab", cmd_symtab},
--- a/ticoff/symtab.c Wed Mar 26 02:44:19 2014 +0000 +++ b/ticoff/symtab.c Wed Mar 26 03:23:20 2014 +0000 @@ -141,3 +141,81 @@ extern_profile_report(objfilename); exit(0); } + +static void +initial_fill_for_sort(sec) + struct internal_scnhdr *sec; +{ + unsigned n, m; + struct internal_syment *sym; + + m = 0; + for (n = 0; n < nsymtab; n++) { + sym = symtab[n]; + if (!sym) + continue; + if (sym->section != sec) + continue; + sec->sorted_symbols[m++] = sym; + } +} + +static int +compare_for_sort(p1, p2) + struct internal_syment **p1, **p2; +{ + if ((*p1)->value < (*p2)->value) + return(-1); + if ((*p1)->value > (*p2)->value) + return(1); + else + return(0); +} + +void +sort_symbols_of_sec(sec) + struct internal_scnhdr *sec; +{ + if (sec->sorted_symbols) + return; + if (!sec->nsymbols) { + fprintf(stderr, + "BUG: sort_symbols_of_sec() called for section \"%s\" w/o symbols\n", + sec->name); + exit(1); + } + sec->sorted_symbols = malloc(sizeof(void *) * sec->nsymbols); + if (!sec->sorted_symbols) { + perror("malloc"); + exit(1); + } + initial_fill_for_sort(sec); + qsort(sec->sorted_symbols, sec->nsymbols, sizeof(void *), + compare_for_sort); +} + +cmd_nm() +{ + unsigned n, m; + struct internal_scnhdr *sec; + struct internal_syment *sym; + char classbuf[8]; + + get_int_section_table(); + get_int_symbol_table(); + for (n = 0; n < nsections; n++) { + sec = sections + n; + if (!sec->nsymbols) + continue; + printf("%s:\n\n", sec->name); + sort_symbols_of_sec(sec); + for (m = 0; m < sec->nsymbols; m++) { + sym = sec->sorted_symbols[m]; + printf("%08X %-7s %s\n", sym->value, + storage_class_to_string(sym->class, classbuf), + sym->name); + } + putchar('\n'); + } + exit(0); +}