|
|
1.1 root 1: /* UNIX HEADER */
2: #include <stdio.h>
3:
4: /* COMMON SGS HEADERS */
5: #include "filehdr.h"
6: #include "scnhdr.h"
7: #include "reloc.h"
8: #include "syms.h"
9: #include "ldfcn.h"
10: #include "linenum.h"
11:
12: /* STRIP HEADER */
13: #include "defs.h"
14:
15: /* SGS SPECIFIC HEADER */
16: #include "sgs.h"
17:
18: #if !UNIX
19: long rel_skipped;
20: long reloc_ptrs[MAXSECTIONS];
21: #endif
22:
23: #if !AR16WR
24: static TEMPENT *basep = NULL;
25: static TEMPENT *oldptr = NULL;
26: static TEMPENT *entptr = NULL;
27: #endif
28:
29: long start_reloc;
30: int havelnums = 0;
31: #if FLEXNAMES
32: long string_size = 0L;
33: #endif
34:
35: /* buildfcns.c is a collection of functions that copy parts of an object
36: * file to strip's temporary file
37: *
38: * copyopthdr( )
39: *
40: * copies the optional header to the temporary file
41: *
42: * calls:
43: * - docopy((long) HEADER(ldptr).f_opthdr) to do the copying
44: * after positioning ldptr at the start of the optional header
45: *
46: * returns SUCCESS or FAILURE depending on the success of the copying
47: */
48:
49: int
50: cpyopthdr( )
51:
52: {
53: /* OBJECT FILE ACCESS ROUTINE CALLED */
54: extern int ldohseek( );
55:
56: /* STRIP FUNCTION CALLED */
57: extern int docopy( );
58:
59: /* EXTERNAL VARIABLE USED */
60: extern LDFILE *ldptr;
61:
62: if (ldohseek(ldptr) == SUCCESS) {
63: if (docopy((long) HEADER(ldptr).f_opthdr) == SUCCESS) {
64: return(SUCCESS);
65: }
66: }
67:
68: return(FAILURE);
69: }
70:
71:
72:
73:
74: /* cpyscnhdrs( )
75: *
76: * copies each section header to the temporary file
77: * sets number of line numbers and line number pointer to zero
78: *
79: * returns SUCCESS or FAILURE depending on the success of the copy
80: */
81:
82:
83: int
84: cpyscnhdrs( )
85:
86: {
87: /* UNIX FUNCTIONS CALLED */
88: extern int fwrite( );
89:
90: /* COMMON ACCESS ROUTINE CALLED */
91: extern int ldshread( );
92:
93: /* EXTERNAL VARIABLES USED */
94: extern LDFILE *ldptr;
95: extern FILE *strp1;
96: extern int sflag;
97: extern int havelnums;
98: extern long start_reloc;
99: extern int fflag;
100: extern int rflag;
101: extern int lflag;
102: extern int xflag;
103: #if !UNIX
104: extern long rel_skipped;
105: extern long reloc_ptrs[];
106: #endif
107:
108: /* LOCAL VARIABLES */
109: SCNHDR secthead;
110: unsigned short section;
111:
112: #if !UNIX
113: if (fflag) {
114: rel_skipped = 0L;
115: for (section = 1; section <= HEADER(ldptr).f_nscns; ++section) {
116: if (ldshread( ldptr, section, §head ) != SUCCESS)
117: return( FAILURE );
118: if (secthead.s_flags & STYP_COPY)
119: reloc_ptrs[section - 1] = secthead.s_relptr - rel_skipped;
120: else {
121: reloc_ptrs[section - 1] = 0L;
122: rel_skipped += (long) secthead.s_nreloc * RELSZ;
123: }
124: }
125: }
126: #endif
127:
128: if (fflag || sflag || rflag || xflag || lflag)
129: start_reloc = HEADER(ldptr).f_symptr;
130: else
131: start_reloc = 0L;
132:
133: for (section = 1; section <= HEADER(ldptr).f_nscns; ++section) {
134: if (ldshread(ldptr, section, §head) != SUCCESS) {
135: return(FAILURE);
136: }
137:
138: /*
139: * Pick up the earliest section's relocation or line numbers,
140: * so that a gap between the last section and the next
141: * information will be handled correctly, since the next strip
142: * routine will assume a properly seeked pointer to the
143: * temp file "strp1"
144: */
145: if ((secthead.s_relptr != 0L) && (secthead.s_relptr < start_reloc))
146: start_reloc = secthead.s_relptr;
147: if ((secthead.s_lnnoptr != 0L) && (secthead.s_lnnoptr < start_reloc))
148: start_reloc = secthead.s_lnnoptr;
149:
150: #if !UNIX
151: if (fflag) {
152: secthead.s_relptr = reloc_ptrs[section - 1];
153: if (secthead.s_relptr == 0L)
154: secthead.s_nreloc = 0;
155: }
156: #endif
157: if (!sflag) {
158: secthead.s_lnnoptr = 0L;
159: secthead.s_nlnno = 0;
160: } else {
161: if ( secthead.s_nlnno != 0 ) {
162: havelnums = 1;
163: #if !UNIX
164: if (fflag)
165: secthead.s_lnnoptr -= rel_skipped;
166: #endif
167: }
168: }
169:
170: if (fwrite(§head, SCNHSZ, 1, strp1) != 1) {
171: return(FAILURE);
172: }
173: } /* for loop */
174:
175: return(SUCCESS);
176: }
177:
178:
179:
180:
181: /* copyscns( )
182: *
183: * copies the section contents to the temporary file
184: * keeps track of the file address that might be the start of the symbol
185: * table in a partially stripped file
186: *
187: * calls:
188: * - docopy(secthead.s_size) to do the copying after positioning
189: * ldptr at the start of a section's contents and after seeking
190: * to the section content file address in strp1 (to account for
191: * section content alignment in the object file)
192: *
193: * returns the address to be used for the start of the symbol table
194: * in a partially stripped file -- if everything goes okay
195: * returns ERROR if anything went wrong
196: */
197:
198:
199: long
200: copyscns( )
201:
202: {
203: /* UNIX FUNCTION CALLED */
204: extern int fseek( );
205: extern int fwrite( );
206:
207: /* OBJECT FILE ACCESS ROUTINES CALLED */
208: extern int ldshread( ),
209: ldsseek( );
210:
211: /* STRIP FUNCTION CALLED */
212: extern int docopy( );
213:
214: /* EXTERNAL VARIABLES USED */
215: extern LDFILE *ldptr;
216: extern FILE *strp1;
217: extern int sflag;
218: extern long start_reloc;
219:
220: /* LOCAL VARIABLES */
221: SCNHDR secthead;
222: unsigned short section;
223: long fileaddr;
224: long gap;
225: char buf[BUFSIZ];
226: register char *p;
227:
228: p = buf;
229: while (p < (buf + BUFSIZ))
230: *p++ = '\0';
231:
232: fileaddr = (long) FILHSZ + HEADER(ldptr).f_opthdr +
233: SCNHSZ * HEADER(ldptr).f_nscns;
234:
235: for (section = 1; section <= HEADER(ldptr).f_nscns; ++section) {
236: if (ldshread(ldptr, section, §head) != SUCCESS) {
237: return(ERROR);
238: }
239:
240: if (secthead.s_scnptr != 0L) {
241: if (ldsseek(ldptr, section) != SUCCESS) {
242: return(ERROR);
243: }
244:
245: /* If loader directive BLOCK is used, have to seek to section
246: * address in strp1 to ensure that the section contents appear
247: * in the right place. Note that the fileheader is not written
248: * to the temporary file so its size must be subtracted from the
249: * seek address. Under UNIX/RT, zeros must be written in the gap.
250: */
251:
252: #if RT
253: while (fileaddr < secthead.s_scnptr) {
254: gap = secthead.s_scnptr - fileaddr;
255: if (gap > BUFSIZ)
256: gap = BUFSIZ;
257: if (fwrite( buf, (int) gap, 1, strp1) != 1)
258: return( ERROR );
259: fileaddr += gap;
260: }
261: #else
262: if (fseek(strp1,secthead.s_scnptr - FILHSZ, BEGINNING) !=
263: OKFSEEK) {
264: return (ERROR);
265: }
266: #endif
267:
268:
269: if (docopy(secthead.s_size) != SUCCESS) {
270: return(ERROR);
271: }
272: fileaddr = secthead.s_scnptr + secthead.s_size;
273: }
274: }
275:
276: /*
277: * If there is a hole in the object file between the last byte of
278: * sections contents and whatever comes next, adjust "fileaddr"
279: * and the strp1 pointer so that the next strip routine called
280: * after this one will start at the right place in the
281: * temporary file
282: * This is also needed for .m files
283: */
284: if ((start_reloc != 0L) && (fileaddr < start_reloc))
285: while (fileaddr < start_reloc) {
286: gap = start_reloc - fileaddr;
287: if (gap > BUFSIZ)
288: gap = BUFSIZ;
289: if (fwrite( buf, (int) gap, 1, strp1 ) != 1)
290: return( ERROR );
291: fileaddr += gap;
292: }
293: return(fileaddr);
294: }
295:
296:
297:
298: /* cpyreloc(fileaddr)
299: *
300: * cpyreloc is called only if lflag is ON
301: * or if the rflag is ON and local symbols have already been stripped
302: * It copies the relocation information to the temporary file
303: * and increments fileaddr, the address of the symbol table in a partially
304: * stripped file.
305: *
306: * calls:
307: * - docopy((long) secthead.s_nreloc * RELSZ) to do the copying
308: * after ldptr has been positioned at the start of the reloc info
309: *
310: * returns the address to be used for the symbol table in a partially
311: * stripped if copy is successful
312: * returns ERROR otherwise.
313: */
314:
315:
316: long
317: cpyreloc(fileaddr)
318:
319: long fileaddr;
320:
321: {
322: /* COMMON OBJECT FILE ACCESS ROUTINES CALLED */
323: extern int ldshread( ),
324: ldrseek( );
325:
326: /* STRIP FUNCTION CALLED */
327: extern int docopy( );
328:
329: /* EXTERNAL VARIABLES USED */
330: extern LDFILE *ldptr;
331: #if !UNIX
332: extern int fflag;
333: #endif
334:
335: /* LOCAL VARIABLES */
336: SCNHDR secthead;
337: unsigned short section;
338:
339: for (section = 1; section <= HEADER(ldptr).f_nscns; ++section) {
340: if (ldshread(ldptr, section, §head) != SUCCESS) {
341: return(ERROR);
342: }
343:
344: if (secthead.s_nreloc != 0) {
345: #if !UNIX
346: if (fflag && !(secthead.s_flags & STYP_COPY))
347: continue;
348: #endif
349: if (ldrseek(ldptr, section) != SUCCESS) {
350: return(ERROR);
351: }
352:
353: if (docopy((long) secthead.s_nreloc * RELSZ) != SUCCESS) {
354: return(ERROR);
355: }
356:
357: fileaddr += (long) secthead.s_nreloc * RELSZ;
358: }
359: }
360:
361: return(fileaddr);
362: }
363: /* cpylnums( )
364: *
365: * cpylnums is called only if sflag is ON
366: * it copies the line number information to the temporary file
367: * and resets the symbol table index to the correct index of the
368: * partially stripped symbol table.
369: *
370: * fileaddr will be incremented to point to the spot where the
371: * new symbol table will be. cpylnums returns this value or ERROR
372: */
373:
374: long
375: cpylnums(fileaddr)
376: long fileaddr;
377: {
378: /* UNIX FUNCTIONS CALLED */
379: extern int fread( );
380: extern int fwrite( );
381:
382: /* COMMON OBJECT FILE ACCESS ROUTINES CALLED */
383: extern int ldlseek();
384: extern int ldshread();
385:
386: /* EXTERNAL VARIABLES USED */
387: extern LDFILE *ldptr;
388: extern FILE *strp1;
389:
390: /* STRIP FUNCTIONS CALLED */
391: extern long newndx( );
392:
393: /* LOCAL VARIABLES */
394: long lindex;
395: unsigned short section;
396: SCNHDR secthead;
397: LINENO lnum;
398: long numlnums;
399:
400: for (section = 1; section <= HEADER(ldptr).f_nscns; ++section) {
401: if (ldshread( ldptr, section, §head) != SUCCESS) {
402: fprintf( stderr, "cannot read section header for section %s\n", section );
403: return(ERROR);
404: }
405:
406: if (secthead.s_nlnno != 0) {
407: if (ldlseek(ldptr, section) != SUCCESS) {
408: fprintf( stderr, "could not seek to line numbers\n" );
409: return(ERROR);
410: }
411:
412: for (numlnums = 0L; numlnums < secthead.s_nlnno; ++numlnums) {
413: if (FREAD( &lnum, LINESZ, 1, ldptr ) != 1) {
414: fprintf( stderr, "could not read line numbers\n" );
415: return( ERROR );
416: }
417: if (lnum.l_lnno == 0) {
418: lindex = lnum.l_addr.l_symndx;
419: if ((lindex = newndx(lindex)) == ERROR){
420: fprintf( stderr, "could not locate new symbol table index\n" );
421: return( ERROR );
422: }
423: lnum.l_addr.l_symndx = lindex;
424: }
425: if (fwrite( &lnum, LINESZ, 1, strp1) != 1) {
426: fprintf( stderr, "could not write line numbers\n" );
427: return( ERROR );
428: }
429: }
430:
431: fileaddr += (long) secthead.s_nlnno * LINESZ;
432: }
433: }
434:
435: return(fileaddr);
436: }
437:
438:
439:
440: /* copysyms( )
441: *
442: * copies the entire symbol table to the temporary file (if lflag is ON
443: * or if the rflag is on and local symbols have already been stripped)
444: * sets the line number pointer in function auxiliary entries to zero
445: *
446: * returns SUCCESS or FAILURE
447: */
448:
449:
450: int
451: copysyms( )
452:
453: {
454: /* UNIX FUNCTIONS CALLED */
455: extern int fread( ),
456: fwrite( );
457:
458: /* COMMON OBJECT FILE ACCESS ROUTINES CALLED */
459: extern int ldtbseek( );
460: #if FLEXNAMES
461: extern int ldahread( );
462: #endif
463:
464: /* EXTERNAL VARIABLES USED */
465: extern LDFILE *ldptr;
466: extern FILE *strp1;
467: #if !UNIX
468: extern int fflag;
469: extern long reloc_ptrs[];
470: #endif
471:
472: /* LOCAL VARIABLES */
473: SYMENT symbol;
474: long symindx;
475: AUXENT aux;
476: #if FLEXNAMES
477: ARCHDR arhead;
478: long str_size;
479: long size;
480: long str_table;
481: #endif
482:
483: if (ldtbseek(ldptr) != SUCCESS)
484: return(FAILURE);
485:
486: for (symindx = 0L; symindx < HEADER(ldptr).f_nsyms; ++symindx)
487: {
488: if (FREAD(&symbol, SYMESZ, 1, ldptr) != 1)
489: return(FAILURE);
490:
491: if (fwrite(&symbol, SYMESZ, 1, strp1) != 1)
492: return(FAILURE);
493:
494: if (symbol.n_numaux == 1)
495: {
496: if (FREAD(&aux, AUXESZ, 1, ldptr) != 1)
497: return(FAILURE);
498: ++symindx;
499:
500: if (ISFCN(symbol.n_type))
501: {
502: aux.x_sym.x_fcnary.x_fcn.x_lnnoptr = 0L;
503: }
504:
505: if ((symbol.n_sclass == C_STAT)
506: && (symbol.n_zeroes != 0L)
507: && (strncmp( _TEXT, symbol.n_name, 8 ) == 0))
508: {
509: aux.x_scn.x_nlinno = 0;
510: #if !UNIX
511: if (fflag && (reloc_ptrs[symbol.n_scnum - 1] == 0L))
512: aux.x_scn.x_nreloc = 0L;
513: #endif
514: }
515:
516: if ((symbol.n_sclass == C_FCN) ||
517: (symbol.n_sclass == C_BLOCK) ||
518: (ISARY(symbol.n_type)))
519: aux.x_sym.x_misc.x_lnsz.x_lnno = 0;
520:
521: if (fwrite(&aux, AUXESZ, 1, strp1) != 1)
522: {
523: return(FAILURE);
524: }
525: }
526: }
527:
528: #if FLEXNAMES
529: /* copy the string table, if there is one */
530: str_table = STROFFSET(ldptr);
531: if (TYPE(ldptr) == USH_ARTYPE)
532: {
533: if (ldahread( ldptr, &arhead ) != SUCCESS)
534: {
535: fprintf( stderr, "could not read archive header" );
536: return( FAILURE );
537: }
538:
539: if (arhead.ar_size <= (str_table + 1))
540: return( SUCCESS );
541:
542: if ((FSEEK( ldptr, str_table, BEGINNING ) != OKFSEEK)
543: || (FREAD( &str_size, sizeof( long ), 1, ldptr ) != 1 ))
544: {
545: fprintf( stderr, "could not read string table\n" );
546: return( FAILURE );
547: }
548: }
549: else if ((FSEEK( ldptr, str_table, BEGINNING ) != OKFSEEK)
550: || (FREAD( &str_size, sizeof( long ), 1, ldptr ) != 1 ))
551: return( SUCCESS );
552:
553: /* make it even so the archive won't get screwed up */
554: size = str_size + (str_size & 01);
555: if ((fwrite( &size, sizeof( long ), 1, strp1 ) != 1)
556: || (docopy( str_size - 4 ) != SUCCESS ))
557: return( FAILURE );
558:
559: if (size != str_size)
560: putc( '\0', strp1 );
561: #endif
562:
563: return(SUCCESS);
564: }
565:
566:
567:
568:
569: /* EXTERNAL VARIABLE DEFINED */
570: LDFILE *fwdptr;
571:
572:
573: /* copyexts(filename)
574: *
575: * copies external, static and extdef symbols to the temporary file (xflag)
576: * sets the line number pointer in function aux entries to zero
577: * sets the forward file index in function aux entries appropriatly for
578: * the stripped symbol table
579: * sets the index of a structure, union or enumeration tag entry to zero
580: * for any structure, union or enumeration types left in the table
581: *
582: * defines:
583: * - fwdptr = ldaopen(filename, ldptr) to read entries between a
584: * function and a .ef entry to determine the value of the
585: * forward file index in the function aux entry
586: *
587: * calls:
588: * - findndx(aux.x_sym.x_fcnary.x_fcn.x_endndx, oldndx, count) to determine the
589: * new value of aux.x_sym.x_fcnary.x_fcn.x_endndx
590: *
591: * returns the number of symbols left in the symbol table after partial
592: * stripping if successful
593: * returns ERROR otherwise
594: *
595: * Note that TUS people would like strip to keep .bf and .ef entries around
596: * when locals are stripped from the symbol table but this is not
597: * currently done.
598: */
599:
600:
601: long
602: copyexts(filename)
603:
604: char *filename;
605:
606: {
607: /* UNIX FUNCTIONS CALLED */
608: extern int fread( ),
609: fwrite( );
610:
611: /* COMMON OBJECT FILE ACCESS ROUTINES CALLED */
612: extern LDFILE *ldaopen( );
613: extern int ldaclose( ),
614: ldtbseek( );
615: #if FLEXNAMES
616: extern char *ldgetname( );
617: #endif
618:
619: /* STRIP FUNCTION CALLED */
620: extern long findndx( );
621: #if !AR16WR
622: extern TEMPENT *getempent( );
623: #endif
624:
625: /* EXTERNAL VARIABLES USED */
626: extern LDFILE *ldptr,
627: *fwdptr;
628: extern FILE *strp2;
629: #if AR16WR
630: extern FILE *readtmp,
631: *tempfil;
632: #else
633: extern TEMPENT *basep;
634: #endif
635: extern int rflag,
636: havelnums,
637: bflag,
638: sflag;
639: #if !UNIX
640: extern int fflag;
641: extern long rel_skipped;
642: extern long reloc_ptrs[];
643: #endif
644: #if FLEXNAMES
645: extern long string_file;
646: extern char tmpnam5[];
647: #endif
648:
649: /* LOCAL VARIABLES */
650: SYMENT symbol;
651: #if AR16WR
652: TEMPENT temp;
653: #else
654: TEMPENT *temp;
655: TEMPENT *tail;
656: #endif
657: long oldndx;
658: long count;
659: AUXENT aux;
660: #if FLEXNAMES
661: FILE *string_file;
662: char *sym_name;
663: int name_length;
664: #endif
665:
666:
667: if ((fwdptr = ldaopen(filename, ldptr)) == NULL) {
668: return(ERROR);
669: }
670:
671: if (ldtbseek(ldptr) != SUCCESS) {
672: return(ERROR);
673: }
674:
675: #if FLEXNAMES
676: string_size = 0L;
677: if ((string_file = fopen( tmpnam5, "w" )) == NULL )
678: return( ERROR );
679: #endif
680:
681: count = 0L;
682: #if !AR16WR
683: tail = NULL;
684: #endif
685:
686: for (oldndx = 0L; oldndx < HEADER(ldptr).f_nsyms; ++oldndx)
687: {
688: if (FREAD(&symbol, SYMESZ, 1, ldptr) != 1)
689: {
690: return(ERROR);
691: }
692:
693: if ((symbol.n_sclass == C_EXT) || (symbol.n_sclass == C_STAT) ||
694: (bflag && ((symbol.n_sclass == C_BLOCK) ||
695: (symbol.n_sclass == C_FCN))) ||
696: (symbol.n_sclass == C_HIDDEN) ||
697: (symbol.n_sclass == C_EXTDEF) ||
698: (symbol.n_sclass == C_FILE))
699: {
700: #if AR16WR
701: temp.new = count;
702: temp.old = oldndx;
703: if (fwrite(&temp, TEMPSZ, 1, tempfil) != 1)
704: {
705: fprintf(stderr,"couldn't fwrite to tempfil\n");
706: return(ERROR);
707: }
708: fflush(tempfil);
709: #else
710: temp = getempent( );
711: temp->new = count;
712: temp->old = oldndx;
713: temp->link = NULL;
714: if (tail)
715: tail->link = temp;
716: else
717: basep = temp;
718: tail = temp;
719: #endif
720: ++count;
721:
722: #if FLEXNAMES
723: if (symbol.n_zeroes == 0L)
724: {
725: if ((sym_name = ldgetname( ldptr, &symbol )) == NULL)
726: return( ERROR );
727:
728: name_length = strlen( sym_name ) + 1;
729: if (fwrite( sym_name, name_length, 1, string_file ) != 1)
730: return( ERROR );
731:
732: symbol.n_offset = string_size + 4;
733: string_size += name_length;
734: }
735: #endif
736: if(symbol.n_sclass == C_FILE && symbol.n_value != 0L)
737: {
738: if((symbol.n_value = findndx(symbol.n_value, oldndx, count+symbol.n_numaux)) == ERROR)
739: return(ERROR);
740: }
741:
742: if (fwrite(&symbol, SYMESZ, 1, strp2) != 1)
743: {
744: return(ERROR);
745: }
746:
747: if (symbol.n_numaux == 1)
748: {
749: if (FREAD(&aux, AUXESZ, 1, ldptr) != 1)
750: {
751: return(ERROR);
752: }
753: ++oldndx;
754: ++count;
755:
756: if (ISFCN(symbol.n_type))
757: {
758: if ( !sflag)
759: aux.x_sym.x_fcnary.x_fcn.x_lnnoptr = 0L;
760: #if !UNIX
761: else if ((havelnums == 1) && fflag && (aux.x_sym.x_fcnary.x_fcn.x_lnnoptr != 0))
762: aux.x_sym.x_fcnary.x_fcn.x_lnnoptr -= rel_skipped;
763: #endif
764: }
765:
766: if (ISFCN(symbol.n_type) || (bflag &&
767: (strncmp(symbol.n_name,".bb",3)==0)))
768: {
769: if ((aux.x_sym.x_fcnary.x_fcn.x_endndx =
770: findndx(aux.x_sym.x_fcnary.x_fcn.x_endndx, oldndx, count)) == ERROR)
771: return(ERROR);
772: }
773:
774: if (!sflag && ISARY(symbol.n_type))
775: aux.x_sym.x_misc.x_lnsz.x_lnno = 0;
776:
777: if ((symbol.n_sclass == C_STAT)
778: && (symbol.n_zeroes != 0)
779: && (strncmp(_TEXT, symbol.n_name, 8 ) == 0))
780: {
781: if (!sflag)
782: aux.x_scn.x_nlinno = 0;
783: #if !UNIX
784: if (fflag && (reloc_ptrs[symbol.n_scnum - 1] == 0L))
785: aux.x_scn.x_nreloc = 0L;
786: #endif
787: }
788:
789: if (((symbol.n_type & N_BTMASK) == T_STRUCT) ||
790: ((symbol.n_type & N_BTMASK) == T_UNION) ||
791: ((symbol.n_type & N_BTMASK) == T_ENUM))
792: aux.x_sym.x_tagndx = 0L;
793:
794: if (fwrite(&aux, AUXESZ, 1, strp2) != 1)
795: return(ERROR);
796:
797: }
798:
799: }
800: else /* NOT EXT, STAT, EXTDEF, OR FILE */
801: {
802: if (symbol.n_numaux == 1)
803: {
804: if (FREAD(&aux, AUXESZ, 1, ldptr) != 1)
805: return(ERROR);
806: ++oldndx;
807: }
808: }
809: }
810:
811: #if AR16WR
812: fflush( tempfil );
813: #endif
814: #if FLEXNAMES
815: if (string_size > 0L)
816: {
817: if (string_size & 01)
818: {
819: string_size += 1;
820: putc( '\0', string_file );
821: }
822: string_size += 4;
823: }
824: fclose( string_file );
825: #endif
826:
827: ldaclose(fwdptr);
828: fflush(strp2);
829: return(count);
830: }
831:
832:
833:
834:
835: /* findndx(fwdndx, oldndx, count)
836: *
837: * determines the new index of the symbol that used to be at fwdndx
838: * (the entry after a .ef entry)
839: * simply counts the number of external, static or extdef symbols that
840: * appear between the current entry and the symbol at fwdndx
841: *
842: * returns new index of symbol that used to be at fwdndx if successful
843: * returns ERROR if the symbol table is messed up
844: */
845:
846:
847: long
848: findndx(fwdndx, oldndx, count)
849:
850: register long fwdndx,
851: oldndx,
852: count;
853:
854: {
855: /* COMMON OBJECT FILE ACCESS ROUTINE CALLED */
856: extern int ldtbread( );
857:
858: /* EXTERNAL VARIABLES USED */
859: extern LDFILE *fwdptr;
860: extern int bflag;
861:
862: /* LOCAL VARIABLE */
863: SYMENT symbol;
864:
865:
866: /* fwdndx is the old symbol table index of the entry following a .ef entry
867: * oldndx is the old symbol table index of the last symbol read
868: * count is the new index of the last symbol read
869: * the idea is to increment count for each symbol (up to fwdndx) that
870: * will be written to the stripped symbol table: thus returning the
871: * new symbol table index of the symbol at old fwdndx
872: */
873: while (++oldndx < fwdndx) {
874: if (ldtbread(fwdptr, oldndx, &symbol) != SUCCESS) {
875: return(ERROR);
876: }
877:
878: if ((symbol.n_sclass == C_EXT) || (symbol.n_sclass == C_STAT) ||
879: (symbol.n_sclass == C_HIDDEN) || (symbol.n_sclass == C_EXTDEF) ||
880: (symbol.n_sclass == C_FILE) ||
881: (bflag && ((symbol.n_sclass == C_BLOCK) ||
882: (symbol.n_sclass == C_FCN)))) {
883: ++count;
884: if (symbol.n_numaux == 1) {
885: ++count;
886: ++oldndx;
887: }
888: } else {
889: if (symbol.n_numaux == 1) {
890: ++oldndx;
891: }
892: }
893: }
894:
895: return(count);
896: }
897:
898:
899:
900:
901: /* docopy(size)
902: *
903: * copies size bytes from the original object file (positioned by calling
904: * routine) to the temporary file (positioned by calling routine or by
905: * default)
906: *
907: * docopy simply reads into and out of buffer until copying is done
908: *
909: * returns SUCCESS or FAILURE
910: */
911:
912:
913: int
914: docopy(size)
915:
916: long size;
917:
918: {
919: /* UNIX FUNCTIONS CALLED */
920: extern int fread( ),
921: fwrite( );
922:
923: /* EXTERNAL VARIABLES USED */
924: extern LDFILE *ldptr;
925: extern FILE *strp1;
926:
927: /* LOCAL VARIABLES */
928: short buffer[BSIZE];
929: long index;
930: short remaindr;
931:
932:
933: for (index = size/BSIZE; index > 0; --index) {
934: if (FREAD(buffer, BSIZE, 1, ldptr) != 1) {
935: return(FAILURE);
936: }
937:
938: if (fwrite(buffer, BSIZE, 1, strp1) != 1) {
939: return(FAILURE);
940: }
941: }
942:
943: if ((remaindr = size % BSIZE) != 0) {
944: if (FREAD(buffer, remaindr, 1, ldptr) != 1) {
945: return(FAILURE);
946: }
947:
948: if (fwrite(buffer, remaindr, 1, strp1) != 1) {
949: return(FAILURE);
950: }
951: }
952:
953: fflush(strp1);
954: return(SUCCESS);
955: }
956:
957:
958: /* newreloc(fileaddr)
959: *
960: *
961: * newreloc will copy each relocation entry to the temporary
962: * file and reset the symbol table index to the correct
963: * index of the partially stripped symbol table.
964: * fileaddr will be incremented to point to the spot where the
965: * new symbol table will be. returns this value.
966: *
967: *
968: */
969:
970:
971: long
972: newreloc(fileaddr)
973:
974: long fileaddr;
975:
976: {
977:
978: /* UNIX FUNCTIONS CALLED */
979: extern int fread( ),
980: fwrite( );
981: /* COMMON OBJECT FILE ACCESS ROUTINES CALLED */
982: extern int ldshread( ),
983: ldrseek( );
984:
985: /* STRIP FUNCTIONS CALLED */
986: extern long newndx( );
987:
988: /* EXTERNAL VARIABLES USED */
989: extern LDFILE *ldptr;
990: extern FILE *strp1;
991: #if !UNIX
992: extern int fflag;
993: #endif
994:
995: /* LOCAL VARIABLES */
996: SCNHDR secthead;
997: unsigned short sect;
998: long numreloc;
999: RELOC rloc;
1000:
1001: for (sect = 1; sect <= HEADER(ldptr).f_nscns; ++sect) {
1002: if (ldshread(ldptr, sect, §head) != SUCCESS) {
1003: fprintf(stderr,"Could not read reloc info for sect. %d\n",sect);
1004: return(ERROR);
1005: }
1006:
1007: if (secthead.s_nreloc != 0) {
1008: #if !UNIX
1009: if (fflag && !(secthead.s_flags & STYP_COPY))
1010: continue;
1011: #endif
1012: if (ldrseek(ldptr,sect) != SUCCESS) {
1013: fprintf(stderr,"Could not seek to reloc entries in sect: %d\n",sect);
1014: return(ERROR);
1015: }
1016:
1017: for(numreloc = 0L; numreloc < secthead.s_nreloc; ++numreloc) {
1018: if(FREAD(&rloc, RELSZ, 1,ldptr) != 1) {
1019: fprintf( stderr, "could not read relocation\n" );
1020: return(ERROR);
1021: }
1022:
1023: if((rloc.r_symndx = newndx( rloc.r_symndx )) == ERROR)
1024: return(ERROR);
1025:
1026: if (fwrite(&rloc, RELSZ, 1, strp1) != 1) {
1027: fprintf(stderr,"couldn't fwrite\n");
1028: return(ERROR);
1029: }
1030: } /* inner for loop */
1031:
1032: fileaddr += (long) secthead.s_nreloc * RELSZ;
1033: }
1034: } /* outer for loop */
1035: fflush(strp1);
1036: return(fileaddr);
1037: }
1038:
1039:
1040:
1041: /* newndx(index)
1042: *
1043: *
1044: * newndx accepts as input, a symbol index, gotten from the old
1045: * symbol table in <fileindex>. This symbol name is then compared
1046: * to the symbol indexs from a partially stripped symbol table.
1047: * When a match is found, the index of the symbol is returned, else
1048: * ERROR
1049: *
1050: */
1051:
1052:
1053: long
1054: newndx(rind)
1055:
1056: register long rind;
1057:
1058: {
1059:
1060: /* UNIX FUNCTIONS CALLED */
1061: extern int fseek( );
1062: extern int fread( );
1063:
1064: /* EXTERNAL VARIABLES USED */
1065: #if AR16WR
1066: extern FILE *readtmp;
1067: extern FILE *tempfil;
1068: #else
1069: extern TEMPENT *basep;
1070: #endif
1071: extern FILHDR filehead;
1072:
1073: /* LOCAL VARIABLES */
1074: #if AR16WR
1075: TEMPENT tmp;
1076: register long count;
1077: #else
1078: register TEMPENT *temp;
1079: #endif
1080:
1081: if (rind == -1L)
1082: return(-1L);
1083:
1084: #if AR16WR
1085: count = 0L;
1086: if(fseek(readtmp,0L,0) != 0) {
1087: fprintf(stderr,"Could not seek to beginning of file.\n");
1088: return(ERROR);
1089: }
1090: for(count=0; count < filehead.f_nsyms; ++count) {
1091: if(fread(&tmp, TEMPSZ, 1, readtmp) != 1) {
1092: fprintf(stderr,"Could not read index extry. Index: %ld\n",rind);
1093: return(ERROR);
1094: }
1095: if( rind == tmp.old ) {
1096: return((long) tmp.new);
1097: }
1098: }
1099: #else
1100: for ( temp = basep; temp; temp = temp->link ) {
1101: if (temp->old == rind)
1102: return( (long) temp->new );
1103: }
1104: #endif
1105:
1106: fprintf(stderr,"No index found for relocation entry: %lo\n",rind);
1107: return(ERROR);
1108: }
1109:
1110: #if !AR16WR
1111: /*
1112: * getempent will return an item for a TEMPENT linked list. If necessary,
1113: * malloc() will be called to get space for the item. getempent will
1114: * get space for multiple items whenever it calls malloc();
1115: */
1116:
1117: TEMPENT *
1118: getempent()
1119: {
1120: /* UNIX FUNCTIONS CALLED */
1121: extern char *malloc( );
1122:
1123: /* EXTERNAL VARIABLES USED */
1124: extern TEMPENT *entptr;
1125: extern TEMPENT *oldptr;
1126:
1127: /* VARIABLES DEFINED */
1128: static int nument;
1129:
1130:
1131: if ((oldptr == NULL) || (nument >= MAXTEMPENTS)) {
1132: if ((entptr = (TEMPENT *) malloc( sizeof(TEMPENT) * MAXTEMPENTS )) == NULL) {
1133: fprintf( stderr, "malloc failed, can't reset relocation\n");
1134: exit(1);
1135: }
1136:
1137: entptr->link = oldptr;
1138: oldptr = entptr;
1139: nument = 1;
1140: entptr++;
1141: }
1142: nument++;
1143: return( entptr++ );
1144:
1145: }
1146:
1147: /*
1148: * freetempent() will free up the space used by the TEMPENT list
1149: */
1150:
1151: freetempent( )
1152: {
1153: /* EXTERNAL VARIABLES USED */
1154: extern TEMPENT *oldptr;
1155: extern TEMPENT *entptr;
1156:
1157: for ( ; oldptr; oldptr = oldptr->link ) {
1158: free( oldptr );
1159: }
1160:
1161: oldptr = entptr = NULL;
1162: }
1163: #endif
1164:
1165: /*
1166: * @(#)buildfcns.c 1.16 11/15/83;
1167: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.