Browse Source

Remove my horrible SH hack infavor of this fix for initfini.awk from
Stefan Allius <allius@atecom.com>, which does a better job.

Eric Andersen 22 years ago
parent
commit
88daaa079e
2 changed files with 16 additions and 11 deletions
  1. 16 1
      extra/scripts/initfini.awk
  2. 0 10
      libc/sysdeps/linux/common/initfini.c

+ 16 - 1
extra/scripts/initfini.awk

@@ -12,18 +12,29 @@ BEGIN \
   system("/bin/rm -f crt[in].S");
   omitcrti=0;
   omitcrtn=0;
+  glb_idx = 0;
   while(getline < "initfini.s")
   { if(/\.endp/) {endp=1}
     if(/\.end/) {end=1}
     if(/\.align/) {alignval=$2}
+# here comes some special stuff for the SuperH targets
+# Search for all labels
+    if(/_GLOBAL_OFFSET_TABLE_/) {
+      sub (":","",last);
+      glb_label[glb_idx] = last;
+      glb_idx += 1;
+      glb = $0;
+    }
+    last = $1;
   }
   close("initfini.s");
 }
 
+/^_init:/{omitcrtn=1;if (glb_idx>0) print glb_label[0] ":" glb >> "crti.S";}
+/^_fini:/{omitcrtn=1;if (glb_idx>1) print glb_label[1] ":" glb >> "crti.S";}
 /HEADER_ENDS/{omitcrti=1;omitcrtn=1;getline}
 /PROLOG_BEGINS/{omitcrti=0;omitcrtn=0;getline}
 /i_am_not_a_leaf/{getline}
-/_init:/||/_fini:/{omitcrtn=1}
 /PROLOG_PAUSES/{omitcrti=1;getline}
 /PROLOG_UNPAUSES/{omitcrti=0;getline}
 /PROLOG_ENDS/{omitcrti=1;getline}
@@ -67,6 +78,10 @@ BEGIN \
   { gsub("ALIGN","",$0)
   }
 }
+# substitude all label references of the _GLOBAL_OFFSET_TABLE_
+# .L10  ==> .L10b etc.
+glb_idx>0 { gsub (glb_label[0],sprintf("%sb",glb_label[0]),$0)}
+glb_idx>1 { gsub (glb_label[1],sprintf("%sb",glb_label[1]),$0)}
 
 omitcrti==0 {print >> "crti.S"}
 omitcrtn==0 {print >> "crtn.S"}

+ 0 - 10
libc/sysdeps/linux/common/initfini.c

@@ -109,11 +109,6 @@ void _init (void)
 
   asm ("ALIGN");
   asm("END_INIT");
-#if defined(__sh__)
-  /* This is a horrible hack, but seems to be necessary to
-   * make this work for the Hitachi SH processors */
-  asm ("\n.L5:\n\t.long   _GLOBAL_OFFSET_TABLE_\n");
-#endif
   /* Now the epilog. */
   asm ("\n/*@_init_PROLOG_ENDS*/");
   asm ("\n/*@_init_EPILOG_BEGINS*/");
@@ -134,11 +129,6 @@ void _fini (void)
   /* End of the _fini prolog. */
   asm ("ALIGN");
   asm ("END_FINI");
-#if defined(__sh__)
-  /* This is a horrible hack, but seems to be necessary to
-   * make this work for the Hitachi SH processors */
-  asm ("\n.L10:\n\t.long   _GLOBAL_OFFSET_TABLE_\n");
-#endif
   asm ("\n/*@_fini_PROLOG_ENDS*/");
 
   {