diff options
Diffstat (limited to 'extra/scripts')
-rwxr-xr-x | extra/scripts/initfini.awk | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/extra/scripts/initfini.awk b/extra/scripts/initfini.awk index 1924da9a5..c70fb8cd4 100755 --- a/extra/scripts/initfini.awk +++ b/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"} |