5. 基本編譯工具和編譯選項
5.1編譯選項
編譯選項是另乙個重要的控制手段。linux的編譯選項第一級非常簡單
cmd_as_o_s $(cc) $(a_flags) -c -o $@ $<
cmd_as_s_s $(cpp) $(a_flags) -o $@ $<
cmd_cc_i_c $(cpp) $(c_flags) -o $@ $<
cmd_cc_lst_c $(cc) $(c_flags) -g -c -o $*.o $< && $(config_shell) $(srctree)/scripts/makelst $*.o system.map $(objdump) > $@
cmd_cc_o_c $(cc) $(c_flags) -c -o $(@d)/.tmp_$(@f) $<
cmd_cc_s_c $(cc) $(c_flags) -fverbose-asm -s -o $@ $<
cmd_cpp_lds_s $(cpp) $(cpp_flags) -d__assembly__ -o $@ $<
只是乙個簡單的控制選項。
其中c_flags定義為:
c_flags = -wp,-md,$(depfile) $(nostdinc_flags) $(cppflags) /
$(__c_flags) $(modkern_cflags) /
-d"kbuild_str(s)=/#s" $(basename_flags) $(modname_flags)
nostdinc_flags -nostdinc -isystem /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include 定義了標頭檔案的控制
cppflags -d__kernel__ -iinclude -include include/linux/autoconf.h 定義了編譯kernel必須的巨集 __kernel__和包含了系統配置選項檔案。
__c_flags 為_c_flags,如果編譯目標目錄不同於源檔案目錄,對其中的-i選項增加源目錄
其中使用者可以對cflags和extra_cflags作更改,同時更可以定義各個目標不同的編譯選項
使用者盡量不要改動cflags的內容。
在 i386體系中cflags部分內容如下:
cflags -wall -wundef -wstrict-prototypes -wno-trigraphs -fno-strict-aliasing -fno-common -o2 -pipe -msoft-float -mpreferred-stack-boundary=2 -march=i686 -mregparm=3 -ffreestanding -maccumulate-outgoing-args -iinclude/asm-i386/mach-default -fomit-frame-pointer
_a_flags $(aflags) $(extra_aflags) $(aflags_$(basetarget).o)
_c_flags $(cflags) $(extra_cflags) $(cflags_$(basetarget).o)
_cpp_flags $(cppflags) $(extra_cppflags) $(cppflags_$(@f))
a_flags = -wp,-md,$(depfile) $(nostdinc_flags) $(cppflags) /
$(__a_flags) $(modkern_aflags)
cpp_flags = -wp,-md,$(depfile) $(nostdinc_flags) $(__cpp_flags)
ld_flags = $(ldflags) $(extra_ldflags)
5.1.1 以下為有關module的編譯選項:
basetarget = $(basename $(notdir $@))
basename_flags = -d"kbuild_basename=kbuild_str($(call name-fix,$(basetarget)))"
modname = $(basetarget)
modname-multi = $(sort $(foreach m,$(multi-used),/
$(if $(filter $(subst $(obj)/,,$*.o), $($(m:.o=-objs)) $($(m:.o=-y))),$(m:.o=))))
$(multi-objs-m) : modname = $(modname-multi)
$(multi-objs-m:.o=.i) : modname = $(modname-multi)
modname_flags = $(if $(filter 1,$(words $(modname))),/
-d"kbuild_modname=kbuild_str($(call name-fix,$(modname)))")
其中c_flags中定義了 -d"kbuild_str(s)=/#s"
modkern_cflags定義的例子:
modkern_cflags := $(cflags_kernel)
$(real-objs-m) : modkern_cflags := $(cflags_module)
$(real-objs-m:.o=.i) : modkern_cflags := $(cflags_module)
cflags_kernel =
cflags_module = -dmodule
modkern_aflags定義的例子:
modkern_aflags := $(aflags_kernel)
$(real-objs-m) : modkern_aflags := $(aflags_module)
$(real-objs-m:.o=.s): modkern_aflags := $(aflags_module)
aflags_kernel =
aflags_module = -dmodule
單原始檔可載入軟體模組的生成:
$(ld) $(ldflags) -r -o $@ $(@d)/.tmp_$(@f) /
-t $(@d)/.tmp_$(@f:.o=.ver); /
Linux系統程式設計4 編譯鏈結
編譯 的步驟 預處理器 源 經過預處理器處理後變成了修改後的源 主要是處理 符號開頭的特殊行 編譯器 編譯修改後的源 將翻譯後的機器語言指令,也就是目標 儲存在目標檔案中 目標檔案 不是完整的程式,因為它不包含一些必要的執行時庫,所以無法執行 執行時庫 執行一些常規操作或者某些困難任務預先編寫好的 ...
Linux 4 arm交叉編譯
arm 2009q3 67 arm none linux gnueabi i686 pc linux gnu.tar.bz2 解壓縮 sudo tar xvf arm 2009q3 67 arm none linux gnueabi i686 pc linux gnu.tar.bz2 解壓縮後檔案為...
linux 系統 ko模組編譯
今天整理以前筆記,發現曾經裡面有乙個makefile檔案。仔細一看是以前實習做linux核心程式設計時候寫的模組makefile。剛好我電腦也有linux系統,就拿來回顧一下。寫個my.c和乙個makefile檔案,然後make編譯一下,就成功了,生成my.ko 再載入一下insmod my.ko ...