Linux系統(tǒng)分析入門基礎(chǔ).pptx_第1頁(yè)
Linux系統(tǒng)分析入門基礎(chǔ).pptx_第2頁(yè)
Linux系統(tǒng)分析入門基礎(chǔ).pptx_第3頁(yè)
Linux系統(tǒng)分析入門基礎(chǔ).pptx_第4頁(yè)
Linux系統(tǒng)分析入門基礎(chǔ).pptx_第5頁(yè)
已閱讀5頁(yè),還剩143頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第1講 Linux系統(tǒng)分析基礎(chǔ),南京大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)系,了解Linux發(fā)展概況 了解Linux內(nèi)核結(jié)構(gòu)及編譯方法 掌握Linux基本編程方法 掌握GNU編程工具 理解Linux程序執(zhí)行機(jī)制,2,教學(xué)目標(biāo),3,主要內(nèi)容,Linux簡(jiǎn)介 Linux內(nèi)核環(huán)境 Linux編程環(huán)境 GNU make管理項(xiàng)目 Linux的程序執(zhí)行機(jī)制,4,初識(shí)Linux,類Unix(Unix-like)操作系統(tǒng) 其他類UNIX系統(tǒng)包括Solaris、Mac OS等 基于GPL(GNU Public License)的自由操作系統(tǒng) 第一個(gè)版本發(fā)行于1991年 主要用C語(yǔ)言編寫,部分代碼用匯編語(yǔ)言編寫 “Linux”在不

2、同語(yǔ)境下的內(nèi)涵不同 Linux內(nèi)核、Linux系統(tǒng)、Linux開發(fā)套件等 嚴(yán)格來(lái)說(shuō),Linux指由Linux Torvalds維護(hù)(及通過(guò)主要鏡像網(wǎng)站發(fā)布)的內(nèi)核,Linux簡(jiǎn)介,5,Linux發(fā)展史,1991年11月,芬蘭赫爾辛基大學(xué)的 Linus Torvalds 編寫了一個(gè)小程序(取名為L(zhǎng)inux),發(fā)布在互聯(lián)網(wǎng)上 希望借此實(shí)現(xiàn)一個(gè)操作系統(tǒng)“內(nèi)核” 1993年 一批高水平網(wǎng)絡(luò)黑客參與,誕生Linux 1.0 版 1994年 Linux 的第一個(gè)商業(yè)版 Slackware 問(wèn)世 1996年 美國(guó)國(guó)家標(biāo)準(zhǔn)技術(shù)局計(jì)算機(jī)系統(tǒng)實(shí)驗(yàn)室確認(rèn) Linux 版本1.2.13符合 POSIX 標(biāo)準(zhǔn) 2001

3、年 Linux2.4版內(nèi)核發(fā)布 2003年 Linux2.6版內(nèi)核發(fā)布,Linux簡(jiǎn)介,6,Linux操作系統(tǒng)特征,符合POSIX標(biāo)準(zhǔn)規(guī)范的操作系統(tǒng) Portable Operation System Interface of Unix:可移植的操作系統(tǒng)接口 由IEEE開發(fā),ANSI和ISO標(biāo)準(zhǔn)化 具備現(xiàn)代操作系統(tǒng)的基本功能 搶占式多任務(wù)處理,支持多用戶 圖形用戶接口 異構(gòu)硬件支持 支持SMP 支持TCP/IP 多體系結(jié)構(gòu)支持,支持32/64位CPU 擁有其他操作系統(tǒng)沒(méi)有的特色 NFS、VFS、高效的EXT系列文件系統(tǒng)等,Linux簡(jiǎn)介,代表一種開源文化 免費(fèi)軟件,開放源代碼 自由軟件,可在原

4、有程序基礎(chǔ)上開發(fā)自己的程序 GNU/Linux Linux僅指Linux內(nèi)核 Linux系統(tǒng)的大部分應(yīng)用都建立在GNU軟件之上 核心結(jié)構(gòu) Linux內(nèi)核 Linux Shell Linux文件系統(tǒng) Linux應(yīng)用系統(tǒng) GNU Tools,7,Linux精髓,Linux簡(jiǎn)介,8,Linux的系統(tǒng)結(jié)構(gòu),用戶應(yīng)用程序,系統(tǒng)調(diào)用,硬件資源管理接口,Shell,庫(kù)函數(shù),內(nèi)核實(shí)現(xiàn),Linux簡(jiǎn)介,不區(qū)分的缺陷 用戶直接修改操作系統(tǒng)的數(shù)據(jù) 用戶直接調(diào)用操作系統(tǒng)的內(nèi)部函數(shù) 用戶直接操作外設(shè) 用戶任意讀/寫物理內(nèi)存 區(qū)分的意義 禁止用戶程序和底層硬件直接打交道 如果用戶程序往硬件控制寄存器寫入不恰當(dāng)?shù)闹?,可能?dǎo)

5、致硬件無(wú)法正常工作 禁止用戶程序訪問(wèn)任意物理內(nèi)存,否則可能會(huì)破壞其他程序的正常執(zhí)行 如果對(duì)核心內(nèi)核所在的地址空間寫入數(shù)據(jù),會(huì)導(dǎo)致系統(tǒng)崩潰,9,劃分用戶態(tài)/內(nèi)核態(tài)的必要性,Linux簡(jiǎn)介,現(xiàn)代CPU都有幾種不同指令執(zhí)行級(jí)別 在高執(zhí)行級(jí)別下,代碼可以執(zhí)行特權(quán)指令,訪問(wèn)任意的物理地址,這種CPU執(zhí)行級(jí)別就對(duì)應(yīng)著內(nèi)核態(tài) 在相應(yīng)低級(jí)別執(zhí)行狀態(tài)下,代碼的掌控范圍會(huì)受到限制,只能在對(duì)應(yīng)級(jí)別允許的范圍內(nèi)活動(dòng) 舉例 intel x86 CPU有四種不同的執(zhí)行級(jí)別0-3 Linux只使用0級(jí)和3級(jí)分別表示內(nèi)核態(tài)和用戶態(tài),10,CPU對(duì)用戶態(tài)/和心態(tài)劃分的支持,Linux簡(jiǎn)介,cs寄存器最低兩位表明當(dāng)前代碼的特權(quán)級(jí)

