mirror of https://github.com/dzavalishin/oskit/
151 lines
4.9 KiB
Bash
Executable File
151 lines
4.9 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# Copyright (c) 1994-1996, 1998, 1999 University of Utah and the Flux Group.
|
|
# All rights reserved.
|
|
#
|
|
# This file is part of the Flux OSKit. The OSKit is free software, also known
|
|
# as "open source;" you can redistribute it and/or modify it under the terms
|
|
# of the GNU General Public License (GPL), version 2, as published by the Free
|
|
# Software Foundation (FSF). To explore alternate licensing terms, contact
|
|
# the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271.
|
|
#
|
|
# The OSKit is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
# FOR A PARTICULAR PURPOSE. See the GPL for more details. You should have
|
|
# received a copy of the GPL along with the OSKit; see the file COPYING. If
|
|
# not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA.
|
|
#
|
|
|
|
# This little script uses GNU ld to build a BSD/Mach 32-bit boot image
|
|
# from a kernel and a set of boot modules.
|
|
|
|
#
|
|
# Usage: mkbsdimage [options] [files ...]
|
|
#
|
|
# Options:
|
|
# -x filename
|
|
# Use <filename> as the BSD adaptor file instead of the default.
|
|
# -o filename
|
|
# Specify the output <filename> of the resulting BSD/Mach image. The
|
|
# default is "Image" in the current directory.
|
|
# -c 'string'
|
|
# Specify a command line <string> to pass to the kernel when it is
|
|
# invoked.
|
|
# -save-temps
|
|
# Debugging option to save temporary files instead of deleting them
|
|
# after the image is built.
|
|
# -stdin
|
|
# Take file specifications from stdin, in addition to those on the
|
|
# command line. This is useful when using another script to build
|
|
# a list of file specifications which can then be piped into this
|
|
# script.
|
|
# [files ...]
|
|
# A list of file specifications in the format pathname1:pathname2,
|
|
# where pathname1 is the name of a local module which is placed in the
|
|
# boot image. If :pathname2 is provided, it specifies the name to give
|
|
# the module in the image. If :pathname2 is omitted, it defaults to
|
|
# pathname1.
|
|
#
|
|
# The first file specification is typically the name of the Oskit kernel.
|
|
#
|
|
|
|
bootdir=${BOOTDIR-@prefix@/lib/boot}
|
|
bb=$bootdir/bsdboot.o
|
|
cc=${CC-@CC@}
|
|
ld=${LD-@LD@}
|
|
aoutld=${AOUT_LD-@AOUT_LD@}
|
|
|
|
modules=
|
|
outfile=Image
|
|
savetemps=
|
|
ldopts="-Ttext 100000 -n -X -T $bootdir/ldscript.elf2mach"
|
|
cmdlinefile="bootadapter_cmdline"
|
|
|
|
|
|
if [ $# -eq 0 ]; then
|
|
echo "Usage: `basename $0` [option | filename]" 1>&2
|
|
exit
|
|
fi
|
|
|
|
# Parse the command-line options.
|
|
until [ $# -eq 0 ]
|
|
do
|
|
case "$1" in
|
|
-x ) bb="$2"; shift; shift;;
|
|
-o ) outfile="$2"; shift; shift;;
|
|
-c ) cmdline="$2"; shift; shift;;
|
|
-stdin) fromstdin="yes"; shift;;
|
|
-save-temps) savetemps="$1"; shift;;
|
|
* ) modules="$modules $1"; shift;;
|
|
esac
|
|
done
|
|
|
|
#
|
|
# Read the rest of the modules from stdin.
|
|
#
|
|
if [ "X${fromstdin}" != "X" ]; then
|
|
read mod
|
|
while [ "X${mod}" != "X" ];
|
|
do
|
|
modules="$modules $mod"
|
|
read mod
|
|
done
|
|
fi
|
|
|
|
# Stick the command line bootmod into the image file.
|
|
if [ "X${cmdline}" != "X" ]; then
|
|
echo ${cmdline} > ${outfile}.bsdcmdline
|
|
modules="$modules ${outfile}.bsdcmdline:${cmdlinefile}"
|
|
fi
|
|
|
|
|
|
# Wrap each of the input files in a .o file.
|
|
# At the same time, build an assembly language module
|
|
# containing a table describing the boot modules.
|
|
echo >$outfile.mods.S ".data; .globl boot_modules,_boot_modules; boot_modules:; _boot_modules:"
|
|
files=
|
|
for module in $modules; do
|
|
# Split out the associated string, if any.
|
|
file=`echo $module | sed -e 's,:.*$,,'`
|
|
string=`echo $module | sed -e 's,^[^:]*:,,'`
|
|
if test -z "$string"; then string=$file; fi
|
|
|
|
# Add this file to the list of files to be included,
|
|
# but only if it hasn't already been seen before
|
|
# (e.g., with a different attached string).
|
|
alreadythere=
|
|
for afile in $files; do
|
|
if [ $file = $afile ]; then alreadythere=yes; fi
|
|
done
|
|
if [ -z $alreadythere ]; then files="$files $file"; fi
|
|
|
|
# Convert all non-alphanum chars to underscores for the symbol name.
|
|
# The BFD binary input format will do the same thing
|
|
# to produce the symbol names that it "wraps around" the input files.
|
|
sym_name=`echo $file | sed -e 's,[^a-zA-Z0-9],_,g'`
|
|
|
|
# Produce an entry in the module description file.
|
|
echo >>$outfile.mods.S ".long _binary_$sym_name""_start"
|
|
echo >>$outfile.mods.S ".long _binary_$sym_name""_end"
|
|
echo >>$outfile.mods.S ".long 1f"
|
|
echo >>$outfile.mods.S ".data 2"
|
|
echo >>$outfile.mods.S "1: .ascii \"$string\\0\""
|
|
echo >>$outfile.mods.S ".data"
|
|
done
|
|
echo >>$outfile.mods.S ".long 0; .data; .align 4"
|
|
|
|
# Assemble the module vector file.
|
|
$cc -c -o $outfile.mods.o $outfile.mods.S || exit 1
|
|
|
|
# Link the BSD boot file and the module vector file with the boot module files.
|
|
# Use the binary bfd backend for the input bmod files.
|
|
$aoutld $ldopts -o $outfile $bb $outfile.mods.o \
|
|
-format binary $files -format default \
|
|
|| exit 1
|
|
|
|
if test -z "$savetemps"; then
|
|
rm -f $outfile.mods.S $outfile.mods.o ${outfile}.bsdcmdline
|
|
fi
|
|
|
|
exit 0
|