The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/scripts/link-vmlinux.sh

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 #!/bin/sh
    2 #
    3 # link vmlinux
    4 #
    5 # vmlinux is linked from the objects selected by $(KBUILD_VMLINUX_INIT) and
    6 # $(KBUILD_VMLINUX_MAIN). Most are built-in.o files from top-level directories
    7 # in the kernel tree, others are specified in arch/$(ARCH)/Makefile.
    8 # Ordering when linking is important, and $(KBUILD_VMLINUX_INIT) must be first.
    9 #
   10 # vmlinux
   11 #   ^
   12 #   |
   13 #   +-< $(KBUILD_VMLINUX_INIT)
   14 #   |   +--< init/version.o + more
   15 #   |
   16 #   +--< $(KBUILD_VMLINUX_MAIN)
   17 #   |    +--< drivers/built-in.o mm/built-in.o + more
   18 #   |
   19 #   +-< ${kallsymso} (see description in KALLSYMS section)
   20 #
   21 # vmlinux version (uname -v) cannot be updated during normal
   22 # descending-into-subdirs phase since we do not yet know if we need to
   23 # update vmlinux.
   24 # Therefore this step is delayed until just before final link of vmlinux.
   25 #
   26 # System.map is generated to document addresses of all kernel symbols
   27 
   28 # Error out on error
   29 set -e
   30 
   31 # Nice output in kbuild format
   32 # Will be supressed by "make -s"
   33 info()
   34 {
   35         if [ "${quiet}" != "silent_" ]; then
   36                 printf "  %-7s %s\n" ${1} ${2}
   37         fi
   38 }
   39 
   40 # Link of vmlinux.o used for section mismatch analysis
   41 # ${1} output file
   42 modpost_link()
   43 {
   44         ${LD} ${LDFLAGS} -r -o ${1} ${KBUILD_VMLINUX_INIT}                   \
   45                 --start-group ${KBUILD_VMLINUX_MAIN} --end-group
   46 }
   47 
   48 # Link of vmlinux
   49 # ${1} - optional extra .o files
   50 # ${2} - output file
   51 vmlinux_link()
   52 {
   53         local lds="${objtree}/${KBUILD_LDS}"
   54 
   55         if [ "${SRCARCH}" != "um" ]; then
   56                 ${LD} ${LDFLAGS} ${LDFLAGS_vmlinux} -o ${2}                  \
   57                         -T ${lds} ${KBUILD_VMLINUX_INIT}                     \
   58                         --start-group ${KBUILD_VMLINUX_MAIN} --end-group ${1}
   59         else
   60                 ${CC} ${CFLAGS_vmlinux} -o ${2}                              \
   61                         -Wl,-T,${lds} ${KBUILD_VMLINUX_INIT}                 \
   62                         -Wl,--start-group                                    \
   63                                  ${KBUILD_VMLINUX_MAIN}                      \
   64                         -Wl,--end-group                                      \
   65                         -lutil ${1}
   66                 rm -f linux
   67         fi
   68 }
   69 
   70 
   71 # Create ${2} .o file with all symbols from the ${1} object file
   72 kallsyms()
   73 {
   74         info KSYM ${2}
   75         local kallsymopt;
   76 
   77         if [ -n "${CONFIG_SYMBOL_PREFIX}" ]; then
   78                 kallsymopt="${kallsymopt} \
   79                             --symbol-prefix=${CONFIG_SYMBOL_PREFIX}"
   80         fi
   81 
   82         if [ -n "${CONFIG_KALLSYMS_ALL}" ]; then
   83                 kallsymopt="${kallsymopt} --all-symbols"
   84         fi
   85 
   86         local aflags="${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL}               \
   87                       ${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS}"
   88 
   89         ${NM} -n ${1} | \
   90                 scripts/kallsyms ${kallsymopt} | \
   91                 ${CC} ${aflags} -c -o ${2} -x assembler-with-cpp -
   92 }
   93 
   94 # Create map file with all symbols from ${1}
   95 # See mksymap for additional details
   96 mksysmap()
   97 {
   98         ${CONFIG_SHELL} "${srctree}/scripts/mksysmap" ${1} ${2}
   99 }
  100 
  101 sortextable()
  102 {
  103         ${objtree}/scripts/sortextable ${1}
  104 }
  105 
  106 # Delete output files in case of error
  107 trap cleanup SIGHUP SIGINT SIGQUIT SIGTERM ERR
  108 cleanup()
  109 {
  110         rm -f .old_version
  111         rm -f .tmp_System.map
  112         rm -f .tmp_kallsyms*
  113         rm -f .tmp_version
  114         rm -f .tmp_vmlinux*
  115         rm -f System.map
  116         rm -f vmlinux
  117         rm -f vmlinux.o
  118 }
  119 
  120 #
  121 #
  122 # Use "make V=1" to debug this script
  123 case "${KBUILD_VERBOSE}" in
  124 *1*)
  125         set -x
  126         ;;
  127 esac
  128 
  129 if [ "$1" = "clean" ]; then
  130         cleanup
  131         exit 0
  132 fi
  133 
  134 # We need access to CONFIG_ symbols
  135 . ./.config
  136 
  137 #link vmlinux.o
  138 info LD vmlinux.o
  139 modpost_link vmlinux.o
  140 
  141 # modpost vmlinux.o to check for section mismatches
  142 ${MAKE} -f "${srctree}/scripts/Makefile.modpost" vmlinux.o
  143 
  144 # Update version
  145 info GEN .version
  146 if [ ! -r .version ]; then
  147         rm -f .version;
  148         echo 1 >.version;
  149 else
  150         mv .version .old_version;
  151         expr 0$(cat .old_version) + 1 >.version;
  152 fi;
  153 
  154 # final build of init/
  155 ${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init
  156 
  157 kallsymso=""
  158 kallsyms_vmlinux=""
  159 if [ -n "${CONFIG_KALLSYMS}" ]; then
  160 
  161         # kallsyms support
  162         # Generate section listing all symbols and add it into vmlinux
  163         # It's a three step process:
  164         # 1)  Link .tmp_vmlinux1 so it has all symbols and sections,
  165         #     but __kallsyms is empty.
  166         #     Running kallsyms on that gives us .tmp_kallsyms1.o with
  167         #     the right size
  168         # 2)  Link .tmp_vmlinux2 so it now has a __kallsyms section of
  169         #     the right size, but due to the added section, some
  170         #     addresses have shifted.
  171         #     From here, we generate a correct .tmp_kallsyms2.o
  172         # 2a) We may use an extra pass as this has been necessary to
  173         #     woraround some alignment related bugs.
  174         #     KALLSYMS_EXTRA_PASS=1 is used to trigger this.
  175         # 3)  The correct ${kallsymso} is linked into the final vmlinux.
  176         #
  177         # a)  Verify that the System.map from vmlinux matches the map from
  178         #     ${kallsymso}.
  179 
  180         kallsymso=.tmp_kallsyms2.o
  181         kallsyms_vmlinux=.tmp_vmlinux2
  182 
  183         # step 1
  184         vmlinux_link "" .tmp_vmlinux1
  185         kallsyms .tmp_vmlinux1 .tmp_kallsyms1.o
  186 
  187         # step 2
  188         vmlinux_link .tmp_kallsyms1.o .tmp_vmlinux2
  189         kallsyms .tmp_vmlinux2 .tmp_kallsyms2.o
  190 
  191         # step 2a
  192         if [ -n "${KALLSYMS_EXTRA_PASS}" ]; then
  193                 kallsymso=.tmp_kallsyms3.o
  194                 kallsyms_vmlinux=.tmp_vmlinux3
  195 
  196                 vmlinux_link .tmp_kallsyms2.o .tmp_vmlinux3
  197 
  198                 kallsyms .tmp_vmlinux3 .tmp_kallsyms3.o
  199         fi
  200 fi
  201 
  202 info LD vmlinux
  203 vmlinux_link "${kallsymso}" vmlinux
  204 
  205 if [ -n "${CONFIG_BUILDTIME_EXTABLE_SORT}" ]; then
  206         info SORTEX vmlinux
  207         sortextable vmlinux
  208 fi
  209 
  210 info SYSMAP System.map
  211 mksysmap vmlinux System.map
  212 
  213 # step a (see comment above)
  214 if [ -n "${CONFIG_KALLSYMS}" ]; then
  215         mksysmap ${kallsyms_vmlinux} .tmp_System.map
  216 
  217         if ! cmp -s System.map .tmp_System.map; then
  218                 echo >&2 Inconsistent kallsyms data
  219                 echo >&2 Try "make KALLSYMS_EXTRA_PASS=1" as a workaround
  220                 cleanup
  221                 exit 1
  222         fi
  223 fi
  224 
  225 # We made a new kernel - delete old version file
  226 rm -f .old_version

Cache object: 3258bd55e30c84756d2af5f19f825d46


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.