Damn,

forgot to attach the files, here they are.

Friendly,

Sven Luther
#!/bin/sh

# usage information
usage() {
    echo 'usage:'
    echo ' -o <output>  - path to output file for compressed kernel image'
    echo ' -a <arch>    - PowerPC sub-architecture'
    echo ' -k <kernel>  - path to kernel image file in ELF format'
    echo ' -s <sysmap>  - path to System.map file'
    echo ' -i <initrd>  - path to initrd image file in uncompressed format'
    echo ' -d <objdir>  - path to directory with additional object files'
    echo ' -r <release> - kernel release number'
    echo ' -z           - assume the initrd image file is already compressed'
    echo ' -q           - quiet operation (do not indicate progress)'
    echo ' -v           - verbose operation (print commands)'

    exit 0
}

# echo a shell command if desired, and execute it
do_cmd() {
    test -z "$verbose" || echo $@; eval $@
    return
}

# parse command line
while getopts o:k:s:i:d:r:a:zqv option; do
    case "$option" in
        o) output=$OPTARG ;;
        k) kernel=$OPTARG ;;
        s) sysmap=$OPTARG ;;
        i) initrd=$OPTARG ;;
        d) objdir=$OPTARG ;;
        r) release=$OPTARG ;;
        a) arch=$OPTARG ;;
        z) compressed="Yes" ;;
        q) quiet="Yes" ;;
        v) verbose="Yes" ;;
        *) usage; exit 0 ;;
    esac
done

# use non-option arguments as release version and kernel image file if needed
shift $((OPTIND-1))
if test -z "$release" -a -n "$1"; then
    release=$1
fi
if test -z "$kernel" -a -n "$2"; then
    kernel=$2
fi

# if no sub-architecture was specified, read it from /proc
if test -z "$arch"; then
    case $(grep ^machine /proc/cpuinfo) in
        *PReP*) arch=prep ;;
        *CHRP*) arch=chrp ;;
        *Amiga) arch=amiga ;;
        *iSeries) arch=iseries ;;
        *)
            case $(grep ^pmac-generation /proc/cpuinfo) in
                *NewWorld) arch=newworld ;;
                *OldWorld) arch=coff ;;
            esac
            ;;
    esac
fi

test -n "$quiet" || echo === Building for sub-architecture $arch.

# if no kernel was specified, try to find one
if test -z "$kernel"; then

    # guess the location of a kernel
    if kernel=/boot/vmlinux-$release; test -n "$release" -a -r $kernel; then
        :
    elif kernel=/vmlinux; test -r $kernel; then
        :
    elif kernel=/boot/vmlinux; test -r $kernel; then
        :
    elif kernel=/boot/vmlinux-$(uname -r); test -r $kernel; then
        :
    else
        kernel=""
    fi

    # we couldn't find a kernel, and therefore give up
    if test -z "$kernel"; then
        echo Could not find a kernel image file, please specify one.
        exit 1
    fi

    # sanitize the location of the kernel
    kernel=$(readlink -f $kernel)

fi

test -n "$quiet" || echo === Using kernel image file $kernel.

# if no initrd was specified, try to find one that goes with the kernel
if test -z "$initrd"; then

    # guess the location of an initrd, but don't try too hard
    if initrd=${kernel/vmlinux/initrd.img}; test -r $initrd; then
        :
    else
        initrd=""
    fi

    # sanitize the location of the initrd
    if test -n "$initrd"; then
        initrd=$(readlink -f $initrd)
    fi

fi

test -n "$quiet" -a -n "$initrd" || echo === Using initrd image file $initrd.

