# HG changeset patch # User Michael Spacefalcon # Date 1395801859 0 # Node ID da103b9377e3735fd085ef4744d35f22135b1d5c # Parent 8f4996bff9043722f0335161a085afdf01fbf551 tiobjd: preparation for symbol sorting diff -r 8f4996bff904 -r da103b9377e3 ticoff/intstruct.h --- a/ticoff/intstruct.h Wed Mar 26 02:00:44 2014 +0000 +++ b/ticoff/intstruct.h Wed Mar 26 02:44:19 2014 +0000 @@ -12,6 +12,8 @@ unsigned nreloc; unsigned nlineent; unsigned flags; + unsigned nsymbols; + struct internal_syment **sorted_symbols; }; struct internal_syment { @@ -21,4 +23,5 @@ int type; int class; u_char *aux; + struct internal_scnhdr *section; }; diff -r 8f4996bff904 -r da103b9377e3 ticoff/symtab.c --- a/ticoff/symtab.c Wed Mar 26 02:00:44 2014 +0000 +++ b/ticoff/symtab.c Wed Mar 26 02:44:19 2014 +0000 @@ -72,8 +72,8 @@ sym = symtab[n]; if (!sym) continue; - if (sym->scnum >= 1 && (unsigned)sym->scnum <= nsections) - sec = sections[sym->scnum - 1].name; + if (sym->section) + sec = sym->section->name; else { sprintf(secstr, "%d", sym->scnum); sec = secstr; @@ -115,7 +115,7 @@ printf("%s defines:\n\n", heading); defs_started = 1; } - printf("%s (%s)\n", sym->name, sections[sym->scnum - 1].name); + printf("%s (%s)\n", sym->name, sym->section->name); } if (defs_started) putchar('\n'); diff -r 8f4996bff904 -r da103b9377e3 ticoff/tables.c --- a/ticoff/tables.c Wed Mar 26 02:00:44 2014 +0000 +++ b/ticoff/tables.c Wed Mar 26 02:44:19 2014 +0000 @@ -75,6 +75,8 @@ fprintf(stderr, "warning: section #%u (%s): some nonzero value in s_page bytes\n", n, sections[n].name); + sections[n].nsymbols = 0; + sections[n].sorted_symbols = 0; } } @@ -98,11 +100,20 @@ in->name = get_secorsym_name(symtab_raw[n].e_name); in->value = get_u32(symtab_raw[n].e_value); in->scnum = get_s16(symtab_raw[n].e_scnum); - if (in->scnum < -2 || in->scnum > (int)nsections) { + if (in->scnum > 0) { + if (in->scnum > nsections) { + fprintf(stderr, + "symtab entry #%u: scnum too big\n", n); + exit(1); + } + in->section = sections + in->scnum - 1; + in->section->nsymbols++; + } else if (in->scnum < -2) { fprintf(stderr, - "symtab entry #%u: scnum out of range\n", n); + "symtab entry #%u: scnum < -2\n", n); exit(1); - } + } else + in->section = 0; in->type = get_u16(symtab_raw[n].e_type); in->class = symtab_raw[n].e_sclass; switch (symtab_raw[n++].e_numaux) {