将跟目录中Makefile文件vmlinux目标的规则在x86平台展开就是:
cmd_vmlinux := /bin/bash scripts/link-vmlinux.sh ld -m elf_x86_64 --emit-relocs --build-id这里面调用了scripts/link-vmlinux.sh,看来秘密都在这个文件中~
vmlinux.o # Link of vmlinux.o used for section mismatch analysis # ${1} output file modpost_link() { ${LD} ${LDFLAGS} -r -o ${1} ${KBUILD_VMLINUX_INIT} \ --start-group ${KBUILD_VMLINUX_MAIN} --end-group } info LD vmlinux.o modpost_link vmlinux.o有没有感到很熟悉?又看到KBUILD_VMLINUX_INIT和KBUILD_VMLINUX_MAIN了吧。
关于–start-group, –end-group我查了一下ld的man,说是这个可以循环去寻找出现在对象文件中的symbol,直到找到。
以为vmlinux.o就这么完事儿了吧,结果又出现一行命令。
# modpost vmlinux.o to check for section mismatches ${MAKE} -f "${srctree}/scripts/Makefile.modpost" vmlinux.o这个最后用的是编译出来的scripts/mod/modpost来做section的检测的。
我把x86平台上这条语句执行的情况展开了,留着以后研究。
这下是链接vmlinux了
# Link of vmlinux # ${1} - optional extra .o files # ${2} - output file vmlinux_link() { local lds="${objtree}/${KBUILD_LDS}" if [ "${SRCARCH}" != "um" ]; then ${LD} ${LDFLAGS} ${LDFLAGS_vmlinux} -o ${2} \ -T ${lds} ${KBUILD_VMLINUX_INIT} \ --start-group ${KBUILD_VMLINUX_MAIN} --end-group ${1} else ${CC} ${CFLAGS_vmlinux} -o ${2} \ -Wl,-T,${lds} ${KBUILD_VMLINUX_INIT} \ -Wl,--start-group \ ${KBUILD_VMLINUX_MAIN} \ -Wl,--end-group \ -lutil -lrt -lpthread ${1} rm -f linux fi }第一眼看到有-lpthread的时候惊呆了,我大kernel还要链接pthread?后来一看明白了,原来还有用户态的内核???好高级阿~
然后仔细一看,这个和vmlinux.o的链接有啥区别???
这篇文章 讲了一点,说vmlinux是给gdb用的,vmlinux.o是用来启动的?
我们拭目以待~