# if no release was specified, extract it from the kernel image name
if test -z "$release"; then
    release=$(echo $kernel | sed s/.*vmlinux-//)
    if echo $release | grep -q '2\.[46]\.[0-9]*'; then
        :
    else
        release=""
    fi
fi

test -n "$quiet" || echo === Release version seems to be $release.

# if no object file directory was specified, try to find one
if test -z "$objdir"; then

    # try a default location first, then use the current directory
    if objdir=/usr/lib/kernel-image-$release; test -d $objdir; then
        :
    else
        objdir=$PWD
    fi
fi

test -n "$quiet" || echo === Using object files from $objdir.

# if no output file was specified, source the configuration file
if test -z "$output" -a -r /etc/mkvmlinuz/output; then
    . /etc/mkvmlinuz/output
fi

# we absolutely need an output file, and won't attempt guesses
if test -z "$output"; then
    echo Please specify an output file.
    exit 1
fi

test -n "$quiet" || echo === Building a bootable compressed kernel image in 
$output.

# create a work directory
work=$(mktemp -d)

test -n "$quiet" || echo === Doing build in $work.

# utilities
ADDNOTE=$objdir/utils/addnote
HACKOFF=$objdir/utils/hack-coff
MKNOTE=$objdir/utils/mknote
MKPREP=$objdir/utils/mkprep
MKBUGBOOT=$objdir/utils/mkbugboot
LD=ld
OBJCOPY=objcopy

GZIP="--force --best"

# libraries and common object files
libs=$objdir/lib
of_objs=$objdir/obj/openfirmware
simple_objs=$objdir/obj/simple
OBJS="$of_objs/start.o $of_objs/misc.o $of_objs/common.o $of_objs/${arch}main.o"
SIMPLE_OBJS="$simple_objs/head.o $simple_objs/relocate.o $simple_objs/legacy.o 
$simple_objs/misc.o $simple_objs/misc-prep.o $simple_objs/mpc10x_memory.o"
case $arch in
    prep)
        dummy=$objdir/obj/simple/dummy.o
        OBJCOPY_ARGS="-O elf32-powerpc"
        LIBS="$libs/common.a $libs/ppc.a $libs/of.a"
    ;;
    coff|inewworld|chrp)
        dummy=$objdir/obj/openfirmware/dummy.o
        LIBS="$libs/lib.a $libs/ppc.a $libs/of.a $libs/common.a"
    ;;
esac

# off we go...

# create the compressed kernel image file
test -n "$quiet" || echo === Creating compressed kernel image vmlinux.gz...
do_cmd $OBJCOPY -O binary $kernel $work/vmlinux
do_cmd gzip $work/vmlinux

# create the compressed initrd image file
if test -n "$initrd"; then
    test -n "$quiet" || echo === Creating compressed initrd image initrd.gz...
    if test -n "$compressed"; then
        do_cmd cp -p $initrd $work/initrd.gz
    else
        do_cmd cp -p $initrd $work/initrd
        do_cmd gzip $work/initrd
    fi
fi

# create the raw ELF image file
test -n "$quiet" || echo === Putting everything into ELF image file image.o...
do_cmd $OBJCOPY $OBJCOPY_ARGS -R .comment $dummy $work/image.o
do_cmd $OBJCOPY $OBJCOPY_ARGS $work/image.o $work/image.o \
    --add-section=.image=$work/vmlinux.gz \
    --set-section-flags=.image=contents,alloc,load,readonly,data
if test -n "$sysmap"; then
    do_cmd $OBJCOPY $OBJCOPY_ARGS $work/image.o $work/image.o \
        --add-section=.sysmap=$sysmap \
        --set-section-flags=.sysmap=contents,alloc,load,readonly,data
fi
if test -n "$initrd"; then
    do_cmd $OBJCOPY $OBJCOPY_ARGS $work/image.o $work/image.o \
        --add-section=.ramdisk=$work/initrd.gz \
        --set-section-flags=.ramdisk=contents,alloc,load,readonly,data
fi

# link everything into the final image file and make it bootable
vmlinuz=$work/vmlinuz.$arch
LD_ARGS="-T $objdir/boot/ld.script"
OF_LD_ARGS="$LD_ARGS -e _start"
OBJCOPY_ARGS="$OBJCOPY_ARGS -R .comment"
test -n "$quiet" || echo === Creating bootable kernel image file 
vmlinuz.$arch...
case $arch in
    chrp)
        LD_ARGS="$OF_LD_ARGS -Ttext 0x00800000"
        do_cmd $LD -o $vmlinuz $LD_ARGS $of_objs/crt0.o $OBJS $work/image.o 
$LIBS
        do_cmd $OBJCOPY $OBJCOPY_ARGS $vmlinuz $vmlinuz
        do_cmd cp -p $objdir/boot/note $work
        do_cmd $ADDNOTE $vmlinuz
        ;;
    coff)
        LD_ARGS="$OF_LD_ARGS -Ttext 0x00500000 -Bstatic"
        OBJCOPY_ARGS="-O aixcoff-rs6000 -R .stab -R .stabstr $OBJCOPY_ARGS"
        do_cmd $LD -o $vmlinuz $LD_ARGS $of_objs/coffcrt0.o $OBJS $work/image.o 
