summaryrefslogtreecommitdiff
path: root/rename_Tn_sections.c
diff options
context:
space:
mode:
authorJohn van Groningen2010-12-13 11:02:08 +0000
committerJohn van Groningen2010-12-13 11:02:08 +0000
commit1fdfb7bbb93de952d295d2d375b41387bbf6d2b3 (patch)
treebadb800705c1acd8f521152286a6867834873464 /rename_Tn_sections.c
parentfix garbage collector calls in add_empty_node_3 and more (diff)
put functions in areals.asm in different sections to enable optimizing linking,
these sections are first called _T000, _T001 .. and renamed to .text using rename_Tn_sections.c
Diffstat (limited to 'rename_Tn_sections.c')
-rw-r--r--rename_Tn_sections.c140
1 files changed, 140 insertions, 0 deletions
diff --git a/rename_Tn_sections.c b/rename_Tn_sections.c
new file mode 100644
index 0000000..8b20348
--- /dev/null
+++ b/rename_Tn_sections.c
@@ -0,0 +1,140 @@
+
+#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;
+}