summaryrefslogtreecommitdiffstats
path: root/grub-core/genmod.sh.in
diff options
context:
space:
mode:
Diffstat (limited to 'grub-core/genmod.sh.in')
-rw-r--r--grub-core/genmod.sh.in103
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