#!/bin/sh
#
#
#
g_sz ()
{
      sed "s/^[[:space:]]*[0-9]*[[:space:]]*//" \
    | sed "s/\.[^[:space:]]*[[:space:]]*//" \
    | sed "s/\([0-9a-z]*\)[[:space:]].*$/\1/"
}
#
g_vma ()
{
      sed "s/^[[:space:]]*[0-9]*[[:space:]]*//" \
    | sed "s/\.[^[:space:]]*[[:space:]]*//" \
    | sed "s/[0-9a-f]*[[:space:]]*//" \
    | sed "s/\([0-9a-z]*\)[[:space:]].*$/\1/"
}
#
g_st ()
{
      sed "s/^[[:space:]]*[0-9]*[[:space:]]*//" \
    | sed "s/\.[^[:space:]]*[[:space:]]*//" \
    | sed "s/[0-9a-f]*[[:space:]]*//" \
    | sed "s/[0-9a-f]*[[:space:]]*//" \
    | sed "s/[0-9a-f]*[[:space:]]*//" \
    | sed "s/\([0-9a-z]*\)[[:space:]].*$/\1/"
}
#
FILE_ELF="$1"
FILE_OS32="$2"
#
if [ -e "$FILE_ELF" ]
then
    true
else
    exit
fi
#
T_ST=`objdump -h $FILE_ELF | grep -F ".text" | g_st`
T_VM=`objdump -h $FILE_ELF | grep -F ".text" | g_vma`
T_SZ=`objdump -h $FILE_ELF | grep -F ".text" | g_sz`
#
R_ST=`objdump -h $FILE_ELF | grep -F ".rodata" | g_st`
R_VM=`objdump -h $FILE_ELF | grep -F ".rodata" | g_vma`
R_SZ=`objdump -h $FILE_ELF | grep -F ".rodata" | g_sz`
#
D_ST=`objdump -h $FILE_ELF | grep -F ".data" | g_st`
D_VM=`objdump -h $FILE_ELF | grep -F ".data" | g_vma`
D_SZ=`objdump -h $FILE_ELF | grep -F ".data" | g_sz`
#
# Convert to decimal
#
T_ST=`printf "%i" 0x$T_ST`
T_VM=`printf "%i" 0x$T_VM`
T_SZ=`printf "%i" 0x$T_SZ`
#
R_ST=`printf "%i" 0x$R_ST`
R_VM=`printf "%i" 0x$R_VM`
R_SZ=`printf "%i" 0x$R_SZ`
#
D_ST=`printf "%i" 0x$D_ST`
D_VM=`printf "%i" 0x$D_VM`
D_SZ=`printf "%i" 0x$D_SZ`


if [ "$R_SZ" = "$D_VM" ]
then
    dd if=$FILE_ELF of=$FILE_OS32.text \
       bs=1 skip=$T_ST count=$T_SZ 2> "/dev/null"
    dd if=$FILE_ELF of=$FILE_OS32.rodata \
       bs=1 skip=$R_ST count=$R_SZ 2> "/dev/null"
    dd if=$FILE_ELF of=$FILE_OS32.data \
       bs=1 skip=$D_ST count=$D_SZ 2> "/dev/null"
    cat $FILE_OS32.text $FILE_OS32.rodata  \
        $FILE_OS32.data > $FILE_OS32
    #
    #rm $FILE_OS32.text
    #rm $FILE_OS32.rodata
    #rm $FILE_OS32.data
    #
    chmod a+x $FILE_OS32
elif [ "$R_SZ" -lt "$D_VM" ]
then
    dd if=$FILE_ELF of=$FILE_OS32.text \
       bs=1 skip=$T_ST count=$T_SZ 2> "/dev/null"
    dd if=$FILE_ELF of=$FILE_OS32.rodata \
       bs=1 skip=$R_ST count=$R_SZ 2> "/dev/null"
    dd if=/dev/zero of=$FILE_OS32.rodata-space \
       bs=1 count=$(($D_VM-$R_SZ)) 2> "/dev/null"
    dd if=$FILE_ELF of=$FILE_OS32.data \
       bs=1 skip=$D_ST count=$D_SZ 2> "/dev/null"

    cat $FILE_OS32.text \
        $FILE_OS32.rodata \
        $FILE_OS32.rodata-space \
        $FILE_OS32.data > $FILE_OS32
    #
    #rm $FILE_OS32.text
    #rm $FILE_OS32.rodata
    #rm $FILE_OS32.rodata-space
    #rm $FILE_OS32.data
    #
    chmod a+x $FILE_OS32
else
    echo "[$0] ERROR: $FILE_ELF has DATA section"
    echo "[$0]        not contiguous:"
    echo "[$0]        RODATA end at $R_SZ, and DATA"
    echo "[$0]        should start at $D_VM!"
fi
