anm.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. #define DUK /* Modifications by Duk Bekema. */
  2. /* @(#)anm.c 1.4 */
  3. /* $Header$ */
  4. /*
  5. ** print symbol tables for
  6. ** ACK object files
  7. **
  8. ** anm [-gopruns] [name ...]
  9. */
  10. #define ushort unsigned short
  11. #include "out.h"
  12. #include <stdio.h>
  13. #include <ctype.h>
  14. int numsort_flg;
  15. int sectsort_flg;
  16. int undef_flg;
  17. int revsort_flg = 1;
  18. int globl_flg;
  19. int nosort_flg;
  20. int arch_flg;
  21. int prep_flg;
  22. struct outhead hbuf;
  23. struct outsect sbuf;
  24. FILE *fi;
  25. long off;
  26. char *malloc();
  27. char *realloc();
  28. long s_base[S_MAX]; /* for specially encoded bases */
  29. main(argc, argv)
  30. char **argv;
  31. {
  32. int narg;
  33. int compare();
  34. if (--argc>0 && argv[1][0]=='-' && argv[1][1]!=0) {
  35. argv++;
  36. while (*++*argv) switch (**argv) {
  37. case 'n': /* sort numerically */
  38. numsort_flg++;
  39. continue;
  40. case 's': /* sort in section order */
  41. sectsort_flg++;
  42. continue;
  43. case 'g': /* globl symbols only */
  44. globl_flg++;
  45. continue;
  46. case 'u': /* undefined symbols only */
  47. undef_flg++;
  48. continue;
  49. case 'r': /* sort in reverse order */
  50. revsort_flg = -1;
  51. continue;
  52. case 'p': /* don't sort -- symbol table order */
  53. nosort_flg++;
  54. continue;
  55. case 'o': /* prepend a name to each line */
  56. prep_flg++;
  57. continue;
  58. default: /* oops */
  59. fprintf(stderr, "anm: invalid argument -%c\n", *argv[0]);
  60. exit(1);
  61. }
  62. argc--;
  63. }
  64. if (argc == 0) {
  65. argc = 1;
  66. argv[1] = "a.out";
  67. }
  68. narg = argc;
  69. while(argc--) {
  70. struct outname *nbufp = NULL;
  71. struct outname nbuf;
  72. char *cbufp;
  73. long fi_to_co;
  74. long n;
  75. unsigned readcount;
  76. int i,j;
  77. fi = fopen(*++argv,"r");
  78. if (fi == NULL) {
  79. fprintf(stderr, "anm: cannot open %s\n", *argv);
  80. continue;
  81. }
  82. getofmt((char *)&hbuf, SF_HEAD, fi);
  83. if (BADMAGIC(hbuf)) {
  84. fprintf(stderr, "anm: %s-- bad format\n", *argv);
  85. fclose(fi);
  86. continue;
  87. }
  88. if (narg > 1)
  89. printf("\n%s:\n", *argv);
  90. n = hbuf.oh_nname;
  91. if (n == 0) {
  92. fprintf(stderr, "anm: %s-- no name list\n", *argv);
  93. fclose(fi);
  94. continue;
  95. }
  96. if (hbuf.oh_nchar == 0) {
  97. fprintf(stderr, "anm: %s-- no names\n", *argv);
  98. fclose(fi);
  99. continue;
  100. }
  101. if ((readcount = hbuf.oh_nchar) != hbuf.oh_nchar) {
  102. fprintf(stderr, "anm: string area too big in %s\n", *argv);
  103. exit(2);
  104. }
  105. /* store special section bases */
  106. if (hbuf.oh_flags & HF_8086) {
  107. for (i=0; i<hbuf.oh_nsect; i++) {
  108. getofmt((char *)&sbuf, SF_SECT, fi);
  109. s_base[i+S_MIN] =
  110. (sbuf.os_base>>12) & 03777760;
  111. }
  112. }
  113. if ((cbufp = (char *)malloc(readcount)) == NULL) {
  114. fprintf(stderr, "anm: out of memory on %s\n", *argv);
  115. exit(2);
  116. }
  117. fseek(fi, OFF_CHAR(hbuf), 0);
  118. if (fread(cbufp, 1, readcount, fi) == 0) {
  119. fprintf(stderr, "anm: read error on %s\n", *argv);
  120. exit(2);
  121. }
  122. fi_to_co = cbufp - OFF_CHAR(hbuf);
  123. fseek(fi, OFF_NAME(hbuf), 0);
  124. i = 0;
  125. while (--n >= 0) {
  126. getofmt((char *)&nbuf, SF_NAME, fi);
  127. if (nbuf.on_foff == 0)
  128. continue; /* skip entries without names */
  129. if (globl_flg && (nbuf.on_type&S_EXT)==0)
  130. continue;
  131. if (undef_flg
  132. &&
  133. ((nbuf.on_type&S_TYP)!=S_UND || (nbuf.on_type&S_ETC)!=0))
  134. continue;
  135. nbuf.on_mptr = nbuf.on_foff + fi_to_co;
  136. /* adjust value for specially encoded bases */
  137. if (hbuf.oh_flags & HF_8086) {
  138. if (((nbuf.on_type&S_ETC) == 0) ||
  139. ((nbuf.on_type&S_ETC) == S_SCT)) {
  140. j = nbuf.on_type&S_TYP;
  141. if ((j>=S_MIN) && (j<=S_MAX))
  142. nbuf.on_valu += s_base[j];
  143. }
  144. }
  145. if (nbufp == NULL)
  146. nbufp = (struct outname *)malloc(sizeof(struct outname));
  147. else
  148. nbufp = (struct outname *)realloc(nbufp, (i+1)*sizeof(struct outname));
  149. if (nbufp == NULL) {
  150. fprintf(stderr, "anm: out of memory on %s\n", *argv);
  151. exit(2);
  152. }
  153. nbufp[i++] = nbuf;
  154. }
  155. if (nosort_flg==0)
  156. qsort(nbufp, i, sizeof(struct outname), compare);
  157. for (n=0; n<i; n++) {
  158. char cs1[4];
  159. char cs2[4];
  160. if (prep_flg)
  161. printf("%s:", *argv);
  162. switch(nbufp[n].on_type&S_ETC) {
  163. case S_SCT:
  164. sprintf(cs1, "%2d", (nbufp[n].on_type&S_TYP) - S_MIN);
  165. sprintf(cs2, " S");
  166. break;
  167. case S_FIL:
  168. sprintf(cs1, " -");
  169. sprintf(cs2, " F");
  170. break;
  171. case S_MOD:
  172. sprintf(cs1, " -");
  173. sprintf(cs2, " M");
  174. break;
  175. case 0:
  176. if (nbufp[n].on_type&S_EXT)
  177. sprintf(cs2, " E");
  178. else
  179. sprintf(cs2, " -");
  180. switch(nbufp[n].on_type&S_TYP) {
  181. case S_UND:
  182. sprintf(cs1, " U");
  183. break;
  184. case S_ABS:
  185. sprintf(cs1, " A");
  186. break;
  187. default:
  188. sprintf(cs1, "%2d", (nbufp[n].on_type&S_TYP) - S_MIN);
  189. }
  190. break;
  191. default:
  192. continue;
  193. }
  194. printf("%8lx %s %s %s\n",nbufp[n].on_valu,cs1,cs2,nbufp[n].on_mptr);
  195. }
  196. if (nbufp)
  197. free((char *)nbufp);
  198. if (cbufp)
  199. free((char *)cbufp);
  200. fclose(fi);
  201. }
  202. exit(0);
  203. }
  204. compare(p1, p2)
  205. struct outname *p1, *p2;
  206. {
  207. int i;
  208. if (sectsort_flg) {
  209. if ((p1->on_type&S_TYP) > (p2->on_type&S_TYP))
  210. return(revsort_flg);
  211. if ((p1->on_type&S_TYP) < (p2->on_type&S_TYP))
  212. return(-revsort_flg);
  213. }
  214. if (numsort_flg) {
  215. if (p1->on_valu > p2->on_valu)
  216. return(revsort_flg);
  217. if (p1->on_valu < p2->on_valu)
  218. return(-revsort_flg);
  219. }
  220. i = strcmp(p1->on_mptr, p2->on_mptr);
  221. if (i > 0)
  222. return(revsort_flg);
  223. if (i < 0)
  224. return(-revsort_flg);
  225. return(0);
  226. }
  227. getofmt(p, s, f)
  228. register char *p;
  229. register char *s;
  230. register FILE *f;
  231. {
  232. register i;
  233. register long l;
  234. for (;;) {
  235. switch (*s++) {
  236. /* case '0': p++; continue; */
  237. case '1':
  238. *p++ = getc(f);
  239. continue;
  240. case '2':
  241. i = getc(f);
  242. i |= (getc(f) << 8);
  243. #ifndef DUK
  244. *((short *)p)++ = i;
  245. #else DUK
  246. *((short *)p) = i;
  247. p += sizeof(short);
  248. #endif DUK
  249. continue;
  250. case '4':
  251. l = (long)getc(f);
  252. l |= ((long)getc(f) << 8);
  253. l |= ((long)getc(f) << 16);
  254. l |= ((long)getc(f) << 24);
  255. #ifndef DUK
  256. *((long *)p)++ = l;
  257. #else DUK
  258. *((long *)p) = l;
  259. p += sizeof(long);
  260. #endif DUK
  261. continue;
  262. default:
  263. case '\0':
  264. break;
  265. }
  266. break;
  267. }
  268. }