diff options
Diffstat (limited to 'grub-core/genmod.sh.in')
-rw-r--r-- | grub-core/genmod.sh.in | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/grub-core/genmod.sh.in b/grub-core/genmod.sh.in new file mode 100644 index 0000000..1250589 --- /dev/null +++ b/grub-core/genmod.sh.in @@ -0,0 +1,103 @@ +#! @BUILD_SHEBANG@ +set -e + +# Copyright (C) 2010 Free Software Foundation, Inc. +# +# This gensymlist.sh is free software; the author +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +# +# Example: +# +# genmod.sh moddep.lst normal.module build-grub-module-verifier normal.mod +# + +moddep=$1 +infile=$2 +outfile=$4 + +tmpfile=${outfile}.tmp +modname=`echo $infile | sed -e 's@\.module.*$@@'` + +if ! grep ^$modname: $moddep >/dev/null; then + echo "warning: moddep.lst has no dependencies for $modname" >&2 + exit 0 +fi + +deps=`grep ^$modname: $moddep | sed s@^.*:@@` + +# remove old files if any +rm -f $tmpfile $outfile + +if test x@TARGET_APPLE_LINKER@ != x1; then + # stripout .modname and .moddeps sections from input module + @TARGET_OBJCOPY@ -R .modname -R .moddeps $infile $tmpfile + + # Attach .modname and .moddeps sections + t1=`mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` || exit 1 + printf "$modname\0" >$t1 + + t2=`mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` || exit 1 + for dep in $deps; do printf "$dep\0" >> $t2; done + + if test -n "$deps"; then + @TARGET_OBJCOPY@ --add-section .modname=$t1 --add-section .moddeps=$t2 $tmpfile + else + @TARGET_OBJCOPY@ --add-section .modname=$t1 $tmpfile + fi + rm -f $t1 $t2 + + if test x@platform@ != xemu; then + @TARGET_STRIP@ --strip-unneeded \ + -K grub_mod_init -K grub_mod_fini \ + -K _grub_mod_init -K _grub_mod_fini \ + -R .note.gnu.gold-version -R .note.GNU-stack \ + -R .gnu.build.attributes \ + -R .rel.gnu.build.attributes \ + -R .rela.gnu.build.attributes \ + -R .eh_frame -R .rela.eh_frame -R .rel.eh_frame \ + -R .note -R .comment -R .ARM.exidx $tmpfile || exit 1 + fi + if ! test -z "${TARGET_OBJ2ELF}"; then + "${TARGET_OBJ2ELF}" $tmpfile || exit 1 + fi +else + tmpfile2=${outfile}.tmp2 + t1=${outfile}.t1.c + t2=${outfile}.t2.c + + # remove old files if any + rm -f $t1 $t2 + + cp $infile $tmpfile + + # Attach .modname and .moddeps sections + echo "char modname[] __attribute__ ((section(\"_modname, _modname\"))) = \"$modname\";" >$t1 + + for dep in $deps; do echo "char moddep_$dep[] __attribute__ ((section(\"_moddeps, _moddeps\"))) = \"$dep\";" >>$t2; done + + if test -n "$deps"; then + @TARGET_CC@ @TARGET_LDFLAGS@ -ffreestanding -nostdlib -o $tmpfile2 $t1 $t2 $tmpfile -Wl,-r,-d + else + @TARGET_CC@ @TARGET_LDFLAGS@ -ffreestanding -nostdlib -o $tmpfile2 $t1 $tmpfile -Wl,-r,-d + fi + rm -f $t1 $t2 $tmpfile + mv $tmpfile2 $tmpfile + + cp $tmpfile $tmpfile.bin + @TARGET_OBJCONV@ -f@TARGET_MODULE_FORMAT@ \ + -nr:_grub_mod_init:grub_mod_init \ + -nr:_grub_mod_fini:grub_mod_fini \ + -wd1106 -nu -nd $tmpfile.bin $tmpfile || exit 1 + rm -f $tmpfile.bin +fi +if test x@platform@ != xemu; then + ./build-grub-module-verifier@BUILD_EXEEXT@ $tmpfile @target_cpu@ @platform@ +fi +mv $tmpfile $outfile |