4.4BSD/usr/src/old/lisp/utils/tackon.c
#include <stdio.h>
#include "lconf.h"
#include "config.h"
#if ! os_unisoft
#include <sys/types.h>
#include <a.out.h>
/*
* $Header: /na/franz/utils/RCS/tackon.c,v 1.4 83/08/22 19:01:17 sklower Exp $
*
* $Locker: $
*
* This program tacks on extra symbols into the symbol table.
* someone should write one for system 5.
*
*/
FILE *map;
int aout;
#define NEWSIZ 100000
char newstrb[NEWSIZ];
#endif
main(argc, argv)
int argc;
char *argv[];
{
#if ! os_unisoft
char sym[50], svalue[50];
char *strb,*newstr,*malloc();
char *curstr;
int value;
int cnt;
int strsiz;
int strcnt;
int size;
int header_location;
struct nlist a;
struct exec e;
argc--, argv++;
if (argc == 0 || argc > 2) {
usage:
fprintf(stderr, "usage: tackon map [ a.out ]\n");
exit(1);
}
map = fopen(argv[0], "r");
if (map == NULL) {
perror(argv[0]);
exit(1);
}
aout = open(argc == 2 ? argv[1] : "a.out", 2);
if ((aout < 0) && (argc == 2)) {
char Name[256];
strcpy(Name,argv[1]);
strcat(Name,".exe");
aout = open(Name,2);
}
if (aout < 0) {
printf(" No object file to tackon or text busy\n");
exit(1);
}
header_location = 0;
read(aout,&e, sizeof(e));
if (N_BADMAG(e)) {
header_location = 512;
lseek(aout,512,0);
read(aout,&e,sizeof(e));
if (N_BADMAG(e)) {
printf("tackon: bad magic number\n");
exit(0);
}
}
/* read current string table into buffer */
lseek(aout, N_STROFF(e), 0); /* seek to string table beginning */
read(aout,&strsiz,4); /* read in string table size */
strb = malloc(strsiz);
read(aout,strb,strsiz); /* read in string table */
lseek(aout, N_STROFF(e), 0); /* now write at end of symbols */
cnt = 0;
strcnt = 4 + strsiz;
curstr = newstrb; /* point to new string buffer */
for (;;) {
if (fgets(sym, 50, map) == NULL)
break;
sym[size=strlen(sym)-1] = 0;
if (fgets(svalue, 50, map) == NULL) {
fprintf(stderr, "missing value\n");
break;
}
strcpy(curstr,sym);
sscanf(svalue, "%x", &a.n_value);
a.n_un.n_strx = strcnt;
a.n_type = N_EXT|N_TEXT;
write(aout, &a, sizeof (a));
curstr += size+1;
strcnt += size+1;
cnt++;
if( curstr >= &newstrb[NEWSIZ])
{
printf(" Tackon; string buffer overflow \n");
exit(1);
}
}
write(aout, &strcnt, 4); /* new character count */
write(aout, strb, strsiz); /* write out old string table */
write(aout, newstrb, strcnt - ( 4 + strsiz));
lseek(aout, header_location, 0);
e.a_syms += cnt*sizeof(struct nlist);
lseek(aout, header_location, 0);
write(aout, &e, sizeof (e));
exit(0);
#endif
}