/* * utility to adjust _stksize in gcc-cc1.ttp * * Usage: fixstk size [] * size: specified as # of bytes nnn * specified as # of Kilo Bytes nnnK * specified as # of Mega Bytes nnnM * filename: * optional, defaults to \.gcc-cc1.ttp * * ++jrb */ #include #include #include #include #include long lseek(int, long, int); long find_offset (fd, fn) int fd; char *fn; { struct aexec head; struct asym sym; if(read(fd, &head, sizeof(head)) != sizeof(head)) { perror(fn); exit(2); } if(head.a_magic != CMAGIC) { fprintf(stderr,"Invalid magic number %x\n", head.a_magic); exit(3); } if(head.a_syms == 0) { fprintf(stderr,"%s: no symbol table\n", fn); exit(4); } if(lseek(fd, head.a_text+head.a_data, 1) != (head.a_text+head.a_data+sizeof(head))) { perror(fn); exit(5); } do { if(read(fd, &sym, sizeof(sym)) != sizeof(sym)) { fprintf(stderr, "symbol _stksize not found\n"); exit(6); } } while(strncmp("__stksiz", sym.a_name, 8) != 0); if( !(sym.a_type & A_DATA) ) { fprintf(stderr, "symbol _stksize is undefined\n"); exit(9); } return sym.a_value + sizeof(head); } long calc_newsize(s) char *s; { size_t len = strlen(s) - 1; long mul = 1; long atol(const char *); switch(s[len]) { case 'k': case 'K': mul = 1L << 10; break; case 'm': case 'M': mul = 1L << 20; break; default: len += 1; } s[len] = '\0'; return mul * atol(s); } int main(argc, argv) int argc; char **argv; { int fd; long newstksize, stksize, offset; char sizestr[16], fn[FILENAME_MAX]; if(argc < 2) { fprintf(stderr, "usage: fixstk size []\n"); exit(1); } strcpy(sizestr, *++argv); if(argc > 2) (void) strcpy(fn, *++argv); else (void) strcpy(fn, "gcc-cc1.ttp"); if((fd = open(fn, 2)) < 0) { perror(fn); exit(1); } newstksize = calc_newsize(sizestr); offset = find_offset(fd, fn); if(lseek(fd, offset, 0) != offset) { perror(fn); close(fd); exit(7); } read(fd, &stksize, sizeof(long)); printf("%s: stksize was %ld (%dK)\n", fn, stksize, (int)(stksize/1024)); lseek(fd, -((long)sizeof(long)), 1); if(write(fd, &newstksize, sizeof(long)) != sizeof(long)) { perror(fn); close(fd); exit(8); } lseek(fd, -((long)sizeof(long)), 1); read(fd, &stksize, sizeof(long)); printf("%s: stksize now is %ld (%dK)\n", fn, stksize, (int)(stksize/1024)); return close(fd); }