www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 芯聞號 > 充電吧
[導讀]# #?Makefile?for?linux. #?If?you?don't?have?'-mstring-insns'?in?your?gcc?(and?nobody?but?me?has?:-)

#
#?Makefile?for?linux.
#?If?you?don't?have?'-mstring-insns'?in?your?gcc?(and?nobody?but?me?has?:-)
#?remove?them?from?the?CFLAGS?defines.
#

#
#8086匯編編譯器和連接器.?-0生成8086目標程序;-a生成與gas和gld部分兼容的代碼
#
AS86?=as?-0?-a?
CC86?=cc?-0
LD86?=ld?-0

#
#GNU匯編編譯器和連接器
#
AS?=gas
LD?=gld

#
#GNU連接器gld運行時用到的選項
#-s?輸出文件中省略所有的符號信息
#-x?刪除所有的局部符號
#-M?在標準輸出設備(顯示器)上打印連接映象(link?map).
#連接映象:由連接程序產(chǎn)生的一種內存地址映象,其中列出了程序裝入到內存中的位置信息,具體有如下信息:
#目標文件及符號信息映射到內存中的位置
#公共符號如何放置
#連接中包含的所有文件成員及其引用的符號
#
LDFLAGS?=-s?-x?-M

#
#gcc是GNU?C程序編譯器,對于UNIX類的腳本程序而言,
#在引用定義的標識符時,需在前面加上$符號并用括號括住標識符
#
CC?=gcc

#
#GCC的選項.
#-Wall?打印所有的警告信息
#-O?對代碼進行優(yōu)化
#-fstrength-reduce?優(yōu)化循環(huán)語句
#
CFLAGS?=-Wall?-O?-fstrength-reduce?-fomit-frame-pointer?-fcombine-regs

#
#CPP是gcc的預處理程序
#-nostdinc?-Iinclude?不要搜索標準的頭文件目錄中的文件,
#而是使用-I選項指定的目錄或者是在當前的目錄里搜索頭文件
#
CPP?=gcc?-E?-nostdinc?-Iinclude

#?
#?kernel目錄,mm目錄,fs目錄所產(chǎn)生的目標代碼文件。
#?為了方便引用,在這里將它們用ARCHIVES(歸檔文件)標識符表示
#
ARCHIVES=kernel/kernel.o?mm/mm.o?fs/fs.o

#
#?由lib/目錄中生成的通用庫文件
#
LIBS?=lib/lib.a

#
#?make隱式后綴規(guī)則
#?指示make利用下面的命令將所有的.c文件編譯生成.s匯編程序
#?':'表示下面是該規(guī)則的命令
#?規(guī)則:指使gcc采用前面CFLAGS所指定的選項以及僅使用include/目錄中的頭文件,
#?在適當?shù)木幾g后不進行匯編就停止(-S),從而產(chǎn)生與輸入的各個C文件對應的匯編語言形式的代碼文件。
#?默認情況下所產(chǎn)生的匯編程序文件是原C文件名去掉.c而加上.s后綴。
#?-o表示其后是輸出文件的形式。
#?其中$*.s(或$@)是自動目標變量,$<代表第一個先決條件,這里即是符合條件*.c的文件。
#
.c.s:
$(CC)?$(CFLAGS)?
-nostdinc?-Iinclude?-S?-o?$*.s?$<

#
#?將所有.s匯編程序文件編譯成.o目標文件。下一條是實現(xiàn)該操作的具體命令
#?使用gas編譯器將匯編程序編譯成.o目標文件。-c表示只編譯或匯編,但不進行連接操作
#
.s.o:
$(AS)?-c?-o?$*.o?$<

#
#?使用gcc將c語言編譯成目標文件但不連接
#
.c.o:
$(CC)?$(CFLAGS)?
-nostdinc?-Iinclude?-c?-o?$*.o?$<

#
#?all表示創(chuàng)建Makefile所知的最頂層目標。這里即是image文件
#
all:?Image

#
#?第一行說明:目標文件(Image文件)是由分號后面的3個元素產(chǎn)生
#?下面兩行是執(zhí)行的命令
#?第一行表示使用tools目錄下的build工具程序將boot,system文件組裝成內核映象文件Image
#?第二行的sysn同步命令是迫使緩沖塊數(shù)據(jù)立即寫盤并更新超級塊
#
Image:?boot/boot?tools/system?tools/build
tools/build?boot/boot?tools/system?>?Image
sync

#chmem?--?修改系統(tǒng)內存數(shù)據(jù)
tools/build:?tools/build.c
$(CC)?$(CFLAGS)?
-o?tools/build?tools/build.c
chmem?+65000?tools/build

#
#?利用上面的.s.o規(guī)則生成head.o文件
#
boot/head.o:?boot/head.s

#
#?最后的>System.map表示gld需要將連接映象重定向存放在System.map文件中
#
tools/system:?boot/head.o?init/main.o?
$(ARCHIVES)?$(LIBS)
$(LD)?$(LDFLAGS)?boot/head.o?init/main.o?
$(ARCHIVES)?
$(LIBS)?
-o?tools/system?>?System.map

#
#?內核目標模塊kernel.o
#
kernel/kernel.o:
(cd?kernel;?make)

#
#?內核管理模塊mm.o
#
mm/mm.o:
(cd?mm;?make)

#
#?文件系統(tǒng)目標模塊fs.o
#
fs/fs.o:
(cd?fs;?make)

#
#?庫函數(shù)lib.a
#
lib/lib.a:
(cd?lib;?make)

#
#?在boot.s程序開口添加一行有關system文件長度信息
#?首先生成含有?"SYSSIZE?=?文件實際長度"一行信息的tmp.s文件,然后將boot.s文件添加在其后。
#?取得system長度的方法是:
#?利用ls命令對system文件進行長列表顯示
#?用grep命令取得列表上文件字節(jié)數(shù)字段信息,并定向保存在tmp.s臨時文件中
#?cut命令用于剪切字符串
#?tr用于去除行尾的回車符
#?(實際長度?+?15)/16用于獲得'節(jié)'表示的長度信息,1節(jié)=16字節(jié)
#?用8086匯編和連接器對setup.s文件進行編譯生成setup文件
#?-s表示要取出目標文件中的符號信息
#
boot/boot:?boot/boot.s?tools/system
(echo?-n?"SYSSIZE?=?(";ls?-l?tools/system?|?grep?system?
|?cut?-c25-31?|?tr?'