6、 CPU每條指令的讀取都是通過(guò)cs:eip這兩個(gè)寄存器 cs:代碼段選擇寄存器 eip:偏移量寄存器 上述判斷由硬件完成 在Linux中,地址空間是一個(gè)顯著的標(biāo)志 0 xc0000000以上地址空間:只能在內(nèi)核態(tài)下訪問(wèn) 0 x00000000 0 xbfffffff的地址空間:兩種狀態(tài)下都可訪問(wèn) 注意,這里的地址空間是邏輯地址而不是物理地址,11,用戶態(tài)/和心態(tài)的區(qū)分方法,Linux簡(jiǎn)介,Linux是單內(nèi)核、多模塊系統(tǒng) Linux內(nèi)核運(yùn)行在單獨(dú)的內(nèi)核地址空間 所有操作系統(tǒng)功能作為一個(gè)模塊實(shí)現(xiàn)在其內(nèi)核中 模塊均運(yùn)行在內(nèi)核態(tài),直接調(diào)用函數(shù),無(wú)需消息傳遞 具備模塊化設(shè)計(jì)、搶占式內(nèi)核(Linux 2.

7、6支持,Linux 2.4用戶級(jí)搶占)、支持內(nèi)核線程及動(dòng)態(tài)裝載內(nèi)核模塊的能力 與Unix主要區(qū)別 Linux汲取了微內(nèi)核設(shè)計(jì)思想(基于模塊定制內(nèi)核) Unix也是單內(nèi)核系統(tǒng) Windows NT和Mach是微內(nèi)核系統(tǒng) 只提供基礎(chǔ)功能,其他功能通過(guò)服務(wù)實(shí)現(xiàn) 微內(nèi)核功能被劃分為多個(gè)獨(dú)立過(guò)程,每個(gè)過(guò)程稱為服務(wù)器,12,Linux的內(nèi)核特點(diǎn),Linux簡(jiǎn)介,13,Linux單內(nèi)核結(jié)構(gòu),Linux簡(jiǎn)介,14,Linux的內(nèi)核版本,Linux內(nèi)核版本指由Linux開發(fā)小組(Linus Torvalds總協(xié)調(diào))開發(fā)出系統(tǒng)內(nèi)核的版本號(hào) Linux內(nèi)核采用雙樹系統(tǒng) 一棵是穩(wěn)定樹,主要用于發(fā)行 另一棵是非穩(wěn)定樹(

8、開發(fā)樹),用于產(chǎn)品開發(fā)和改進(jìn) Linux內(nèi)核版本號(hào)由3位數(shù)字組成,r.x.y,第1位數(shù)字r為主版本號(hào),第2位數(shù)字x為說(shuō)明版本類型的次版本號(hào): 偶數(shù)表示產(chǎn)品化版本 奇數(shù)表示實(shí)驗(yàn)版本,第3位數(shù)字y為修改號(hào),表示錯(cuò)誤修補(bǔ)的次數(shù),Linux簡(jiǎn)介,15,主流的Linux發(fā)行版本,Linux簡(jiǎn)介,16,Linux與Windows的區(qū)別,文件系統(tǒng) Linux需要一個(gè)掛載根目錄/的ext分區(qū)和一個(gè)作為虛擬內(nèi)存的swap分區(qū) Linux沒(méi)有盤符,可通過(guò)設(shè)備名掛載,掛在信息在/dev/fstab,如 mount -t ntfs /dev/sda1 /mnt/win_c Linux將所有設(shè)備都映射成/dev目錄下的

9、一個(gè)文件 用戶管理 系統(tǒng)管理員是root,使用su命令切換,Linux簡(jiǎn)介,17,主要內(nèi)容,Linux簡(jiǎn)介 Linux內(nèi)核環(huán)境 Linux編程環(huán)境 Linux的系統(tǒng)初始化 Linux的程序執(zhí)行機(jī)制,18,Linux內(nèi)核核心組成,進(jìn)程調(diào)度程序:負(fù)責(zé)控制進(jìn)程訪問(wèn)CPU 內(nèi)核管理程序:支持虛擬內(nèi)存及多進(jìn)程安全共享主存系統(tǒng) 虛擬文件系統(tǒng):抽象異構(gòu)硬件設(shè)備細(xì)節(jié),提供公共文件接口 網(wǎng)絡(luò)接口:提供對(duì)多種組網(wǎng)標(biāo)準(zhǔn)和網(wǎng)絡(luò)硬件的訪問(wèn) 進(jìn)程間通信:為進(jìn)程之間的通信提供實(shí)現(xiàn)機(jī)制,Linux內(nèi)核環(huán)境,19,Linux內(nèi)核源碼的獲取,下載位置 以GNU zip和bzip2形式發(fā)布 安裝位置

10、一般安裝在/usr/src/linux,不要將該源碼樹用于開發(fā) 在編譯自己編寫的C庫(kù)所用的內(nèi)核版本要鏈接到該樹 不要以root身份對(duì)內(nèi)核進(jìn)行修改,應(yīng)先建立自己的主目錄,僅以root身份安裝新內(nèi)核 安裝新內(nèi)核應(yīng)該保持/usr/src/linux原封不動(dòng),Linux內(nèi)核環(huán)境,20,Linux核心源碼結(jié)構(gòu),Linux內(nèi)核環(huán)境,21,Linux核心源碼的組織,arch 目錄 包含與體系結(jié)構(gòu)相關(guān)的核心代碼,相關(guān).h文件則放在include/asm下 支持的每種CPU均有相應(yīng)子目錄,包含boot、kernel、lib和mm等子目錄 /kernel目錄 存放大多數(shù)內(nèi)核函數(shù) 主要文件包括sched.c、tim

11、e.c、sys.c、itimer.c、fork.c、signal.c、softirq.c、resource.c、dma.c、printk.c等 /mm子目錄 獨(dú)立于體系結(jié)構(gòu)的主存管理文件 包括實(shí)現(xiàn)虛擬主存管理的源代碼,Linux內(nèi)核環(huán)境,/fs目錄 存放VFS和系統(tǒng)支持的各種文件系統(tǒng)源代碼 每個(gè)子目錄對(duì)應(yīng)一個(gè)特定文件系統(tǒng) /include目錄 存放重要的內(nèi)核.h頭文件 為各種CPU專設(shè)一個(gè)子目錄 通用子目錄include/linux、include/net /ipc目錄 存放處理進(jìn)程間通信所需源代碼,22,Linux核心源碼的組織(續(xù)),Linux內(nèi)核環(huán)境,/drivers目錄 存放所有設(shè)備驅(qū)

