+ // symtab
+ if (hdr.f_nsyms != 0) {
+ symname[8] = 0;
+
+ symt_o = malloc(hdr.f_nsyms * sizeof(symt_o[0]) + 1);
+ my_assert_not(symt_o, NULL);
+
+ ret = fseek(f, hdr.f_symptr
+ + hdr.f_nsyms * sizeof(syment), SEEK_SET);
+ my_assert(ret, 0);
+ ret = fread(&i, 1, sizeof(i), f);
+ my_assert(ret, sizeof(i));
+ my_assert((unsigned int)i < filesize, 1);
+
+ stringtab = malloc(i);
+ my_assert_not(stringtab, NULL);
+ memset(stringtab, 0, 4);
+ ret = fread(stringtab + 4, 1, i - 4, f);
+ my_assert(ret, i - 4);
+
+ ret = fseek(f, hdr.f_symptr, SEEK_SET);
+ my_assert(ret, 0);
+ }
+
+ for (i = s = 0; i < hdr.f_nsyms; i++) {
+ long pos = ftell(f);
+
+ ret = fread(&syment, 1, sizeof(syment), f);
+ my_assert(ret, sizeof(syment));
+
+ strncpy(symname, syment.e.e_name, 8);
+ //printf("%3d %2d %08x '%s'\n", syment.e_sclass,
+ // syment.e_scnum, syment.e_value, symname);
+
+ if (syment.e_scnum != text_scnum || syment.e_sclass != C_EXT)
+ continue;
+
+ symt_o[s].addr = syment.e_value;
+ symt_o[s].fpos = pos;
+ if (syment.e.e.e_zeroes == 0)
+ symt_o[s].name = stringtab + syment.e.e.e_offset;
+ else
+ symt_o[s].name = strdup(symname);
+ s++;
+
+ if (syment.e_numaux) {
+ ret = fseek(f, syment.e_numaux * sizeof(syment),
+ SEEK_CUR);
+ my_assert(ret, 0);
+ i += syment.e_numaux;
+ }
+ }
+
+ if (symt_o != NULL)
+ qsort(symt_o, s, sizeof(symt_o[0]), symt_cmp);
+
+ *sym_cnt = s;
+ *symtab_out = symt_o;
+
+ if (base != 0 && base_out != NULL)