$LIBS
        do_cmd $OBJCOPY $OBJCOPY_ARGS $vmlinuz $vmlinuz
        do_cmd $HACKOFF $vmlinuz
        ;;
    newworld)
        LD_ARGS="$OF_LD_ARGS -Ttext 0x01000000"
        OBJCOPY_ARGS="--add-section=.note=$work/note $OBJCOPY_ARGS"
        do_cmd $LD -o $vmlinuz $LD_ARGS $of_objs/crt0.o $OBJS $LIBS 
$work/image.o
        do_cmd $MKNOTE > $work/note
        do_cmd $OBJCOPY $OBJCOPY_ARGS $vmlinuz $vmlinuz
        ;;
    prep)
        # TODO: 0x00800000 should be configurable (set by CONFIG_BOOT_LOADER)
        LD_ARGS="$LD_ARGS -Ttext 0x00800000 -Bstatic"
        OBJCOPY_ARGS="$OBJCOPY_ARGS -R .stab -R .stabstr -R .sysmap"
        do_cmd $LD -o $vmlinuz $LD_ARGS $SIMPLE_OBJS $work/image.o $LIBS
        do_cmd $OBJCOPY $OBJCOPY_ARGS $vmlinuz $vmlinuz
        # TODO: Do we really need MKBUGBOOT ?
        do_cmd $MKBUGBOOT $vmlinuz $vmlinuz.bugboot
        do_cmd $MKPREP -pbp $vmlinuz $vmlinuz
        ;;
    *)
        echo Sorry, I do not know how to handle PowerPC sub-architecture $arch.
esac

# move bootable kernel image to its final location
if test -e $vmlinuz; then
    test -n "$quiet" || echo === Moving bootable kernel image file to $output...
    if test -e $output; then
        echo Output file $output exists, attempting to back it up...
        mv $output $output.old 2> /dev/null
    fi
    cat $vmlinuz > $output
fi

# clean up
test -n "$quiet" || echo === Cleaning up...
rm -rf $work
--- mkvmlinuz-6 2004-07-07 11:25:08.000000000 +0200
+++ mkvmlinuz   2004-07-08 13:56:34.898137576 +0200
@@ -162,6 +162,8 @@
 ADDNOTE=$objdir/utils/addnote
 HACKOFF=$objdir/utils/hack-coff
 MKNOTE=$objdir/utils/mknote
+MKPREP=$objdir/utils/mkprep
+MKBUGBOOT=$objdir/utils/mkbugboot
 LD=ld
 OBJCOPY=objcopy
 
@@ -169,9 +171,21 @@
 
 # libraries and common object files
 libs=$objdir/lib
-LIBS="$libs/lib.a $libs/ppc.a $libs/of.a $libs/common.a"
-objs=$objdir/obj
-OBJS="$objs/start.o $objs/misc.o $objs/common.o $objs/${arch}main.o"
+of_objs=$objdir/obj/openfirmware
+simple_objs=$objdir/obj/simple
+OBJS="$of_objs/start.o $of_objs/misc.o $of_objs/common.o 
$of_objs/${arch}main.o"
+SIMPLE_OBJS="$simple_objs/head.o $simple_objs/relocate.o $simple_objs/legacy.o 
$simple_objs/misc.o $simple_objs/misc-prep.o $simple_objs/mpc10x_memory.o"
+case $arch in
+    prep)
+       dummy=$objdir/obj/simple/dummy.o
+       OBJCOPY_ARGS="-O elf32-powerpc"
+       LIBS="$libs/common.a $libs/ppc.a $libs/of.a"
+    ;;
+    coff|inewworld|chrp)
+       dummy=$objdir/obj/openfirmware/dummy.o
+       LIBS="$libs/lib.a $libs/ppc.a $libs/of.a $libs/common.a"
+    ;;
+esac
 
 # off we go...
 
@@ -193,49 +207,59 @@
 
 # create the raw ELF image file
 test -n "$quiet" || echo === Putting everything into ELF image file image.o...
-do_cmd $OBJCOPY -R .comment $objdir/obj/dummy.o $work/image.o
-do_cmd $OBJCOPY $work/image.o $work/image.o \
+do_cmd $OBJCOPY $OBJCOPY_ARGS -R .comment $dummy $work/image.o
+do_cmd $OBJCOPY $OBJCOPY_ARGS $work/image.o $work/image.o \
     --add-section=.image=$work/vmlinux.gz \
     --set-section-flags=.image=contents,alloc,load,readonly,data
 if test -n "$sysmap"; then
