NetBSD/sys/arch/arm/conf/elf2aout.sh
2002-03-05 21:26:11 +00:00

72 lines
1.6 KiB
Bash

#!/bin/sh
# $NetBSD: elf2aout.sh,v 1.4 2002/03/05 21:26:11 thorpej Exp $
#
# Shell script to convert an ARM ELF kernel into a bootable a.out kernel by
# changing the header block on the kernel, and shuffling bits around in the
# file. Care has to be taken with the sections as they need to be page
# aligned.
#
# XXX In a perfect world, objcopy -O a.out-arm-netbsd would work, but
# XXX bugs lurking in BFD prevent it from doing so.
AWKPROG='\
function x(v) { printf "%c%c%c\0", v, v / 256, v / 65536 } \
{ \
printf "\0\217\01\013"; \
x($1); \
x($2); \
x($3); \
printf "\0\0\0\0"; \
printf "\040\0\0\360"; \
printf "\0\0\0\0"; \
printf "\0\0\0\0" \
}'
infile=${1}
outfile=${2}
trap "rm -f ${infile}.text ${infile}.data" 0 1 2 3 15
${OBJCOPY} -O binary -j .text ${infile} ${infile}.text || exit 1
${OBJCOPY} -O binary -j .data ${infile} ${infile}.data || exit 1
set -- `${SIZE} ${infile} | tail +2`
TEXT=$1
DATA=$2
BSS=$3
TALIGN=$(( (($TEXT + 4095) / 4096) * 4096 ))
DALIGN=$(( (($DATA + 4095) / 4096) * 4096 ))
BALIGN=$(( (($BSS + 4095) / 4096) * 4096 ))
TPAD=$(( $TALIGN - $TEXT ))
DPAD=$(( $DALIGN - $DATA ))
BPAD=$(( $BALIGN - $BSS ))
DTMP=$(( $DATA + 32768 - $TPAD ))
DTALIGN=$(( (($DTMP + 4095) /4096) * 4096 ))
TDPAD=32768
DBPAD=$(( $DTALIGN - $DTMP ))
echo TEXT = $TEXT
echo TPAD = $TPAD
echo TDPAD = $TDPAD
echo DATA = $DATA
echo DPAD = $DPAD
echo DBPAD = $DBPAD
(
echo $TALIGN $DTALIGN $BSS | awk "${AWKPROG}"; \
cat ${infile}.text; \
dd if=/dev/zero bs=$TDPAD count=1; \
cat ${infile}.data; \
dd if=/dev/zero bs=$DBPAD count=1 \
) > ${outfile}
${SIZE} ${outfile}
chmod 755 ${outfile}
exit 0