|
|
1.1 root 1: /* UNIX HEADER */
2: #include <stdio.h>
3:
4: /* COMMON SGS HEADERS */
5: #include "filehdr.h"
6: #include "ldfcn.h"
7:
8: /* STRIP HEADER */
9: #include "defs.h"
10:
11:
12: /* buildtmp(filename, filehead)
13: *
14: * Directs the building of the stripped temporary file.
15: * Copies the optional header, section headers, section contents, and
16: * relocation or symbol table information (depending on lflag, xflag or
17: * bflag) to the temporary file.
18: *
19: * calls:
20: * - cpyopthdr( ) to copy the optional header
21: * - cpyscnhdrs( ) to copy the section headers (update them too)
22: * - cpyscns( ) to copy the section contents
23: *
24: * - if lflag is ON
25: * - cpyreloc( ) to copy relocation information
26: * - copysyms( ) to copy all symbols (update them too)
27: * - if sflag is ON
28: * - cpyexts( ) to copy external and static symbols and
29: * fix up the line number entries
30: * - newreloc( ) to copy and fix up relocation entries
31: * - cpylnums( ) to copy and fix up the line number entries
32: * - if xflag is ON
33: * - cpyexts( ) to copy external and static symbols
34: * - if bflag is ON
35: * - cpyexts( ) to copy external, static, .bb, .eb, .bf,
36: * .ef symbols
37: * - if rflag is ON
38: * - if local symbols are already stripped
39: * - cpyreloc( ) to copy relocation information
40: * - cpysyms to copy all symbols
41: * - else
42: * - cpyexts( ) to copy external and static symbols
43: * - newreloc( ) to copy and fix up relocation entries
44: *
45: * - error(file, message, level) if anything goes wrong
46: *
47: * buildtmp( ) keeps track of the new location of the symbol table in a
48: * partially stripped (lflag, xflag, bflag) file
49: *
50: * returns SUCCESS or FAILURE
51: */
52:
53:
54: int
55: buildtmp(filename, filehead)
56:
57: char *filename;
58: FILHDR *filehead;
59:
60: {
61: /* STRIP FUNCTIONS CALLED */
62: extern int cpyopthdr( ),
63: cpyscnhdrs( ),
64: copysyms( );
65: extern long copyscns( ),
66: cpyreloc( ),
67: cpylnums( ),
68: newreloc( ),
69: copyexts( );
70: extern error( );
71:
72: /* EXTERNAL VARIABLES USED */
73: extern LDFILE *ldptr;
74: extern FILE *strp2;
75: extern FILE *strp1;
76: extern char tmpnam1[ ];
77: extern int lflag,
78: xflag,
79: bflag,
80: sflag,
81: rflag;
82:
83: if (filehead->f_opthdr != 0) {
84: if (cpyopthdr( ) != SUCCESS) {
85: error(filename, "cannot copy optional header", 2);
86: return(FAILURE);
87: }
88: }
89:
90: if (cpyscnhdrs( ) != SUCCESS) {
91: error(filename, "cannot copy section headers", 2);
92: return(FAILURE);
93: }
94:
95: if ((filehead->f_symptr = copyscns( )) == ERROR) {
96: error(filename, "cannot copy sections", 2);
97: return(FAILURE);
98: }
99:
100: if ( lflag ) {
101: if ((filehead->f_flags & F_RELFLG) == 0) {
102: if ((filehead->f_symptr = cpyreloc(filehead->f_symptr)) == ERROR) {
103: error(filename, "cannot copy relocation information", 2);
104: return(FAILURE);
105: }
106: }
107: if (copysyms( ) != SUCCESS) {
108: error( filename, "cannot copy symbol table", 2 );
109: return( FAILURE );
110: }
111:
112: } else if ( sflag) {
113: if ((filehead->f_nsyms = copyexts( filename )) == ERROR) {
114: error( filename, "cannot copy external symbols", 2);
115: return( FAILURE );
116: }
117: if ( !(filehead->f_flags & F_RELFLG) && ((filehead->f_symptr = newreloc( filehead->f_symptr )) == ERROR)) {
118: error( filename, "cannot copy relocation entries", 2 );
119: return( FAILURE );
120: }
121: if ( !(filehead->f_flags & F_LNNO) && ((filehead->f_symptr = cpylnums( filehead->f_symptr )) == ERROR)) {
122: error( filename, "cannot copy line numbers", 2 );
123: return( FAILURE );
124: }
125:
126: } else if (xflag || bflag) {
127: if ((filehead->f_nsyms = copyexts(filename)) == ERROR) {
128: error(filename, "cannot copy external symbols", 3);
129: return(FAILURE);
130: }
131:
132: } else if (rflag ) {
133: if (filehead->f_flags & F_LSYMS) {
134: if ((filehead->f_symptr = cpyreloc( filehead->f_symptr )) == ERROR ) {
135: error( filename, "cannot copy relocation information", 2);
136: return( FAILURE );
137: }
138: if (copysyms( ) != SUCCESS) {
139: error( filename, "cannot copy symbol table", 2);
140: return( FAILURE );
141: }
142: } else {
143: if ((filehead->f_nsyms = copyexts(filename)) == ERROR) {
144: error(filename,"cannot copy external symbols", 3);
145: return(FAILURE);
146: }
147: if((filehead->f_flags & F_RELFLG) == 0) {
148: if ((filehead->f_symptr = newreloc(filehead->f_symptr)) == ERROR) {
149: error(filename, "cannot copy relocation information",2);
150: return(FAILURE);
151: }
152: }
153: }
154:
155: } else {
156: filehead->f_symptr = 0L;
157: filehead->f_nsyms = 0L;
158: }
159:
160: return(SUCCESS);
161: }
162: /*
163: * @(#)buildtmp.c 1.5 11/4/83;
164: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.