#include <stdio.h> int main (int argc,char **argv) { FILE *fs,*fd; char header[20]; int f_nscns,f_nsyms,f_opthdr,f_symptr; int section_n,symbol_n,offset; if (argc!=3){ printf ("usage: rename_Tn_sections source_object_file destination_object_file\n"); return 1; } fs=fopen (argv[1],"rb"); if (fs==NULL){ printf ("opening file %s failed\n",argv[1]); return 1; } fd=fopen (argv[2],"wb"); if (fd==NULL){ printf ("creating file %s failed\n",argv[2]); return 1; } fread (header,1,20,fs); fwrite (header,1,20,fd); f_nscns = *(short *)&header[2]; f_nsyms = *(int*)&header[12]; f_opthdr = *(short*)&header[16]; f_symptr = *(int*)&header[8]; /* printf ("number of sections = %d\n",f_nscns); printf ("number of symbols = %d\n",f_nsyms); printf ("symbol table offset = %d\n",f_symptr); printf ("opthdr = %d\n",f_opthdr); */ for (section_n=0; section_n<f_nscns; ++section_n){ char section_header[40]; fread (section_header,1,40,fs); /* printf ("%s\n",section_header); */ if (section_header[0]=='_' && section_header[1]=='T' && (unsigned)(section_header[2]-'0') < 10u && (unsigned)(section_header[3]-'0') < 10u && (unsigned)(section_header[4]-'0') < 10u && section_header[5]=='\0') { section_header[0]='.'; section_header[1]='t'; section_header[2]='e'; section_header[3]='x'; section_header[4]='t'; } fwrite (section_header,1,40,fd); } offset = 20 + 40*f_nscns; while (offset<f_symptr){ int c; c=fgetc (fs); fputc (c,fd); ++offset; } // fseek (fs,f_symptr,SEEK_SET); for (symbol_n=0; symbol_n<f_nsyms; ++symbol_n){ char symbol[18]; int n_numaux,n_scnum; fread (symbol,1,18,fs); n_numaux = *(unsigned char*)&symbol[17]; n_scnum = *(short*)&symbol[12]; if (symbol[16]==3 && n_numaux!=0 && n_scnum!=-1){ if (*(int*)&symbol[0]!=0){ int n; for (n=0; n<8; ++n){ if (symbol[n]=='\0') break; /* printf ("%c",symbol[n]); */ } if (symbol[0]=='_' && symbol[1]=='T' && (unsigned)(symbol[2]-'0') < 10u && (unsigned)(symbol[3]-'0') < 10u && (unsigned)(symbol[4]-'0') < 10u && symbol[5]=='\0') { symbol[0]='.'; symbol[1]='t'; symbol[2]='e'; symbol[3]='x'; symbol[4]='t'; } /* printf ("\n"); */ } else /* printf ("?\n")*/ ; } fwrite (symbol,1,18,fd); while (n_numaux>0){ fread (symbol,1,18,fs); fwrite (symbol,1,18,fd); --n_numaux; ++symbol_n; } } for (;;){ int c; c=fgetc (fs); if (c==EOF) break; fputc (c,fd); } fclose (fs); fclose (fd); return 0; }