|
|
1.1 ! root 1: /* symorder orderlist symbolfile ! 2: * orderlist is a file containing symbols to be found in symbolfile, ! 3: * 1 symbol per line. ! 4: * symbolfile is updated in place to put the requested symbols first ! 5: * in the symbol table, in the order specified. This is done ! 6: * by swapping the old symbols in the required spots with the ! 7: * new ones. If all of the order symbols are not found, an ! 8: * error is generated. ! 9: * ! 10: * Modelled after nlist.c the nlist subroutine, which has been ! 11: * modified to succeed as soon as all sought symbols are found. ! 12: * ! 13: * This program was specifically designed to cut down on the read ! 14: * overhead of systat(ss) when getting symbols from /unix. ! 15: */ ! 16: ! 17: #include <stdio.h> ! 18: #include <a.out.h> ! 19: int a_magic[] = {A_MAGIC1, A_MAGIC2, A_MAGIC3, A_MAGIC4, 0}; ! 20: #define SPACE 100 ! 21: ! 22: main(argc, argv) ! 23: char *argv[]; ! 24: { ! 25: register struct nlist *p, *q; ! 26: register FILE *f; ! 27: register int sa, na, i, j; ! 28: int nsym = 0, symfound = 0, n, o; ! 29: struct nlist nl1, nl2; ! 30: char buf[20]; ! 31: struct nlist order[SPACE]; ! 32: struct exec exec; ! 33: ! 34: if(argc != 3) { ! 35: fprintf(stderr, "Usage: symorder orderlist file\n"); ! 36: exit(1); ! 37: } ! 38: if((f = fopen(argv[1], "r")) == NULL) { ! 39: fprintf(stderr, "Can't open "); perror(argv[1]); ! 40: exit(1); ! 41: } ! 42: for(p = order; fgets(buf, sizeof buf, f) != NULL; p++, nsym++) ! 43: for(i = 0; i < 8 && buf[i] != '\n'; i++) ! 44: p->n_name[i] = buf[i]; ! 45: fclose(f); ! 46: /*** for(i = 0; i < nsym; i++) ***/ ! 47: /*** printf("\"%.8s\"\n", order[i].n_name); ***/ ! 48: /*** printf("--------\n"); ***/ ! 49: if((f = fopen(argv[2], "r")) == NULL) { ! 50: fprintf(stderr, "Can't open "); perror(argv[2]); ! 51: exit(1); ! 52: } ! 53: if((o = open(argv[2], 1)) < 0) { ! 54: fprintf(stderr, "Can't update "); perror(argv[2]); ! 55: exit(1); ! 56: } ! 57: if((fread(&exec, sizeof exec, 1, f)) != 1) { ! 58: fprintf(stderr, "Can't read "); perror(argv[2]); ! 59: exit(1); ! 60: } ! 61: for(i=0; a_magic[i]; i++) ! 62: if(a_magic[i] == exec.a_magic) break; ! 63: if(a_magic[i] == 0){ ! 64: fprintf(stderr, "Bad Header on %s\n", argv[2]); ! 65: exit(1); ! 66: } ! 67: sa = exec.a_text + exec.a_data; ! 68: sa += exec.a_trsize + exec.a_drsize; ! 69: sa += sizeof exec; ! 70: na = sa; ! 71: fseek(f, sa, 0); ! 72: n = exec.a_syms; ! 73: ! 74: while(n && symfound < nsym) { ! 75: if(fread(&nl1, sizeof nl1, 1, f) != 1) { ! 76: fprintf(stderr, "Short file "); perror(argv[2]); ! 77: exit(1); ! 78: } ! 79: /*** printf("\"%.8s\"\n", nl1.n_name); ***/ ! 80: na += sizeof nl1; ! 81: n -= sizeof nl1; ! 82: /*** printf("Trying "); ***/ ! 83: for(j = 0; j < nsym; j++) { ! 84: /*** printf("%s ", order[j].n_name); ***/ ! 85: for(i = 0; i < 8; i++) ! 86: if(nl1.n_name[i] != order[j].n_name[i]) ! 87: goto cont; ! 88: /*** printf("Found: %.8s\n", nl1.n_name); ***/ ! 89: if (order[j].n_value) ! 90: goto cont; ! 91: order[j].n_value = 1; ! 92: fseek(f, (i = (sa+(j * sizeof nl1))), 0); ! 93: if(fread(&nl2, sizeof nl2, 1, f) != 1) ! 94: printf("Read err on 2nd sym\n"); ! 95: lseek(o, i, 0); ! 96: if(write(o, &nl1, sizeof nl1) == -1) ! 97: perror("write1"); ! 98: lseek(o, na-sizeof nl1, 0); ! 99: if(write(o, &nl2, sizeof nl2) == -1) ! 100: perror("write2"); ! 101: fseek(f, 0, 0); ! 102: fseek(f, na, 0); ! 103: symfound++; ! 104: break; ! 105: cont: ; ! 106: ! 107: } ! 108: /*** printf("\n"); ***/ ! 109: } ! 110: if(symfound < nsym) { ! 111: fprintf(stderr, "%d Syms not found:\n", nsym - symfound); ! 112: for (i = 0; i < nsym; i++) { ! 113: if (order[i].n_value == 0) ! 114: printf("%.8s\n", order[i].n_name); ! 115: } ! 116: } ! 117: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.