|  | #!/bin/bash | 
|  | # Kernel linking script | 
|  | # | 
|  | # This isn't the worlds most elegant link command.  link-kernel takes the obj | 
|  | # output name, then the linker script, then everything else you'd dump on the | 
|  | # ld command line, including linker options and objects to link together. | 
|  | # | 
|  | # We link extra times to resolve the reflected symbol table addresses.  After | 
|  | # the first link, we can generate the reflected symbol table of the appropriate | 
|  | # size.  Once we link it into the kernel, some addresses may have shifted, so | 
|  | # we repeat the creation of the ksyms and relink.  For more info, check out | 
|  | # Linux's kallsyms, their build script, and | 
|  | # http://stackoverflow.com/questions/11254891/can-a-running-c-program-access-its-own-symbol-table | 
|  |  | 
|  | gen_symtab_obj() | 
|  | { | 
|  | $NM -n $KERNEL_OBJECT > $KSYM_MAP | 
|  | awk 'BEGIN{ print "#include <kdebug.h>"; | 
|  | print "struct symtab_entry gbl_symtab[]={" } | 
|  | { if(NF==3){print "{\"" $3 "\", 0x" $1 "},"}} | 
|  | END{print "{0,0} };"}' $KSYM_MAP > $KSYM_C | 
|  | $CC $NOSTDINC_FLAGS $AKAROSINCLUDE $CFLAGS_KERNEL -o $KSYM_O -c $KSYM_C | 
|  | } | 
|  |  | 
|  | KERNEL_OBJECT=$1 | 
|  | shift | 
|  | LINKER_SCRIPT=$1 | 
|  | shift | 
|  | REMAINING_ARGS=$@ | 
|  |  | 
|  | KSYM_MAP=$OBJDIR/kern/ksyms.map | 
|  | KSYM_C=$OBJDIR/kern/ksyms-refl.c | 
|  | KSYM_O=$OBJDIR/kern/ksyms-refl.o | 
|  |  | 
|  | # Use "make V=1" to debug this script (from Linux) | 
|  | case "${KBUILD_VERBOSE}" in | 
|  | *1*) | 
|  | set -x | 
|  | ;; | 
|  | esac | 
|  |  | 
|  | # Generates the first version of $KERNEL_OBJECT | 
|  | $LD -T $LINKER_SCRIPT -o $KERNEL_OBJECT $REMAINING_ARGS | 
|  |  | 
|  | # Generates a C and obj file with a table of the correct size, with relocs | 
|  | gen_symtab_obj | 
|  |  | 
|  | # Links the syms with the kernel and inserts the glb_symtab in the kernel. | 
|  | $LD -T $LINKER_SCRIPT -o $KERNEL_OBJECT $REMAINING_ARGS $KSYM_O | 
|  |  | 
|  | # Need to recheck/compute the symbols (table size won't change) | 
|  | gen_symtab_obj | 
|  |  | 
|  | # Final link | 
|  | $LD -T $LINKER_SCRIPT -o $KERNEL_OBJECT $REMAINING_ARGS $KSYM_O | 
|  |  | 
|  | # And objdump for debugging | 
|  | $OBJDUMP -S $KERNEL_OBJECT > $KERNEL_OBJECT.asm |