File: spp.c

package info (click to toggle)
gcl 2.6.14-21
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 60,864 kB
  • sloc: ansic: 177,407; lisp: 151,509; asm: 128,169; sh: 22,510; cpp: 11,923; tcl: 3,181; perl: 2,930; makefile: 2,360; sed: 334; yacc: 226; lex: 95; awk: 30; fortran: 24; csh: 23
file content (102 lines) | stat: -rwxr-xr-x 2,153 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
 

/*
 * spp.c
 * Extracts the symbol table from an HP-UX executable file
 * to be used in a later pass of the linker. (ld does not
 * support the -A option.)
 */

#include <stdio.h>
#include <a.out.h>

filecpy(to, from, n)
FILE *to, *from;
register int n;
{
	char buffer[BUFSIZ];

	for (;;)
		if (n > BUFSIZ) {
			fread(buffer, BUFSIZ, 1, from);
			fwrite(buffer, BUFSIZ, 1, to);
			n -= BUFSIZ;
		} else if (n > 0) {
			fread(buffer, 1, n, from);
			fwrite(buffer, 1, n, to);
			break;
		} else
			break;
}

stabcpy(to,from,n)
FILE *to, *from;
register int n;
{
	char buffer[BUFSIZ];
	struct nlist_ nbuf;
	int len;

	for (;;)
		if (n <= 0) break;
		else {
			fread(&nbuf,sizeof(nbuf),1,from);
			len = nbuf.n_length;
			fread(buffer,len,1,from);
			buffer[len] = '\0';
			nbuf.n_type = EXTERN | ABS;
			if (((strncmp(buffer,"_end",4)   == NULL) &&
			     (len == 4)) ||
			    ((strncmp(buffer,"_etext",6) == NULL) &&
			     (len == 6)) ||
			    ((strncmp(buffer,"_edata",6) == NULL) &&
			     (len == 6)))
			   buffer[1] = 'E';
			fwrite(&nbuf,sizeof(nbuf),1,to);
			fwrite(buffer,len,1,to);
			n -= sizeof(nbuf) + nbuf.n_length;
		}
}

main(argc,argv)
int argc;
char *argv[];
{
	FILE *file,*sfile;
	struct exec header;	
	char sfile_name[BUFSIZ];
	long skip,size0,size1;

	if(argc != 2) { 
		fprintf(stderr,"usage: spp <exefile>\n");
		exit(1);
	}
	if((file = fopen(argv[1],"r")) == NULL) {
		fprintf(stderr,"can't open exefile: %s\n", argv[1]);
		exit(1);
	}
	strcpy(sfile_name,argv[1]);
	strcat(sfile_name,".stb");
	if((sfile = fopen(sfile_name,"w")) == NULL) {
		fprintf(stderr,"can't create stbfile: %s\n", 
			sfile_name);
		exit(1);
	}
	fread(&header,sizeof(header),1,file);
	skip = MODCAL_OFFSET(header);
	size0 = header.a_pasint;
	size1= header.a_dnttsize +
	       header.a_sltsize + header.a_vtsize + header.a_trsize +
	       header.a_drsize;
	header.a_magic.file_type = RELOC_MAGIC;
	header.a_text = 0;
	header.a_data = 0;
	header.a_bss  = 0;
	fwrite(&header,sizeof(header),1,sfile);
	fseek(file,skip,0);
	filecpy(sfile,file,size0);
	stabcpy(sfile,file,header.a_lesyms);
	filecpy(sfile,file,size1);
	fclose(file);
	fclose(sfile);
}