diff options
Diffstat (limited to 'extra/scripts/initfini.awk')
-rwxr-xr-x | extra/scripts/initfini.awk | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/extra/scripts/initfini.awk b/extra/scripts/initfini.awk new file mode 100755 index 000000000..1924da9a5 --- /dev/null +++ b/extra/scripts/initfini.awk @@ -0,0 +1,77 @@ +#! /usr/bin/awk -f +# Contributed by Christian MICHON <christian_michon@yahoo.fr> to +# eliminate the compile time dependancy on perl introduced by +# Erik's older initfini.pl +# vim:ai:sw=2: + +BEGIN \ +{ alignval=""; + endp=0; + end=0; + system("/bin/touch crt[in].S"); + system("/bin/rm -f crt[in].S"); + omitcrti=0; + omitcrtn=0; + while(getline < "initfini.s") + { if(/\.endp/) {endp=1} + if(/\.end/) {end=1} + if(/\.align/) {alignval=$2} + } + close("initfini.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} +/EPILOG_BEGINS/{omitcrtn=0;getline} +/EPILOG_ENDS/{omitcrtn=1;getline} +/TRAILER_BEGINS/{omitcrti=0;omitcrtn=0;getline} + +/END_INIT/ \ +{ if(endp) + { gsub("END_INIT",".endp _init",$0) + } + else + { if(end) + { gsub("END_INIT",".end _init",$0) + } + else + { gsub("END_INIT","",$0) + } + } +} + +/END_FINI/ \ +{ if(endp) + { gsub("END_FINI",".endp _fini",$0) + } + else + { if(end) + { gsub("END_FINI",".end _fini",$0) + } + else + { gsub("END_FINI","",$0) + } + } +} + +/ALIGN/ \ +{ if(alignval!="") + { gsub("ALIGN",sprintf(".align %s",alignval),$0) + } + else + { gsub("ALIGN","",$0) + } +} + +omitcrti==0 {print >> "crti.S"} +omitcrtn==0 {print >> "crtn.S"} + +END \ +{ close("crti.S"); + close("crtn.S"); +} |