12、動(dòng)程序源代碼 /net子目錄 存放網(wǎng)絡(luò)子系統(tǒng),如各種網(wǎng)卡和網(wǎng)絡(luò)規(guī)程驅(qū)動(dòng)程序 /security目錄 存放安全子系統(tǒng)代碼 /sound目錄 存放語(yǔ)音子系統(tǒng)代碼,23,Linux核心源碼的組織(續(xù)),Linux內(nèi)核環(huán)境,/init目錄 存放內(nèi)核引導(dǎo)和初始化代碼 許多重要文件,如main.c、version.c就位于該目錄下 /lib目錄 存放內(nèi)核需要的通用工具性內(nèi)核函數(shù)(如對(duì)出錯(cuò)信息的處理),它能夠在引導(dǎo)時(shí)解壓內(nèi)核并裝入主存 /scripts目錄 存放編譯內(nèi)核所用腳本和用于系統(tǒng)配置的命令文件 /documentation目錄 存放內(nèi)核源代碼文檔,24,Linux核心源碼的組織(續(xù)),Linux內(nèi)核

13、環(huán)境,采用模塊化的內(nèi)核配置系統(tǒng) 內(nèi)核模塊(Loadable Kernel Module)的概念 模塊實(shí)際上是一種目標(biāo)對(duì)象文件,沒(méi)有鏈接,不能獨(dú)立運(yùn)行 但是其代碼可以在系統(tǒng)運(yùn)行時(shí)鏈接到系統(tǒng)中作為內(nèi)核的一部分運(yùn)行,或從內(nèi)核中取下,從而可以動(dòng)態(tài)擴(kuò)充內(nèi)核的功能(不需要重新編譯內(nèi)核) 這種目標(biāo)代碼通常由一組函數(shù)和數(shù)據(jù)結(jié)構(gòu)組成,25,Linux內(nèi)核的配置組成,Linux內(nèi)核環(huán)境,使得內(nèi)核更加緊湊和靈活,可擴(kuò)展 修改模塊時(shí),不必全部重新編譯整個(gè)內(nèi)核 系統(tǒng)如果需要使用新模塊,只要編譯相應(yīng)的模塊,然后將模塊插入即可 模塊可以不依賴于某個(gè)固定的硬件平臺(tái) 模塊的目標(biāo)代碼一旦被鏈接到內(nèi)核,它的作用域和靜態(tài)鏈接的內(nèi)核目

14、標(biāo)代碼完全等價(jià),26,內(nèi)核模塊的優(yōu)點(diǎn),Linux內(nèi)核環(huán)境,并不是所有地方都使用內(nèi)核模塊 設(shè)備驅(qū)動(dòng)程序 文件系統(tǒng)驅(qū)動(dòng)程序 系統(tǒng)調(diào)用 大部分系統(tǒng)調(diào)用屬于基礎(chǔ)內(nèi)核(Basic kernel),也可以以內(nèi)核模塊方式增加新的系統(tǒng)調(diào)用或者覆蓋現(xiàn)有基于內(nèi)核模塊方式實(shí)現(xiàn)的系統(tǒng)調(diào)用,27,內(nèi)核模塊的使用,Linux內(nèi)核環(huán)境,程序代碼:helloworld.c 編譯、安裝方法 root# gcc -c helloworld.c root# insmod helloworld.o root# lsmod root# rmmod helloworld,28,模塊示例,#define MODULE #include i

15、nt init_module(void) printk(“Hello World!n”); return 0; void cleanup_module(void) printk(“ Goodbye!n”); ,Linux內(nèi)核環(huán)境,29,內(nèi)核模塊與應(yīng)用程序的差別,C語(yǔ)言程序 模塊 運(yùn)行 用戶空間 內(nèi)核空間 入口 main() init_module() 出口 無(wú) cleanup_module() 編譯 gcc -c gcc -c -D_KERNEL_-DMODULE 連接 gcc insmod 運(yùn)行 直接運(yùn)行 insmod 調(diào)試 gdb kdbug, kdb, kgdb等,Linux內(nèi)核環(huán)境,控

16、制需要編譯到內(nèi)核的二進(jìn)制映象(啟動(dòng)時(shí)載入)和在需要時(shí)才裝入的內(nèi)核模塊 配置選項(xiàng)命名形式:CONFIG_FEATURE 如CONFIG_SMP表示支持對(duì)稱多處理器 配置項(xiàng)選擇模式 二選一:yes或no 三選一:yes、no或module Yes選項(xiàng)表示把代碼編譯進(jìn)主內(nèi)核映象,而不作為模塊 Module意味該配置項(xiàng)被選定,但編譯時(shí)該功能的實(shí)現(xiàn)代碼是以模塊形式生成 驅(qū)動(dòng)程序一般都用三選一形式 字符串或整數(shù) 不控制編譯過(guò)程,只是指定內(nèi)核源碼可以訪問(wèn)的值,如定義靜態(tài)變量 一般以預(yù)處理宏的形式表示,30,Linux內(nèi)核編譯時(shí)的模塊選配參數(shù),Linux內(nèi)核環(huán)境,內(nèi)核編譯主要工具文件 內(nèi)核編譯后,會(huì)在/boo

17、t目錄生產(chǎn)以下文件 vmlinuz文件 initrd.img文件 System.map文件,31,Linux內(nèi)核編譯的基本架構(gòu),Makefile 定義編譯鏈接規(guī)則、位于linux源代碼各目錄 配置文件(config.in或kconfig) 提供內(nèi)核的配置選擇和設(shè)置 配置工具 文本命令行工具:make config 基于ncurse的圖形工具:make menuconfig 基于X11的圖形工具:make xconfig 基于gtk+的圖形工具:make gconfig 創(chuàng)建默認(rèn)配置:make defconfig 配置工具輸出文件 .config文件:用#include包括到主Makefile中

18、 include/linux/autoconf.h:用#include包括到各個(gè).c文件 每個(gè).c文件都有代碼項(xiàng),32,Linux內(nèi)核配置系統(tǒng)組成,Linux內(nèi)核環(huán)境,采用GNU編譯工具對(duì).config中的源文件列表編譯 完成內(nèi)核文件的配置、依賴關(guān)系及模塊的生成,隨后調(diào)用Rules.make編譯文件 Rules.make定義所有Makefile共用的編譯規(guī)則 Makefile支持的make命令 make mrproper:檢查.o文件及文件依賴關(guān)系的正確性 make config:配置內(nèi)核并生成配置文件 make dep:根據(jù)配置文件創(chuàng)建相應(yīng)的依賴關(guān)系樹 make clean:清除舊版本的目標(biāo)

