#/bin/sh 

#
# Embed SPE ELF executable into PPE object file, and define a
# global pointer variable refering to the embedded file.
#
# Usage: embedspu [flags] symbol_name input_filename output_filename
#
#        input_filename:  SPE ELF executable to be embedded
#        output_filename: Resulting PPE object file
#        symbol_name:     Name of global pointer variable to be defined
#        flags:           GCC flags defining PPE object file format
#                         (e.g. -m32 or -m64)
#

# Argument parsing
SYMBOL=
INFILE=
OUTFILE=
FLAGS=

while [ -n "$1" ]; do
  case $1 in
    -*) FLAGS="${FLAGS} $1"
	shift ;;
    *)  if [ -z $SYMBOL ]; then
	  SYMBOL=$1
	elif [ -z $INFILE ]; then
	  INFILE=$1
	elif [ -z $OUTFILE ]; then
	  OUTFILE=$1
	fi
	shift ;;
  esac
done

if [ -z "$SYMBOL" -o -z "$INFILE" -o -z "$OUTFILE" ]; then
  echo "Usage: $0 [symbol_name] [input_filename] [output_filename]"
  exit 1
fi

# The section name as defined by the SPU ABI
SECTION=.spuelf.${INFILE}

# Build object file holding pointer to embedded section
gcc ${FLAGS} -x c -c -o ${OUTFILE} - <<EOF || exit 1
static char __section__[] __attribute__((section("${SECTION}"), aligned(128))) = { };
void *${SYMBOL} = __section__;
EOF

# Add embedded section contents into object file
objcopy --add-section ${SECTION}=${INFILE} \
        --set-section-flags ${SECTION}=alloc,load,readonly,data,contents \
        --strip-unneeded ${OUTFILE} \
  || rm -f ${OUTFILE}

