#!/bin/sh # flatgcc -- Run gcc, and produce a flat executable instead of an ELF one # # Written by Miles Bader # # Also produces an elf executable under the same name with an `.elf' suffix # # In addition to normal gcc options/arguments, this script accepts: # -T SCRIPT Override the linker script we use # -z Produced a compressed flat file (from elf2flt) # -s SIZE Set size of stack in flat file to SIZE (from elf2flt) # # Architecture to use (only used to construct default compiler name) ARCH="${ARCH-microblaze}" # Compiler that this wrapper invokes FLATGCC_CC="${FLATGCC_CC-${ARCH}-uclibc-gcc}" # Program to convert an elf executable to `flat' format ELF2FLT="${ELF2FLT-elf2flt} -a" # Linker script we use to produce output suitable for elf2flt. # Overridden by -T arg(s). ELF2FLT_LINKER_SCRIPT="${ELF2FLT_LINKER_SCRIPT-elf2flt.ld}" # Tell the linker to keep relocation entries in the final executable; # elf2flt uses them (this particular usage is specific to the v850; it # may or may not work for other platforms). Requires a non-ancient `ld'. EXTRA_LDOPTS="-Wl,-q" me="`basename $0`" if test x"$me" = x"$0"; then binpfx="" else binpfx="`dirname $0`" fi # Re-parse args. We add single quotes around anything we don't know the # format of when we add it to $args, and use the `eval' command below to # unquote everything; this correctly preserves arguments containing spaces and # most shell meta-characters (it will fail on arguments containing single # quotes, but oh well). Note that we use `shift; shift' instead of `shift 2' # because it works when there's a missing argument. args="" link=yes while :; do case "$1" in -[EcS]|-M*|-dump*|-print-*|--dump*|--print-*) link=no; args="$args $1"; shift;; -o) dst="$2"; args="$args $1 \"\$dst\""; shift; shift;; -x|-include|-imacros|-idirafter|-iprefix|-iwithprefix|-iwithwithprefixbefore|-isystem|-Xlinker|-u|-b|-V) args="$args $1 '$2'"; shift; shift;; -z) ELF2FLT="$ELF2FLT $1"; shift;; -s) ELF2FLT="$ELF2FLT $1 $2"; shift; shift;; -T) EXTRA_LDOPTS="$EXTRA_LDOPTS '-Wl,-T$2'"; unset ELF2FLT_LINKER_SCRIPT; shift; shift;; -T*) EXTRA_LDOPTS="$EXTRA_LDOPTS '-Wl,$1'"; unset ELF2FLT_LINKER_SCRIPT; shift;; "") break;; *) args="$args '$1'"; shift;; esac done if test "$link" = yes; then # Run normal compiler, and then elf2flt if test x"$dst" = x; then dst="a.out" args="-o \"\$dst\" $args" fi realdst="$dst" dst="$dst.elf" test "$ELF2FLT_LINKER_SCRIPT" && EXTRA_LDOPTS="$EXTRA_LDOPTS \"-Wl,-T$ELF2FLT_LINKER_SCRIPT\"" eval "$FLATGCC_CC $EXTRA_LDOPTS $args" && $ELF2FLT -o "$realdst" "$dst" else # Not linking, so just run compiler eval "$FLATGCC_CC $args" fi