19、文件 make zImage:編譯并用gzip壓縮成1MB以下的內(nèi)核 未壓縮的文件是vmlinuz make bzImage:編譯并用gzip壓縮成1MB以上的內(nèi)核 make modules:編譯模塊 make modules_install :安裝模塊 depmod a:生成模塊之間的依賴關(guān)系,33,主Makefile功能,Linux內(nèi)核環(huán)境,準(zhǔn)備階段 下載源碼: 將源碼解壓到/usr/src目錄下 tar xvjf linux-x.y.z.tar.bz2 tar xvzf linux-x.y.z.tar.gz 解壓位置:linux-x.y.z目錄下 建立內(nèi)核編譯

20、環(huán)境 ln sf linux-x.y.z linux cd /usr/include rm -rf asm linux scsi ln -sf /usr/src/linux/include/asm-i386 asm ln -sf /usr/src/linux/include/linux linux ln -sf /usr/src/linux/include/scsi scsi,34,Linux內(nèi)核的編譯、安裝過(guò)程,Linux內(nèi)核環(huán)境,配置內(nèi)核 檢查文件依賴關(guān)系正確性:make mrproper 獲取默認(rèn).config文件:cp /boot/config-uname -r .config 生成配

21、置文件:make config 創(chuàng)建依賴關(guān)系樹:make dep 清除舊版本目標(biāo)文件:make clean 生成壓縮形式內(nèi)核文件:make bzImage或make zImage 編譯后的文件在/usr/src/linux/arch/i386/boot目錄下 編譯、安裝內(nèi)核 編譯內(nèi)核:make 編譯模塊:make modules 安裝模塊:make modules_install 生成模塊依賴關(guān)系:depmod a 安裝內(nèi)核:make install,35,Linux內(nèi)核的編譯、安裝過(guò)程(續(xù)),Linux內(nèi)核環(huán)境,配置啟動(dòng)文件 將內(nèi)核映像拷貝到合適位置,并按啟動(dòng)要求啟動(dòng) #cp /usr/sr

22、c/linux/arch/i386/boot/zImage /boot/zImage-x.y.z #cp /usr/src/linux/System.map /boot/System.map-x.y.z ln sf /boot/vmlinuz-x.y.z /boot/vmlinuz ln sf /boot/System.map-x.y.z /boot/system.map 系統(tǒng)正常啟動(dòng)時(shí)不會(huì)讀這個(gè)符號(hào)表;主要是為了內(nèi)核引導(dǎo)出錯(cuò)時(shí)便于調(diào)試 /sbin/mkinitrd /boot/initrd-x.y.z.img x.y.z 如果是LILO啟動(dòng)方式,編輯/etc/lilo.conf,36,Lin

23、ux內(nèi)核的編譯、安裝過(guò)程(續(xù)),Linux內(nèi)核環(huán)境,lilo.conf修改方法 image=/boot/vmlinux-2.4.7-10/ 舊內(nèi)核 label=linux read-only root=/dev/hdal image=/boot/zImage-x.y.z / 新內(nèi)核 label=newkernel read-only root=/dev/hdal 注意:必須運(yùn)行l(wèi)ilo命令將激活新配置。如果是grub,則不需要。,37,Linux內(nèi)核的編譯、安裝過(guò)程(續(xù)),38,Linux系統(tǒng)的文件系統(tǒng)結(jié)構(gòu),/:文件系統(tǒng)結(jié)構(gòu)的起始點(diǎn) /home:用戶主目錄 /bin:標(biāo)準(zhǔn)指令和工具程序 /us

24、r :系統(tǒng)使用文件和指令 /usr/bin:用戶命令和工具程序 /usr/sbin:系統(tǒng)管理員命令 /usr/lib:編程語(yǔ)言庫(kù),/usr/doc:Linux文檔 /usr/man:在線聯(lián)機(jī)幫助手冊(cè) /usr/spool:假脫機(jī)文件 /sbin:管理員開啟系統(tǒng)的命令 /var:時(shí)變文件,例如郵箱文件 /dev:設(shè)備文件接口 /etc:系統(tǒng)配置文件及其它系統(tǒng)文件,Linux內(nèi)核環(huán)境,39,主要內(nèi)容,Linux簡(jiǎn)介 Linux內(nèi)核環(huán)境 Linux編程環(huán)境 GNU make管理項(xiàng)目 Linux的程序執(zhí)行機(jī)制,40,Linux系統(tǒng)的用戶視圖,Linux編程環(huán)境,41,C程序員的系統(tǒng)視圖,Linux編程

25、環(huán)境,42,系統(tǒng)調(diào)用與函數(shù)庫(kù),系統(tǒng)調(diào)用 Linux內(nèi)核的對(duì)外接口 用戶程序和內(nèi)核之間唯一的接口 函數(shù)庫(kù) 依賴于系統(tǒng)調(diào)用 標(biāo)準(zhǔn)函數(shù)庫(kù)建立在系統(tǒng)調(diào)用的上層,提供的功能比系統(tǒng)調(diào)用強(qiáng),使用也比較方便 靜態(tài)庫(kù)(.a文件) 動(dòng)態(tài)庫(kù)/共享庫(kù) (.so文件),Linux編程環(huán)境,43,Linux支持的編程語(yǔ)言,高級(jí)編程語(yǔ)言 C/C+, Java, Fortran ELF二進(jìn)制格式 Executable and Linkable Format 工具接口標(biāo)準(zhǔn)委員會(huì)(TIS)選擇ELF體系作為不同操作系統(tǒng)之間可移植的二進(jìn)制文件格式 腳本 Shell: sh/bash, csh, ksh Perl, Python,

26、tcl/tk, sed, awk,Linux編程環(huán)境,44,文件名后綴,Linux編程環(huán)境,45,集成環(huán)境,集成開發(fā)環(huán)境IDE Emacs/xemacs Kdevelop Eclipse 命令行開發(fā)環(huán)境 編輯器 vi/vim/gvim, emacs/xemacs, pico 代碼閱讀器 source navigator,vi/emacs+ ctags/etags 配置工具 automake, autoconf, ,Linux編程環(huán)境,46,GNU開發(fā)工具,GCC GNU C編譯器 Binutils 輔助GCC的主要軟件 GDB GNU調(diào)試工具 gdb調(diào)試命令 二進(jìn)制代碼工具 as, ld, a