-    do_cmd $OBJCOPY $work/image.o $work/image.o \
+    do_cmd $OBJCOPY $OBJCOPY_ARGS $work/image.o $work/image.o \
        --add-section=.sysmap=$sysmap \
        --set-section-flags=.sysmap=contents,alloc,load,readonly,data
 fi
 if test -n "$initrd"; then
-    do_cmd $OBJCOPY $work/image.o $work/image.o \
+    do_cmd $OBJCOPY $OBJCOPY_ARGS $work/image.o $work/image.o \
        --add-section=.ramdisk=$work/initrd.gz \
        --set-section-flags=.ramdisk=contents,alloc,load,readonly,data
 fi
 
 # link everything into the final image file and make it bootable
 vmlinuz=$work/vmlinuz.$arch
-LD_ARGS="-T $objdir/boot/ld.script -e _start"
-OBJCOPY_ARGS="-R .comment"
+LD_ARGS="-T $objdir/boot/ld.script"
+OF_LD_ARGS="$LD_ARGS -e _start"
+OBJCOPY_ARGS="$OBJCOPY_ARGS -R .comment"
 test -n "$quiet" || echo === Creating bootable kernel image file 
vmlinuz.$arch...
 case $arch in
     chrp)
-       LD_ARGS="$LD_ARGS -Ttext 0x00800000"
-       do_cmd $LD -o $vmlinuz $LD_ARGS $objs/crt0.o $OBJS $work/image.o $LIBS
+       LD_ARGS="$OF_LD_ARGS -Ttext 0x00800000"
+       do_cmd $LD -o $vmlinuz $LD_ARGS $of_objs/crt0.o $OBJS $work/image.o 
$LIBS
        do_cmd $OBJCOPY $OBJCOPY_ARGS $vmlinuz $vmlinuz
        do_cmd cp -p $objdir/boot/note $work
        do_cmd $ADDNOTE $vmlinuz
        ;;
     coff)
-       LD_ARGS="$LD_ARGS -Ttext 0x00500000 -Bstatic"
+       LD_ARGS="$OF_LD_ARGS -Ttext 0x00500000 -Bstatic"
        OBJCOPY_ARGS="-O aixcoff-rs6000 -R .stab -R .stabstr $OBJCOPY_ARGS"
-       do_cmd $LD -o $vmlinuz $LD_ARGS $objs/coffcrt0.o $OBJS $work/image.o 
$LIBS
+       do_cmd $LD -o $vmlinuz $LD_ARGS $of_objs/coffcrt0.o $OBJS $work/image.o 
$LIBS
        do_cmd $OBJCOPY $OBJCOPY_ARGS $vmlinuz $vmlinuz
        do_cmd $HACKOFF $vmlinuz
        ;;
     newworld)
-       LD_ARGS="$LD_ARGS -Ttext 0x01000000"
+       LD_ARGS="$OF_LD_ARGS -Ttext 0x01000000"
        OBJCOPY_ARGS="--add-section=.note=$work/note $OBJCOPY_ARGS"
-       do_cmd $LD -o $vmlinuz $LD_ARGS $objs/crt0.o $OBJS $LIBS $work/image.o
+       do_cmd $LD -o $vmlinuz $LD_ARGS $of_objs/crt0.o $OBJS $LIBS 
$work/image.o
        do_cmd $MKNOTE > $work/note
        do_cmd $OBJCOPY $OBJCOPY_ARGS $vmlinuz $vmlinuz
        ;;
-    #prep)
+    prep)
+       # TODO: 0x00800000 should be configurable (set by CONFIG_BOOT_LOADER)
+       LD_ARGS="$LD_ARGS -Ttext 0x00800000 -Bstatic"
+       OBJCOPY_ARGS="$OBJCOPY_ARGS -R .stab -R .stabstr -R .sysmap"
+       do_cmd $LD -o $vmlinuz $LD_ARGS $SIMPLE_OBJS $work/image.o $LIBS
+       do_cmd $OBJCOPY $OBJCOPY_ARGS $vmlinuz $vmlinuz
+       # TODO: Do we really need MKBUGBOOT ?
+       do_cmd $MKBUGBOOT $vmlinuz $vmlinuz.bugboot
+       do_cmd $MKPREP -pbp $vmlinuz $vmlinuz
+       ;;
     *)
        echo Sorry, I do not know how to handle PowerPC sub-architecture $arch.
 esac

Reply via email to