#!/bin/bash

[ -z "$1" ] && {
    echo "Need file for encapsulation in object file" 1>&2
    exit 1
}

opt=;arg=
while test "${1::1}" = "-" ; do
    if test ${#1} -gt 2 -o "${2::1}" = "-" ; then
        opt="$1"  ; shift
    else
        opt="$1$2"; shift 2
    fi
    arg="${opt:2}"
    opt="${opt:1:1}"
    arg="${arg%% }"
    case "$opt" in
    n) name="$arg" ;;
    h) head="$arg" ;;
    esac
done

fname=$1
shift
args="$@"

if test -z "$name" ; then
   name=${fname%%.*}
   name=${name%_*}
fi
echo $head
if test -z "$file" ; then
   file=${name}.o
fi
if test -z "$head" ; then
   head=${file%%.o}.h
fi

tmpfile=${fname}piggy.gz
tmplink=${fname}piggy.lnk
trap "rm -rf $tmpfile $tmplink" 0 1 2 3 5 9 10 13 15

arch=$(uname -m)
case $arch in
 alpha)
	ld_m=elf64alpha
	ld_b=elf64-alpha
	;;
 parisc)
	ld_m=hppalinux
	ld_b=elf32-hppa-linux
	;;
 ppc)
	ld_m=elf32ppc
	ld_b=elf32-powerpc
	;;
 ppc64)
	ld_m=elf64ppc
	ld_b=elf64-powerpc
	;;
 sparc)
	ld_m=elf32_sparc
	ld_b=elf32-sparc
	;;
 sparc64)
	ld_m=elf64_sparc
	ld_b=elf64-sparc
	;;
 ia64)
	ld_m=elf64_ia64
	ld_b=elf64-ia64-little
	;;
 s390)
	ld_m=elf_s390
	ld_b=elf32-s390
	;;
 s390x)
	ld_m=elf64_s390
	ld_b=elf64-s390
	;;
 x86_64)
	ld_m=elf_x86_64
	ld_b=elf64-x86-64
	;;
 *)
	set -- $(objdump -f /usr/bin/objdump | grep format)
	eval ld_b=\${$#}
	set -- $(ld -V | grep elf)
	ld_m=${1}
	;;
esac

gzip -9 -f -n -q < $fname > $tmpfile

if type encaps > /dev/null 2>&1 ; then
    encaps -t $ld_b ${file} $tmpfile ${name}_data ${name}_len
else
    echo \
        "SECTIONS { .data : ALIGN(8) \
	    { \
		${name}_len = .; \
		LONG(${name}_data_end - ${name}_data) ${name}_data = .; \
		*(.data) ${name}_data_end = .; \
 	    } \
	} " > $tmplink
    ld -z noexecstack -no-warn-mismatch -m $ld_m -r -o ${file} ${obj} -b binary $tmpfile -b $ld_b -T $tmplink
fi

echo $head
if ! test -s "${head}" ; then
    echo "/* Description of encapsulated file $fname */" > ${head}
else
    echo "/* Description of encapsulated file $fname */" >> ${head}
fi
echo "extern char  ${name}_data[];" >> ${head}
echo "extern int   ${name}_len;"  >> ${head}

if test -n "$args" ; then
    echo "$args" >> ${head}
fi

echo "Done"