27、r, ldd Make CVS 版本控制,Linux編程環(huán)境,47,GCC,GCC不只是一個(gè)C編譯器 GCC = GNU Compiler Collection GCC支持多種高級(jí)語(yǔ)言的編譯 C、C+ ADA Object C JAVA Fortran PASCAL,Linux編程環(huán)境,48,GCC工具,cpp 預(yù)處理器 GNU C編譯器在編譯前自動(dòng)使用cpp對(duì)程序進(jìn)行預(yù)處理 gcc 符合ISO等標(biāo)準(zhǔn)的C編譯器 g+ 基本符合ISO標(biāo)準(zhǔn)的C+編譯器 gcj GCC的java前端 gnat GCC的GNU ADA 95前端,Linux編程環(huán)境,49,GNU工具gcc,是一個(gè)強(qiáng)大的工具集合,包含預(yù)

28、處理器、編譯器、匯編器、鏈接器等組件 由輸入文件類型和傳遞的參數(shù)決定gcc具體調(diào)用的組件 為開發(fā)者提供足夠多的參數(shù),可讓開發(fā)者全面控制代碼的生成 gcc下的C程序編譯過(guò)程 預(yù)處理 編譯成匯編代碼 匯編成目標(biāo)代碼 鏈接,Linux編程環(huán)境,50,gcc使用舉例,源程序,Linux編程環(huán)境,51,gcc使用舉例,編譯和運(yùn)行 參數(shù)-o:指定目標(biāo)名稱(缺省gcc編譯出來(lái)的文件是a.out) 參數(shù)-ansi:關(guān)閉GNU C中與ANSI C不兼容特性,激活A(yù)NSI C專有特性 包括禁止一些asminlinetypeof關(guān)鍵字,以及UNIX,vax等預(yù)處理宏,編譯,運(yùn)行,Linux編程環(huán)境,52,gcc的工

29、作過(guò)程,使用-v選項(xiàng),可看到許多被隱藏的信息,Linux編程環(huán)境,53,預(yù)處理,使用-E參數(shù)激活預(yù)處理,輸出文件的后綴為“.cpp” gcc E o gcctest.cpp gcctest.c 使用wc命令比較預(yù)處理后的文件與源文件,可以看到兩個(gè)文件的差異,Linux編程環(huán)境,54,行數(shù) 單詞數(shù) 字節(jié)數(shù),預(yù)編譯,wc命令示例,Linux編程環(huán)境,55,編譯成匯編代碼,預(yù)處理文件匯編代碼 使用-x參數(shù)說(shuō)明根據(jù)指定的步驟進(jìn)行工作 cpp-output指明從預(yù)處理得到的文件開始編譯 使用-S說(shuō)明生成匯編代碼后停止工作 gcc x cpp-output S o gcctest.s gcctest.cp

30、p 也可以直接編譯到匯編代碼 gcc S gcctest.c,Linux編程環(huán)境,56,編譯成匯編代碼,直接編譯到匯編代碼,Linux編程環(huán)境,預(yù)處理文件匯編代碼,57,編譯成目標(biāo)代碼,匯編代碼目標(biāo)代碼 gcc x assembler c gcctest.s -c:只編譯不鏈接,匯編代碼目標(biāo)代碼,Linux編程環(huán)境,58,編譯成目標(biāo)代碼,直接編譯成目標(biāo)代碼 gcc c gcctest.c 使用匯編器生成目標(biāo)代碼 as o gcctest.o gcctest.s,直接編譯成目標(biāo)代碼,使用匯編器,Linux編程環(huán)境,59,編譯成執(zhí)行代碼,目標(biāo)代碼執(zhí)行代碼 gcc o gcctest gcctest

31、.o 直接生成執(zhí)行代碼 gcc o gcctest gcctest.c,Linux編程環(huán)境,60,gcc的高級(jí)選項(xiàng),-Wall:打開所有的警告信息,Linux編程環(huán)境,61,根據(jù)警告信息檢查源程序,main函數(shù)的返回值為int,在函數(shù)的末尾應(yīng)當(dāng)返回一個(gè)值,Linux編程環(huán)境,62,修改源程序,Linux編程環(huán)境,63,gcc優(yōu)化編譯,優(yōu)化編譯選項(xiàng) -O0:缺省情況,不優(yōu)化 -O1:第一級(jí)優(yōu)化 優(yōu)化取決于目標(biāo)處理器 通常包括線程跳轉(zhuǎn)(減少跳轉(zhuǎn)次數(shù))、延遲退棧(在嵌套函數(shù)調(diào)用時(shí)推遲退棧時(shí)間,直到遞歸結(jié)束) -O2: 包括O1級(jí)優(yōu)化 調(diào)整處理器指令執(zhí)行時(shí)序,優(yōu)化處理器在等待其他指令結(jié)果或數(shù)據(jù)延遲時(shí)可

32、執(zhí)行其他不相關(guān)指令 -O3 包括O2級(jí)優(yōu)化 使內(nèi)嵌函數(shù)、循環(huán)展開 執(zhí)行與特定處理器特性相關(guān)的優(yōu)化,Linux編程環(huán)境,64,gcc優(yōu)化編譯舉例,不同的優(yōu)化 編譯選項(xiàng),Linux編程環(huán)境,65,gcc優(yōu)化編譯舉例(續(xù)),使用time命令統(tǒng)計(jì)程序的運(yùn)行,Linux編程環(huán)境,66,67,GNU binutils簡(jiǎn)介,是一組二進(jìn)制工具程序集 addr2line 將程序地址轉(zhuǎn)換為文件名和行號(hào) 在命令行中給出地址和可執(zhí)行文件名,使用可執(zhí)行文件的調(diào)試信息指出對(duì)應(yīng)源文件以及行號(hào) ar 建立、修改、提取歸檔文件 歸檔文件結(jié)構(gòu)保證可恢復(fù)原始文件內(nèi)容 as GNU匯編器,主要用來(lái)編譯gcc輸出的匯編文件 將匯編代碼

33、轉(zhuǎn)換成目標(biāo)代碼,并放到一個(gè)文件 該目標(biāo)文件將由連接器ld連接 ld 連接器,將目標(biāo)和歸檔文件結(jié)合起來(lái)形成可執(zhí)行文件 通常,建立一個(gè)新編譯程序的最后一步就是調(diào)用ld,Linux編程環(huán)境,68,GNU binutils簡(jiǎn)介(續(xù)),nm 列出目標(biāo)文件中的符號(hào) objcopy 將一種類型目標(biāo)文件轉(zhuǎn)換成另一種類型的目標(biāo)文件 objdump 顯示一個(gè)或更多目標(biāo)文件的信息 使用選項(xiàng)來(lái)控制其顯示的信息 ranlib 產(chǎn)生歸檔文件索引,并將其保存到這個(gè)歸檔文件中 索引列出歸檔文件各成員所定義的可重分配目標(biāo)文件 readelf 顯示elf格式可執(zhí)行文件的信息 size 列出目標(biāo)文件每一段的大小以及總體的大小,Li

34、nux編程環(huán)境,69,ar,用于建立、修改、提取歸檔文件(archive) 一個(gè)歸檔文件可包含多個(gè)文件(也可認(rèn)為歸檔文件是一個(gè)庫(kù)文件) 歸檔文件保存被包含原始文件的內(nèi)容、權(quán)限、時(shí)間戳、所有者等屬性,在提取后可被還原,Linux編程環(huán)境,70,使用ar建立庫(kù)文件,源程序add.c和minus.c,Linux編程環(huán)境,71,使用ar建立庫(kù)文件(續(xù)),編譯成目標(biāo)文件,將庫(kù)文件拷貝到/usr/lib目錄下,ar的rv參數(shù)的說(shuō)明: r:將多個(gè)文件組成一個(gè)文件 v:輸出信息,Linux編程環(huán)境,72,調(diào)用ar建立的庫(kù)文件,代碼中使用Add和Minus函數(shù),Linux編程環(huán)境,73,調(diào)用ar建立的庫(kù)文件(續(xù)

35、),在編譯時(shí)指定庫(kù)文件,指明將libtest.a鏈接進(jìn)來(lái),運(yùn)行結(jié)果,Linux編程環(huán)境,74,nm,列出目標(biāo)文件中的符號(hào) 程序員可定位和分析執(zhí)行程序/目標(biāo)文件中的符號(hào)信息及其屬性 顯示的符號(hào)類型 A:符號(hào)的值是絕對(duì)值,不會(huì)被將來(lái)的鏈接所改變 B:符號(hào)位于未初始化數(shù)據(jù)部分(BSS段) C:符號(hào)是公共的 公共符號(hào)是未初始化的數(shù)據(jù) 在鏈接時(shí),多個(gè)公共符號(hào)可能以相同的名字出現(xiàn) 如果符號(hào)在其他地方被定義,則該文件中的這個(gè)符號(hào)會(huì)被當(dāng)作引用來(lái)處理 D:符號(hào)位于已初始化的數(shù)據(jù)部分(data段) T:符號(hào)位于代碼部分(text段) U:符號(hào)未被定義 ?:符號(hào)類型未知或目標(biāo)文件格式特殊,Linux編程環(huán)境,75,

36、nm使用舉例,Linux編程環(huán)境,76,objcopy,將一種格式文件生成另一種格式文件,使用file命令查看文件類型,生成srec格式的目標(biāo)文件,使用file命令查看新文件的類型,Linux編程環(huán)境,77,Linux的可執(zhí)行文件格式,a.out格式(assembler and link editor output) 早期UNIX系統(tǒng)使用的可執(zhí)行文件格式 文件頭部結(jié)構(gòu)定義(include/asm-x86/a.out.h) 現(xiàn)在基本被ELF文件格式代替 COFF格式(Common Object File Format) 包括文件頭、可選頭部及一些節(jié)(section) .text, .data和.

37、bss區(qū)段各有一個(gè)小節(jié),還可包含其他區(qū)段 一個(gè)可選頭部,對(duì)不同操作系統(tǒng)作特定定義 文件定義位置:include/linux/coff.h ELF格式(Executable and Linking Format) 代碼、鏈接和注釋都以段存在,節(jié)點(diǎn)表(Section Header Table)有一個(gè)表項(xiàng)與每個(gè)小節(jié)對(duì)應(yīng) 文件類型:.o目標(biāo)文件、.so動(dòng)態(tài)庫(kù)文件、可執(zhí)行文件 ELF格式可以比COFF格式包含更多的調(diào)試信息 SREC MOTOROLA S-Recoder格式(S記錄格式文件),Linux編程環(huán)境,78,objdump,顯示一個(gè)或多個(gè)目標(biāo)文件的信息 由相應(yīng)選項(xiàng)控制顯示哪些信息 可通過(guò)該工具

38、查看執(zhí)行文件或庫(kù)文件的信息 objdump對(duì)編寫編譯工具、分析代碼執(zhí)行機(jī)制非常有用,Linux編程環(huán)境,79,objdump使用舉例,-f選項(xiàng):顯示文件頭內(nèi)容,Linux編程環(huán)境,80,objdump使用舉例(續(xù)),-d選項(xiàng)進(jìn)行反匯編,Linux編程環(huán)境,81,readelf,顯示一個(gè)或多個(gè)ELF格式的目標(biāo)文件信息,Linux編程環(huán)境,82,GNU gdb,gdb = GNU debuger 設(shè)置斷點(diǎn) 監(jiān)視、修改變量 單步執(zhí)行 顯示/修改寄存器的值 查看堆棧 遠(yuǎn)程調(diào)試,Linux編程環(huán)境,83,gdb常用命令,Linux編程環(huán)境,84,gdb使用舉例,源代碼如下,編譯: gcc o bug b

39、ug.c,Linux編程環(huán)境,85,gdb使用舉例,編譯并運(yùn)行,?,編譯,Linux編程環(huán)境,86,使用gdb調(diào)試bug,運(yùn)行bug,輸入字符串hello,顯示出錯(cuò)位置,能不能看到源代碼呢?,Linux編程環(huán)境,87,使用gcc的-g參數(shù),gcc g o bug bug.c -g:在可執(zhí)行程序中包含標(biāo)準(zhǔn)調(diào)試信息 重新調(diào)試,列出源代碼,Linux編程環(huán)境,88,使用gcc的-g參數(shù),?怎么修改前面的源代碼呢?,設(shè)置斷點(diǎn),Linux編程環(huán)境,89,主要內(nèi)容,Linux簡(jiǎn)介 Linux內(nèi)核環(huán)境 Linux編程環(huán)境 GNU make管理項(xiàng)目 Linux的程序執(zhí)行機(jī)制,90,GNU make,代碼維護(hù)工

40、具,使用GNU編譯開發(fā)大型應(yīng)用時(shí)常需要使用make管理項(xiàng)目 避免重復(fù)使用多個(gè)復(fù)雜命令行維護(hù)項(xiàng)目和生成目標(biāo)代碼 make通過(guò)將命令行保存到Makefile中簡(jiǎn)化編譯工作 make根據(jù)Makefile中定義的規(guī)則和步驟及各個(gè)模塊的更新情況,自動(dòng)完成整個(gè)軟件項(xiàng)目的維護(hù)和代碼生成工作 make可識(shí)別Makefile中的被修改文件,并在再次編譯的時(shí)候只編譯這些文件,從而提高編譯的效率 make會(huì)檢查文件的修改和生成時(shí)間戳 如果目標(biāo)文件的修改或者生成時(shí)間戳比它的任意一個(gè)依賴文件舊,則make就執(zhí)行makefile文件中描述的相應(yīng)命令,以便更新目的文件,Linux make管理項(xiàng)目,91,GNU make特

41、點(diǎn),適合于支持多文件構(gòu)成的大中型軟件項(xiàng)目的編譯、鏈接、清除中間文件等管理工作 提供和識(shí)別多種默認(rèn)規(guī)則,方便對(duì)大型軟件項(xiàng)目的管理 支持對(duì)多目錄的軟件項(xiàng)目進(jìn)行遞歸管理 對(duì)軟件項(xiàng)目具有很好的可維護(hù)性和擴(kuò)展性,Linux make管理項(xiàng)目,92,Makefile,Makefile被make讀取 Makefile主要工作 定義依賴關(guān)系 生成目標(biāo)文件所依賴的文件列表 需要用什么命令來(lái)產(chǎn)生目標(biāo)文件的最新版本 定義編譯、鏈接等相關(guān)參數(shù),Linux make管理項(xiàng)目,93,Makefile的規(guī)則,規(guī)則內(nèi)容 要?jiǎng)?chuàng)建的目標(biāo)(文件) 創(chuàng)建目標(biāo)(文件)所依賴的文件列表 通過(guò)依賴文件創(chuàng)建目標(biāo)文件的命令組 規(guī)則一般形式 t

42、arget . : prerequisites . command . .,規(guī)則,依賴性,操作命令,gcc c main.c,main.o: main.c sum.h,tab,目標(biāo),Linux make管理項(xiàng)目,94,簡(jiǎn)單Makefile示例,edit : main.o kbd.o command.o display.o insert.o search.o files.o utils.o cc -o edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o main.o : main.c defs.h cc

43、-c main.c kbd.o : kbd.c defs.h command.h cc -c kbd.c command.o : command.c defs.h command.h cc -c command.c display.o : display.c defs.h buffer.h cc -c display.c insert.o : insert.c defs.h buffer.h cc -c insert.c search.o : search.c defs.h buffer.h cc -c search.c files.o : files.c defs.h buffer.h co

44、mmand.h cc -c files.c utils.o : utils.c defs.h cc -c utils.c clean : rm edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o,Linux make管理項(xiàng)目,95,make的工作過(guò)程,缺省情況下從Makefile中的第一個(gè)目標(biāo)開始執(zhí)行 執(zhí)行過(guò)程類似一次深度優(yōu)先遍歷,sum: main.o sum.o gcc o sum main.o sum.o main.o: main.c sum.h gcc c main.c sum.o: sum.c

45、 sum.h gcc c sum.c,Linux make管理項(xiàng)目,96,默認(rèn)依賴規(guī)則說(shuō)明,.o依賴于相應(yīng)的.c文件,sum: main.o sum.o gcc o sum main.o sum.o main.o: main.c sum.h gcc c main.c sum.o: sum.c sum.h gcc c sum.c,sum: main.o sum.o gcc o sum main.o sum.o main.o: sum.h gcc c main.c sum.o: sum.h gcc c sum.c,Linux make管理項(xiàng)目,97,Makefile中的變量,變量功能 降低錯(cuò)誤風(fēng)險(xiǎn)

46、,簡(jiǎn)化Makefile 貯存一個(gè)文件名列表 貯存可執(zhí)行文件名 貯存編譯器標(biāo)志參數(shù) 變量使用示例:objects變量($(objects)) objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.o edit: $(objects) cc -o edit $(objects),Linux make管理項(xiàng)目,98,預(yù)定義變量,make可直接使用許多預(yù)定義的變量 AR:歸檔維護(hù)程序的名稱,默認(rèn)值為 ar ARFLAGS:歸檔維護(hù)程序的選項(xiàng) AS:匯編程序的名稱,默認(rèn)值為 as ASFLAGS:匯編程序的選

47、項(xiàng) CC:C 編譯器的名稱,默認(rèn)值為 cc CFLAGS:C 編譯器的選項(xiàng) CXX:C+ 編譯器的名稱,默認(rèn)值為 g+ CPPFLAGS:C 預(yù)編譯的選項(xiàng) 系統(tǒng)環(huán)境變量的處理 make 過(guò)程中被解釋成make變量,Linux make管理項(xiàng)目,99,簡(jiǎn)化后Makefile文件,objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.o edit : $(objects) cc -o edit $(objects) main.o : defs.h kbd.o : defs.h command.h com

48、mand.o : defs.h command.h display.o : defs.h buffer.h insert.o : defs.h buffer.h search.o : defs.h buffer.h files.o : defs.h buffer.h command.h utils.o : defs.h .PHONY : clean clean : rm edit $(objects),Linux make管理項(xiàng)目,100,內(nèi)部變量,$:目標(biāo)文件的完整名稱 $*:不包含擴(kuò)展名的目標(biāo)文件名稱 $:依賴列表中的第一個(gè)依賴文件 $+:所有的依賴文件 以空格分開,并以出現(xiàn)的先后為序,可

49、能包含重復(fù)的依賴文件 $:整個(gè)依賴列表(除去所有重復(fù)的文件名) $? :所有的依賴文件 以空格分開,這些依賴文件的修改日期比目標(biāo)的創(chuàng)建日期晚 $%:若目標(biāo)是歸檔成員,則該變量表示目標(biāo)的歸檔成員名 例如,如果目標(biāo)名稱為 mytarget.so(image.o) $ 為 mytarget.so $% 為 image.o 舉例 CC = gccCFLAGS = -Wall -O -g foo.o : foo.c foo.h bar.h$(CC) $(CFLAGS) -c $ -o $,Linux make管理項(xiàng)目,101,隱式規(guī)則 (Implicit Rules),也稱預(yù)定義規(guī)則 告訴make在沒(méi)有

50、給出某些命令的時(shí)候如何處理 舉例 objects = main.o kbd.o command.o utils.o edit: $(objects) cc -o edit $(objects) 問(wèn)題:沒(méi)有定義如何編譯生成這些目標(biāo)的規(guī)則 對(duì)名為somefile.o的目標(biāo)文件,make首先找與之對(duì)應(yīng)的源代碼somefile.c,并用gcc c somefile.c o somefile.o編譯生成目標(biāo)代碼 注意 若在工作目錄下有對(duì)應(yīng)的somefile.p文件,make會(huì)激活pascal編譯器工作 可使用預(yù)定義變量改變隱含規(guī)則的工作方式,如 $(CC) $(CFLAGS) $(CPPFLAGS) $

51、(TARGET_ARCH) -c $ -o $,Linux make管理項(xiàng)目,102,擴(kuò)展make隱式規(guī)則的方法 類似于普通規(guī)則,但目標(biāo)必定含有符號(hào)% 該符號(hào)可與任何非空字符串匹配 為與目標(biāo)中的”%”匹配,該規(guī)則關(guān)聯(lián)的相關(guān)文件部分也必須使用”%” 舉例 %.o : %.c make從somefile.c文件為所有形為somefile.o的文件somefile.o目標(biāo) make定義的模式規(guī)則 %.o : %.c $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $ -o $,103,模式規(guī)則,Linux make管理項(xiàng)目,104,偽目標(biāo)PHONY,不對(duì)應(yīng)

52、于實(shí)際的文件,目標(biāo)體規(guī)定make執(zhí)行的命令 clean: $rm *.o exec_file 由于目標(biāo)體clean沒(méi)有依賴體,make認(rèn)為其是最新的而不執(zhí)行任何操作,因此它將永遠(yuǎn)不會(huì)被執(zhí)行 若需執(zhí)行,需顯式執(zhí)行命令 make clean 解決方法:. PHONY PHONY的依賴體文件的含義與通常一樣 make不檢查是否存在有文件名與依賴體中的一個(gè)名字相匹配的文件,而直接執(zhí)行與之相應(yīng)的命令 .PHONY: clean clean: $rm *.o exec_file,Linux make管理項(xiàng)目,PHONY目標(biāo)也可以有依賴關(guān)系 當(dāng)一個(gè)目錄中有多個(gè)程序,將其放在一個(gè)makefile 中會(huì)更方便

53、因?yàn)槿笔∧繕?biāo)是makefile 中的第一個(gè)目標(biāo),通常將這個(gè)phony 目標(biāo)叫做all,其依賴文件為各個(gè)程序 all : prog1 prog2 prog3.PHONY: allprog1 : prog1.o utils.occ -o prog1 prog1.o utils.oprog2 : prog2.occ -o prog2 prog2.oprog3 : prog3.o sort.o utils.occ -o prog3 prog3.o sort.o utils.o,105,偽目標(biāo)PHONY(續(xù)),Linux make管理項(xiàng)目,106,Makefile中的函數(shù),計(jì)算待操作的文件、目標(biāo)或待執(zhí)行

54、的命令 使用方法 $(function arguments) 典型函數(shù) $(subst from, to, text) :替換字符串 $(subst ee, EE, feet on the street) 相當(dāng)于fEEt on the strEEt $(patsubst pattern, replacement, text) $(patsubst %.c,%.o, x.c.c bar.c) 相當(dāng)于x.c.o bar.o $(wildcard pattern) :列出當(dāng)前目錄下所有符合模式pattern格式的文件名 $(wildcard *.c) objects := $(wildcard *.

55、o),Linux make管理項(xiàng)目,107,Makefile中的條件語(yǔ)句,四種條件語(yǔ)句 ifeq.else.endif ifneqelseendif ifdefelseendif ifndef.elseendif,conditional-directive text-if-true endif 或 conditional-directive text-if-true else text-if-false endif,Linux make管理項(xiàng)目,108,帶條件的makefile舉例,sum: main.o sum.o gcc o sum main.o sum.o main.o: main.c

56、sum.h gcc c main.c #deciding which file to compile to create sum.o ifeq ($(USE_SUM), 1) sum.o: sum1.c sum.h gcc c sum1.c o $ else sum.o: sum2.c sum.h gcc c sum2.c o $ endif,Linux make管理項(xiàng)目,109,可移植GNU 包的典型安裝方法,下載源代碼包foo-1.0.tar.gz tar xvzf foo-1.0.tar.gz cd foo-1.0 ./configure make (su) make install,問(wèn)

57、題1:配置腳configure是如何生成的?,問(wèn)題2:configure腳本怎么知道該如何生成Makefile?,幕后英雄:GNU Auto 工具 autoconf, automake, libtool, autoscan, autoheader,Linux make管理項(xiàng)目,110,autoconf框架圖,autoscan,configure.scan,configure.in,Makefile.am,Makefile.in,Makefile,automake,edit,aclocal.m4,aclocal,configure,autoconf,Src code,autoscan,./con

58、figure,Linux make管理項(xiàng)目,autoheader,為軟件包創(chuàng)建configure. scan文件 從源文件中抽取與函數(shù)調(diào)用和頭文件相關(guān)的信息,并為相應(yīng)包創(chuàng)建一個(gè) configure.scan文件(configure.in前身) autoscan在以命令行參數(shù)中指定的目錄為根(如果未給定參數(shù),則以當(dāng)前目錄為根)的目錄樹中檢查源文件 基于perl語(yǔ)言實(shí)現(xiàn),111,autoconf流程 autoscan,./configure,Linux make管理項(xiàng)目,autoheader,configure.scan示例,112,autoconf流程 autoscan(續(xù)),AC_PREREQ

59、(2.64) /表明文件所需要的autoscan版本#AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS) AC_INIT(hello, 1.0, ) #偵測(cè)所指定源代碼文件是否存在,來(lái)確定源代碼目錄的有效性 AC_CONFIG_SRCDIR(helloworld.c) #用來(lái)生成config.h文件,以便autoheader使用 AC_CONFIG_HEADERS(config.h) #指定編譯器,如果不指定,選用默認(rèn)gcc AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_OUTPUT(Makefile ),Linux

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論