Linux系統(tǒng)分析基礎(chǔ)_第1頁
Linux系統(tǒng)分析基礎(chǔ)_第2頁
Linux系統(tǒng)分析基礎(chǔ)_第3頁
Linux系統(tǒng)分析基礎(chǔ)_第4頁
Linux系統(tǒng)分析基礎(chǔ)_第5頁
已閱讀5頁,還剩143頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

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

4、建立在GNU軟件之上核心結(jié)構(gòu)Linux內(nèi)核Linux ShellLinux文件系統(tǒng)Linux應用系統(tǒng)GNU Tools7Linux精髓Linux簡介8Linux的系統(tǒng)結(jié)構(gòu)用戶應用程序系統(tǒng)調(diào)用硬件資源管理接口Shell,庫函數(shù)內(nèi)核實現(xiàn)Linux簡介用戶態(tài)核心態(tài)不區(qū)分的缺陷用戶直接修改操作系統(tǒng)的數(shù)據(jù)用戶直接調(diào)用操作系統(tǒng)的內(nèi)部函數(shù)用戶直接操作外設用戶任意讀/寫物理內(nèi)存區(qū)分的意義禁止用戶程序和底層硬件直接打交道如果用戶程序往硬件控制寄存器寫入不恰當?shù)闹?,可能導致硬件無法正常工作禁止用戶程序訪問任意物理內(nèi)存,否則可能會破壞其他程序的正常執(zhí)行如果對核心內(nèi)核所在的地址空間寫入數(shù)據(jù),會導致系統(tǒng)崩潰9劃分用戶態(tài)

5、/內(nèi)核態(tài)的必要性Linux簡介現(xiàn)代CPU都有幾種不同指令執(zhí)行級別在高執(zhí)行級別下,代碼可以執(zhí)行特權(quán)指令,訪問任意的物理地址,這種CPU執(zhí)行級別就對應著內(nèi)核態(tài)在相應低級別執(zhí)行狀態(tài)下,代碼的掌控范圍會受到限制,只能在對應級別允許的范圍內(nèi)活動舉例intel x86 CPU有四種不同的執(zhí)行級別0-3Linux只使用0級和3級分別表示內(nèi)核態(tài)和用戶態(tài)10CPU對用戶態(tài)/和心態(tài)劃分的支持Linux簡介cs寄存器最低兩位表明當前代碼的特權(quán)級CPU每條指令的讀取都是通過cs:eip這兩個寄存器cs:代碼段選擇寄存器eip:偏移量寄存器上述判斷由硬件完成在Linux中,地址空間是一個顯著的標志0 xc0000000

6、以上地址空間:只能在內(nèi)核態(tài)下訪問0 x00000000 0 xbfffffff的地址空間:兩種狀態(tài)下都可訪問注意,這里的地址空間是邏輯地址而不是物理地址11用戶態(tài)/和心態(tài)的區(qū)分方法Linux簡介Linux是單內(nèi)核、多模塊系統(tǒng)Linux內(nèi)核運行在單獨的內(nèi)核地址空間所有操作系統(tǒng)功能作為一個模塊實現(xiàn)在其內(nèi)核中模塊均運行在內(nèi)核態(tài),直接調(diào)用函數(shù),無需消息傳遞具備模塊化設計、搶占式內(nèi)核(Linux 2.6支持,Linux 2.4用戶級搶占)、支持內(nèi)核線程及動態(tài)裝載內(nèi)核模塊的能力與Unix主要區(qū)別Linux汲取了微內(nèi)核設計思想(基于模塊定制內(nèi)核)Unix也是單內(nèi)核系統(tǒng)Windows NT和Mach是微內(nèi)核系

7、統(tǒng)只提供基礎(chǔ)功能,其他功能通過服務實現(xiàn)微內(nèi)核功能被劃分為多個獨立過程,每個過程稱為服務器12Linux的內(nèi)核特點Linux簡介13Linux單內(nèi)核結(jié)構(gòu)用戶態(tài)標準函數(shù)庫系統(tǒng)調(diào)用(POSIX標準)接口模塊內(nèi)核(進程管理、存儲管理、文件管理、設備管理、網(wǎng)絡管理)設備驅(qū)動計算機硬件核心態(tài)單內(nèi)核模塊接口驅(qū)動接口應用程序Linux簡介14Linux的內(nèi)核版本Linux內(nèi)核版本指由Linux開發(fā)小組(Linus Torvalds總協(xié)調(diào))開發(fā)出系統(tǒng)內(nèi)核的版本號 Linux內(nèi)核采用雙樹系統(tǒng)一棵是穩(wěn)定樹,主要用于發(fā)行另一棵是非穩(wěn)定樹(開發(fā)樹),用于產(chǎn)品開發(fā)和改進 Linux內(nèi)核版本號由3位數(shù)字組成 r.x.y第1

8、位數(shù)字r為主版本號 第2位數(shù)字x為說明版本類型的次版本號: 偶數(shù)表示產(chǎn)品化版本 奇數(shù)表示實驗版本 第3位數(shù)字y為修改號,表示錯誤修補的次數(shù) Linux簡介15主流的Linux發(fā)行版本Linux簡介16Linux與Windows的區(qū)別文件系統(tǒng)Linux需要一個掛載根目錄/的ext分區(qū)和一個作為虛擬內(nèi)存的swap分區(qū)Linux沒有盤符,可通過設備名掛載,掛在信息在/dev/fstab,如mount -t ntfs /dev/sda1 /mnt/win_cLinux將所有設備都映射成/dev目錄下的一個文件用戶管理系統(tǒng)管理員是root,使用su命令切換Linux簡介17主要內(nèi)容Linux簡介Linu

9、x內(nèi)核環(huán)境Linux編程環(huán)境Linux的系統(tǒng)初始化Linux的程序執(zhí)行機制18Linux內(nèi)核核心組成進程調(diào)度程序:負責控制進程訪問CPU內(nèi)核管理程序:支持虛擬內(nèi)存及多進程安全共享主存系統(tǒng)虛擬文件系統(tǒng):抽象異構(gòu)硬件設備細節(jié),提供公共文件接口網(wǎng)絡接口:提供對多種組網(wǎng)標準和網(wǎng)絡硬件的訪問進程間通信:為進程之間的通信提供實現(xiàn)機制Linux內(nèi)核環(huán)境19Linux內(nèi)核源碼的獲取下載位置以GNU zip和bzip2形式發(fā)布安裝位置一般安裝在/usr/src/linux,不要將該源碼樹用于開發(fā)在編譯自己編寫的C庫所用的內(nèi)核版本要鏈接到該樹不要以root身份對內(nèi)核進行修改,應先建立自己的主目錄,僅以root身份

10、安裝新內(nèi)核安裝新內(nèi)核應該保持/usr/src/linux原封不動Linux內(nèi)核環(huán)境20Linux核心源碼結(jié)構(gòu)Linux內(nèi)核環(huán)境21Linux核心源碼的組織arch 目錄包含與體系結(jié)構(gòu)相關(guān)的核心代碼,相關(guān).h文件則放在include/asm下支持的每種CPU均有相應子目錄,包含boot、kernel、lib和mm等子目錄/kernel目錄存放大多數(shù)內(nèi)核函數(shù)主要文件包括sched.c、time.c、sys.c、itimer.c、fork.c、signal.c、softirq.c、resource.c、dma.c、printk.c等/mm子目錄獨立于體系結(jié)構(gòu)的主存管理文件包括實現(xiàn)虛擬主存管理的源代碼

11、Linux內(nèi)核環(huán)境/fs目錄存放VFS和系統(tǒng)支持的各種文件系統(tǒng)源代碼每個子目錄對應一個特定文件系統(tǒng)/include目錄存放重要的內(nèi)核.h頭文件為各種CPU專設一個子目錄通用子目錄include/linux、include/net/ipc目錄存放處理進程間通信所需源代碼22Linux核心源碼的組織(續(xù))Linux內(nèi)核環(huán)境/drivers目錄 存放所有設備驅(qū)動程序源代碼/net子目錄存放網(wǎng)絡子系統(tǒng),如各種網(wǎng)卡和網(wǎng)絡規(guī)程驅(qū)動程序/security目錄存放安全子系統(tǒng)代碼/sound目錄存放語音子系統(tǒng)代碼23Linux核心源碼的組織(續(xù))Linux內(nèi)核環(huán)境/init目錄存放內(nèi)核引導和初始化代碼許多重要文

12、件,如main.c、version.c就位于該目錄下/lib目錄存放內(nèi)核需要的通用工具性內(nèi)核函數(shù)(如對出錯信息的處理),它能夠在引導時解壓內(nèi)核并裝入主存/scripts目錄存放編譯內(nèi)核所用腳本和用于系統(tǒng)配置的命令文件/documentation目錄存放內(nèi)核源代碼文檔24Linux核心源碼的組織(續(xù))Linux內(nèi)核環(huán)境采用模塊化的內(nèi)核配置系統(tǒng)內(nèi)核模塊(Loadable Kernel Module)的概念模塊實際上是一種目標對象文件,沒有鏈接,不能獨立運行但是其代碼可以在系統(tǒng)運行時鏈接到系統(tǒng)中作為內(nèi)核的一部分運行,或從內(nèi)核中取下,從而可以動態(tài)擴充內(nèi)核的功能(不需要重新編譯內(nèi)核)這種目標代碼通常由一

13、組函數(shù)和數(shù)據(jù)結(jié)構(gòu)組成25Linux內(nèi)核的配置組成Linux內(nèi)核環(huán)境使得內(nèi)核更加緊湊和靈活,可擴展 修改模塊時,不必全部重新編譯整個內(nèi)核系統(tǒng)如果需要使用新模塊,只要編譯相應的模塊,然后將模塊插入即可模塊可以不依賴于某個固定的硬件平臺模塊的目標代碼一旦被鏈接到內(nèi)核,它的作用域和靜態(tài)鏈接的內(nèi)核目標代碼完全等價26內(nèi)核模塊的優(yōu)點Linux內(nèi)核環(huán)境并不是所有地方都使用內(nèi)核模塊設備驅(qū)動程序文件系統(tǒng)驅(qū)動程序系統(tǒng)調(diào)用大部分系統(tǒng)調(diào)用屬于基礎(chǔ)內(nèi)核(Basic kernel),也可以以內(nèi)核模塊方式增加新的系統(tǒng)調(diào)用或者覆蓋現(xiàn)有基于內(nèi)核模塊方式實現(xiàn)的系統(tǒng)調(diào)用27內(nèi)核模塊的使用Linux內(nèi)核環(huán)境程序代碼:hellowor

14、ld.c編譯、安裝方法root# gcc -c helloworld.croot# insmod helloworld.oroot# lsmodroot# rmmod helloworld28模塊示例#define MODULE#include int init_module(void) printk(“Hello World!n”);return 0;void cleanup_module(void) printk(“ Goodbye!n”);Linux內(nèi)核環(huán)境29內(nèi)核模塊與應用程序的差別C語言程序 模塊運行 用戶空間 內(nèi)核空間入口 main() init_module()出口 無 clea

15、nup_module()編譯 gcc -c gcc -c -D_KERNEL_-DMODULE連接 gcc insmod運行 直接運行 insmod調(diào)試 gdb kdbug, kdb, kgdb等 Linux內(nèi)核環(huán)境控制需要編譯到內(nèi)核的二進制映象(啟動時載入)和在需要時才裝入的內(nèi)核模塊配置選項命名形式:CONFIG_FEATURE如CONFIG_SMP表示支持對稱多處理器配置項選擇模式二選一:yes或no三選一:yes、no或moduleYes選項表示把代碼編譯進主內(nèi)核映象,而不作為模塊Module意味該配置項被選定,但編譯時該功能的實現(xiàn)代碼是以模塊形式生成驅(qū)動程序一般都用三選一形式字符串或整

16、數(shù)不控制編譯過程,只是指定內(nèi)核源碼可以訪問的值,如定義靜態(tài)變量一般以預處理宏的形式表示30Linux內(nèi)核編譯時的模塊選配參數(shù)Linux內(nèi)核環(huán)境內(nèi)核編譯主要工具文件內(nèi)核編譯后,會在/boot目錄生產(chǎn)以下文件vmlinuz文件initrd.img文件System.map文件31Linux內(nèi)核編譯的基本架構(gòu)文件類型作用Makefile頂層Makefile文件.config內(nèi)核配置文件arch/$(ARCH)/Makefile機器體系Makefile文件scripts/Makefile.*所有內(nèi)核Makefiles共用規(guī)則kbuild Makefiles其它Makefile文件Makefile定義編譯

17、鏈接規(guī)則、位于linux源代碼各目錄配置文件(config.in或kconfig)提供內(nèi)核的配置選擇和設置配置工具文本命令行工具:make config基于ncurse的圖形工具:make menuconfig基于X11的圖形工具:make xconfig基于gtk+的圖形工具:make gconfig創(chuàng)建默認配置:make defconfig配置工具輸出文件.config文件:用#include包括到主Makefile中include/linux/autoconf.h:用#include包括到各個.c文件每個.c文件都有代碼項32Linux內(nèi)核配置系統(tǒng)組成Linux內(nèi)核環(huán)境采用GNU編譯工具

18、對.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)建相應的依賴關(guān)系樹make clean:清除舊版本的目標文件make zImage:編譯并用gzip壓縮成1MB以下的內(nèi)核未壓縮的文件是vmlinuzmake bzImage:編譯并用gzip壓縮成1MB以上的內(nèi)核make modules:編譯模塊make

19、 modules_install :安裝模塊depmod a:生成模塊之間的依賴關(guān)系33主Makefile功能Linux內(nèi)核環(huán)境準備階段下載源碼:將源碼解壓到/usr/src目錄下tar xvjf linux-x.y.z.tar.bz2tar xvzf linux-x.y.z.tar.gz解壓位置:linux-x.y.z目錄下建立內(nèi)核編譯環(huán)境ln sf linux-x.y.z linux cd /usr/includerm -rf asm linux scsiln -sf /usr/src/linux/include/asm-i386 asmln -sf /usr/src/linux/incl

20、ude/linux linuxln -sf /usr/src/linux/include/scsi scsi34Linux內(nèi)核的編譯、安裝過程Linux內(nèi)核環(huán)境配置內(nèi)核檢查文件依賴關(guān)系正確性:make mrproper獲取默認.config文件:cp /boot/config-uname -r .config生成配置文件:make config創(chuàng)建依賴關(guān)系樹:make dep清除舊版本目標文件:make clean生成壓縮形式內(nèi)核文件:make bzImage或make zImage編譯后的文件在/usr/src/linux/arch/i386/boot目錄下編譯、安裝內(nèi)核編譯內(nèi)核:make編

21、譯模塊:make modules安裝模塊:make modules_install生成模塊依賴關(guān)系:depmod a安裝內(nèi)核:make install35Linux內(nèi)核的編譯、安裝過程(續(xù))Linux內(nèi)核環(huán)境配置啟動文件將內(nèi)核映像拷貝到合適位置,并按啟動要求啟動#cp /usr/src/linux/arch/i386/boot/zImage /boot/zImage-x.y.z#cp /usr/src/linux/System.map /boot/System.map-x.y.zln sf /boot/vmlinuz-x.y.z /boot/vmlinuzln sf /boot/System.

22、map-x.y.z /boot/system.map系統(tǒng)正常啟動時不會讀這個符號表;主要是為了內(nèi)核引導出錯時便于調(diào)試/sbin/mkinitrd /boot/initrd-x.y.z.img x.y.z如果是LILO啟動方式,編輯/etc/lilo.conf36Linux內(nèi)核的編譯、安裝過程(續(xù))Linux內(nèi)核環(huán)境lilo.conf修改方法image=/boot/vmlinux-2.4.7-10/ 舊內(nèi)核label=linuxread-onlyroot=/dev/hdalimage=/boot/zImage-x.y.z / 新內(nèi)核label=newkernelread-onlyroot=/de

23、v/hdal注意:必須運行l(wèi)ilo命令將激活新配置。如果是grub,則不需要。37Linux內(nèi)核的編譯、安裝過程(續(xù))38Linux系統(tǒng)的文件系統(tǒng)結(jié)構(gòu)/:文件系統(tǒng)結(jié)構(gòu)的起始點/home:用戶主目錄/bin:標準指令和工具程序/usr :系統(tǒng)使用文件和指令/usr/bin:用戶命令和工具程序/usr/sbin:系統(tǒng)管理員命令/usr/lib:編程語言庫/usr/doc:Linux文檔/usr/man:在線聯(lián)機幫助手冊/usr/spool:假脫機文件/sbin:管理員開啟系統(tǒng)的命令/var:時變文件,例如郵箱文件/dev:設備文件接口/etc:系統(tǒng)配置文件及其它系統(tǒng)文件Linux內(nèi)核環(huán)境39主要內(nèi)

24、容Linux簡介Linux內(nèi)核環(huán)境Linux編程環(huán)境GNU make管理項目Linux的程序執(zhí)行機制40Linux系統(tǒng)的用戶視圖文件子系統(tǒng)用戶硬 件 控 制硬 件內(nèi)核Shell用戶用戶用戶高級語言和實用程序系統(tǒng)調(diào)用進程管理子系統(tǒng)進程間通信存儲管理調(diào)度程序設備驅(qū)動程序字符設備塊設備高速緩存核外程序Linux編程環(huán)境41C程序員的系統(tǒng)視圖Linux編程環(huán)境42系統(tǒng)調(diào)用與函數(shù)庫系統(tǒng)調(diào)用Linux內(nèi)核的對外接口用戶程序和內(nèi)核之間唯一的接口函數(shù)庫依賴于系統(tǒng)調(diào)用標準函數(shù)庫建立在系統(tǒng)調(diào)用的上層,提供的功能比系統(tǒng)調(diào)用強,使用也比較方便靜態(tài)庫(.a文件)動態(tài)庫/共享庫 (.so文件)Linux編程環(huán)境43Lin

25、ux支持的編程語言高級編程語言C/C+, Java, FortranELF二進制格式Executable and Linkable Format工具接口標準委員會(TIS)選擇ELF體系作為不同操作系統(tǒng)之間可移植的二進制文件格式腳本 Shell: sh/bash, csh, kshPerl, Python, tcl/tk, sed, awkLinux編程環(huán)境44文件名后綴必須被預處理的匯編代碼.S匯編代碼.s必須轉(zhuǎn)換成預編譯頭文件的C+頭文件 .H .hh必須轉(zhuǎn)換成預編譯頭文件的C /C+頭文件 .h無需預處理的C+源代碼.ii必須被預處理的C+源代碼.cc .cp .cpp .CPP.c+

26、.C .cxx無需預處理的C源代碼.i必須被預處理的C源代碼.c動態(tài)庫文件(動態(tài)對象).so靜態(tài)庫文件(歸檔文件).a目標文件.oLinux編程環(huán)境45集成環(huán)境集成開發(fā)環(huán)境IDEEmacs/xemacsKdevelopEclipse命令行開發(fā)環(huán)境編輯器vi/vim/gvim, emacs/xemacs, pico代碼閱讀器 source navigator,vi/emacs+ ctags/etags配置工具 automake, autoconf, Linux編程環(huán)境46GNU開發(fā)工具GCCGNU C編譯器Binutils輔助GCC的主要軟件GDBGNU調(diào)試工具gdb調(diào)試命令二進制代碼工具as,

27、 ld, ar, lddMakeCVS版本控制Linux編程環(huán)境47GCCGCC不只是一個C編譯器GCC = GNU Compiler CollectionGCC支持多種高級語言的編譯C、C+ADAObject CJAVAFortranPASCALLinux編程環(huán)境48GCC工具cpp 預處理器GNU C編譯器在編譯前自動使用cpp對程序進行預處理gcc 符合ISO等標準的C編譯器g+ 基本符合ISO標準的C+編譯器gcj GCC的java前端gnat GCC的GNU ADA 95前端Linux編程環(huán)境49GNU工具gcc是一個強大的工具集合,包含預處理器、編譯器、匯編器、鏈接器等組件由輸入文

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

29、理,輸出文件的后綴為“.cpp”gcc E o gcctest.cpp gcctest.c使用wc命令比較預處理后的文件與源文件,可以看到兩個文件的差異Linux編程環(huán)境54行數(shù) 單詞數(shù) 字節(jié)數(shù)預編譯wc命令示例Linux編程環(huán)境55編譯成匯編代碼預處理文件匯編代碼使用-x參數(shù)說明根據(jù)指定的步驟進行工作cpp-output指明從預處理得到的文件開始編譯使用-S說明生成匯編代碼后停止工作gcc x cpp-output S o gcctest.s gcctest.cpp也可以直接編譯到匯編代碼gcc S gcctest.cLinux編程環(huán)境56編譯成匯編代碼直接編譯到匯編代碼Linux編程環(huán)境預

30、處理文件匯編代碼57編譯成目標代碼匯編代碼目標代碼gcc x assembler c gcctest.s-c:只編譯不鏈接匯編代碼目標代碼Linux編程環(huán)境58編譯成目標代碼直接編譯成目標代碼gcc c gcctest.c使用匯編器生成目標代碼as o gcctest.o gcctest.s直接編譯成目標代碼使用匯編器Linux編程環(huán)境59編譯成執(zhí)行代碼目標代碼執(zhí)行代碼gcc o gcctest gcctest.o直接生成執(zhí)行代碼gcc o gcctest gcctest.cLinux編程環(huán)境60gcc的高級選項-Wall:打開所有的警告信息Linux編程環(huán)境61根據(jù)警告信息檢查源程序main

31、函數(shù)的返回值為int在函數(shù)的末尾應當返回一個值Linux編程環(huán)境62修改源程序Linux編程環(huán)境63gcc優(yōu)化編譯優(yōu)化編譯選項-O0:缺省情況,不優(yōu)化-O1:第一級優(yōu)化優(yōu)化取決于目標處理器通常包括線程跳轉(zhuǎn)(減少跳轉(zhuǎn)次數(shù))、延遲退棧(在嵌套函數(shù)調(diào)用時推遲退棧時間,直到遞歸結(jié)束)-O2:包括O1級優(yōu)化調(diào)整處理器指令執(zhí)行時序,優(yōu)化處理器在等待其他指令結(jié)果或數(shù)據(jù)延遲時可執(zhí)行其他不相關(guān)指令-O3包括O2級優(yōu)化使內(nèi)嵌函數(shù)、循環(huán)展開執(zhí)行與特定處理器特性相關(guān)的優(yōu)化Linux編程環(huán)境64gcc優(yōu)化編譯舉例不同的優(yōu)化編譯選項Linux編程環(huán)境65gcc優(yōu)化編譯舉例(續(xù))使用time命令統(tǒng)計程序的運行Linux編程

32、環(huán)境6667GNU binutils簡介是一組二進制工具程序集addr2line將程序地址轉(zhuǎn)換為文件名和行號在命令行中給出地址和可執(zhí)行文件名,使用可執(zhí)行文件的調(diào)試信息指出對應源文件以及行號ar建立、修改、提取歸檔文件歸檔文件結(jié)構(gòu)保證可恢復原始文件內(nèi)容asGNU匯編器,主要用來編譯gcc輸出的匯編文件將匯編代碼轉(zhuǎn)換成目標代碼,并放到一個文件該目標文件將由連接器ld連接ld連接器,將目標和歸檔文件結(jié)合起來形成可執(zhí)行文件通常,建立一個新編譯程序的最后一步就是調(diào)用ldLinux編程環(huán)境68GNU binutils簡介(續(xù))nm列出目標文件中的符號objcopy將一種類型目標文件轉(zhuǎn)換成另一種類型的目標文

33、件objdump顯示一個或更多目標文件的信息使用選項來控制其顯示的信息ranlib產(chǎn)生歸檔文件索引,并將其保存到這個歸檔文件中索引列出歸檔文件各成員所定義的可重分配目標文件readelf顯示elf格式可執(zhí)行文件的信息size列出目標文件每一段的大小以及總體的大小Linux編程環(huán)境69ar用于建立、修改、提取歸檔文件(archive)一個歸檔文件可包含多個文件(也可認為歸檔文件是一個庫文件)歸檔文件保存被包含原始文件的內(nèi)容、權(quán)限、時間戳、所有者等屬性,在提取后可被還原Linux編程環(huán)境70使用ar建立庫文件源程序add.c和minus.cLinux編程環(huán)境71使用ar建立庫文件(續(xù))編譯成目標文

34、件將庫文件拷貝到/usr/lib目錄下ar的rv參數(shù)的說明: r:將多個文件組成一個文件 v:輸出信息Linux編程環(huán)境72調(diào)用ar建立的庫文件代碼中使用Add和Minus函數(shù)Linux編程環(huán)境73調(diào)用ar建立的庫文件(續(xù))在編譯時指定庫文件指明將libtest.a鏈接進來運行結(jié)果Linux編程環(huán)境74nm列出目標文件中的符號程序員可定位和分析執(zhí)行程序/目標文件中的符號信息及其屬性顯示的符號類型A:符號的值是絕對值,不會被將來的鏈接所改變B:符號位于未初始化數(shù)據(jù)部分(BSS段)C:符號是公共的公共符號是未初始化的數(shù)據(jù)在鏈接時,多個公共符號可能以相同的名字出現(xiàn)如果符號在其他地方被定義,則該文件中

35、的這個符號會被當作引用來處理D:符號位于已初始化的數(shù)據(jù)部分(data段)T:符號位于代碼部分(text段)U:符號未被定義?:符號類型未知或目標文件格式特殊Linux編程環(huán)境75nm使用舉例Linux編程環(huán)境76objcopy將一種格式文件生成另一種格式文件使用file命令查看文件類型生成srec格式的目標文件使用file命令查看新文件的類型Linux編程環(huán)境77Linux的可執(zhí)行文件格式a.out格式(assembler and link editor output)早期UNIX系統(tǒng)使用的可執(zhí)行文件格式文件頭部結(jié)構(gòu)定義(include/asm-x86/a.out.h)現(xiàn)在基本被ELF文件格式

36、代替COFF格式(Common Object File Format)包括文件頭、可選頭部及一些節(jié)(section).text, .data和.bss區(qū)段各有一個小節(jié),還可包含其他區(qū)段一個可選頭部,對不同操作系統(tǒng)作特定定義文件定義位置:include/linux/coff.hELF格式(Executable and Linking Format)代碼、鏈接和注釋都以段存在,節(jié)點表(Section Header Table)有一個表項與每個小節(jié)對應文件類型:.o目標文件、.so動態(tài)庫文件、可執(zhí)行文件ELF格式可以比COFF格式包含更多的調(diào)試信息 SRECMOTOROLA S-Recoder格式(

37、S記錄格式文件)Linux編程環(huán)境78objdump顯示一個或多個目標文件的信息由相應選項控制顯示哪些信息可通過該工具查看執(zhí)行文件或庫文件的信息objdump對編寫編譯工具、分析代碼執(zhí)行機制非常有用Linux編程環(huán)境79objdump使用舉例-f選項:顯示文件頭內(nèi)容Linux編程環(huán)境80objdump使用舉例(續(xù))-d選項進行反匯編Linux編程環(huán)境81readelf顯示一個或多個ELF格式的目標文件信息Linux編程環(huán)境82GNU gdbgdb = GNU debuger設置斷點監(jiān)視、修改變量單步執(zhí)行顯示/修改寄存器的值查看堆棧遠程調(diào)試Linux編程環(huán)境83gdb常用命令不退出gdb就執(zhí)行m

38、akemake不退出gdb就執(zhí)行shell命令shell中止正在調(diào)試的程序kill執(zhí)行當前調(diào)試的程序run退出gdbquit臨時顯示表達式的值print顯示表達式的值display打開要調(diào)試的文件file執(zhí)行一條語句,是函數(shù)則進入函數(shù)內(nèi)部step執(zhí)行一條語句但不進入函數(shù)內(nèi)部next列出源代碼的一部分list設置斷點,可以是行號、函數(shù)名及地址(以*開頭) ;tbreak: 設置臨時斷點break/tbreakLinux編程環(huán)境84gdb使用舉例源代碼如下編譯:gcc o bug bug.cLinux編程環(huán)境85gdb使用舉例編譯并運行?編譯Linux編程環(huán)境86使用gdb調(diào)試bug運行bug輸入

39、字符串hello顯示出錯位置能不能看到源代碼呢?Linux編程環(huán)境87使用gcc的-g參數(shù)gcc g o bug bug.c-g:在可執(zhí)行程序中包含標準調(diào)試信息重新調(diào)試列出源代碼Linux編程環(huán)境88使用gcc的-g參數(shù)?怎么修改前面的源代碼呢?設置斷點Linux編程環(huán)境89主要內(nèi)容Linux簡介Linux內(nèi)核環(huán)境Linux編程環(huán)境GNU make管理項目Linux的程序執(zhí)行機制90GNU make代碼維護工具,使用GNU編譯開發(fā)大型應用時常需要使用make管理項目避免重復使用多個復雜命令行維護項目和生成目標代碼make通過將命令行保存到Makefile中簡化編譯工作make根據(jù)Makefil

40、e中定義的規(guī)則和步驟及各個模塊的更新情況,自動完成整個軟件項目的維護和代碼生成工作make可識別Makefile中的被修改文件,并在再次編譯的時候只編譯這些文件,從而提高編譯的效率make會檢查文件的修改和生成時間戳如果目標文件的修改或者生成時間戳比它的任意一個依賴文件舊,則make就執(zhí)行makefile文件中描述的相應命令,以便更新目的文件Linux make管理項目91GNU make特點適合于支持多文件構(gòu)成的大中型軟件項目的編譯、鏈接、清除中間文件等管理工作提供和識別多種默認規(guī)則,方便對大型軟件項目的管理支持對多目錄的軟件項目進行遞歸管理對軟件項目具有很好的可維護性和擴展性Linux m

41、ake管理項目92MakefileMakefile被make讀取Makefile主要工作定義依賴關(guān)系生成目標文件所依賴的文件列表需要用什么命令來產(chǎn)生目標文件的最新版本定義編譯、鏈接等相關(guān)參數(shù)Linux make管理項目93Makefile的規(guī)則規(guī)則內(nèi)容要創(chuàng)建的目標(文件)創(chuàng)建目標(文件)所依賴的文件列表通過依賴文件創(chuàng)建目標文件的命令組規(guī)則一般形式target . : prerequisites . command . . 規(guī)則依賴性操作命令gcc c main.c main.o: main.c sum.htab目標Linux make管理項目94簡單Makefile示例edit : main.

42、o kbd.o command.o display.o insert.o search.o files.o utils.occ -o edit main.o kbd.o command.o display.o insert.o search.o files.o utils.omain.o : main.c defs.hcc -c main.ckbd.o : kbd.c defs.h command.hcc -c kbd.ccommand.o : command.c defs.h command.hcc -c command.cdisplay.o : display.c defs.h buffe

43、r.hcc -c display.cinsert.o : insert.c defs.h buffer.hcc -c insert.csearch.o : search.c defs.h buffer.hcc -c search.cfiles.o : files.c defs.h buffer.h command.hcc -c files.cutils.o : utils.c defs.hcc -c utils.cclean : rm edit main.o kbd.o command.o display.o insert.o search.o files.o utils.oLinux mak

44、e管理項目95make的工作過程缺省情況下從Makefile中的第一個目標開始執(zhí)行執(zhí)行過程類似一次深度優(yōu)先遍歷sum (exe)sum.omain.osum.csum.hsum.hmain.csum: main.o sum.ogcc o sum main.o sum.omain.o: main.c sum.hgcc c main.c sum.o: sum.c sum.hgcc c sum.c Linux make管理項目96默認依賴規(guī)則說明.o依賴于相應的.c文件sum: main.o sum.ogcc o sum main.o sum.omain.o: main.c sum.hgcc c m

45、ain.c sum.o: sum.c sum.hgcc c sum.c sum: main.o sum.ogcc o sum main.o sum.omain.o: sum.hgcc c main.c sum.o: sum.hgcc c sum.cLinux make管理項目97Makefile中的變量變量功能降低錯誤風險,簡化Makefile貯存一個文件名列表貯存可執(zhí)行文件名貯存編譯器標志參數(shù)變量使用示例:objects變量($(objects))objects = main.o kbd.o command.o display.o insert.o search.o files.o util

46、s.oedit: $(objects)cc -o edit $(objects) Linux make管理項目98預定義變量make可直接使用許多預定義的變量AR:歸檔維護程序的名稱,默認值為 ar ARFLAGS:歸檔維護程序的選項AS:匯編程序的名稱,默認值為 as ASFLAGS:匯編程序的選項 CC:C 編譯器的名稱,默認值為 cc CFLAGS:C 編譯器的選項CXX:C+ 編譯器的名稱,默認值為 g+CPPFLAGS:C 預編譯的選項 系統(tǒng)環(huán)境變量的處理make 過程中被解釋成make變量Linux make管理項目99簡化后Makefile文件objects = main.o k

47、bd.o command.o display.o insert.o search.o files.o utils.oedit : $(objects) cc -o edit $(objects)main.o : defs.h kbd.o : defs.h command.h command.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.

48、h .PHONY : clean clean : rm edit $(objects) Linux make管理項目100內(nèi)部變量$:目標文件的完整名稱$*:不包含擴展名的目標文件名稱$:依賴列表中的第一個依賴文件$+:所有的依賴文件以空格分開,并以出現(xiàn)的先后為序,可能包含重復的依賴文件$:整個依賴列表(除去所有重復的文件名) $? :所有的依賴文件以空格分開,這些依賴文件的修改日期比目標的創(chuàng)建日期晚 $%:若目標是歸檔成員,則該變量表示目標的歸檔成員名例如,如果目標名稱為 mytarget.so(image.o) $ 為 mytarget.so $% 為 image.o舉例CC = gccC

49、FLAGS = -Wall -O -g foo.o : foo.c foo.h bar.h$(CC) $(CFLAGS) -c $ -o $Linux make管理項目101隱式規(guī)則 (Implicit Rules)也稱預定義規(guī)則告訴make在沒有給出某些命令的時候如何處理舉例objects = main.o kbd.o command.o utils.oedit: $(objects)cc -o edit $(objects) 問題:沒有定義如何編譯生成這些目標的規(guī)則對名為somefile.o的目標文件,make首先找與之對應的源代碼somefile.c,并用gcc c somefile.c

50、 o somefile.o編譯生成目標代碼注意若在工作目錄下有對應的somefile.p文件,make會激活pascal編譯器工作可使用預定義變量改變隱含規(guī)則的工作方式,如$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $ -o $Linux make管理項目102擴展make隱式規(guī)則的方法類似于普通規(guī)則,但目標必定含有符號%該符號可與任何非空字符串匹配為與目標中的”%”匹配,該規(guī)則關(guān)聯(lián)的相關(guān)文件部分也必須使用”%”舉例%.o : %.cmake從somefile.c文件為所有形為somefile.o的文件somefile.o目標make定義的模式規(guī)

51、則%.o : %.c $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $ -o $103模式規(guī)則Linux make管理項目104偽目標PHONY不對應于實際的文件,目標體規(guī)定make執(zhí)行的命令clean:$rm *.o exec_file由于目標體clean沒有依賴體,make認為其是最新的而不執(zhí)行任何操作,因此它將永遠不會被執(zhí)行若需執(zhí)行,需顯式執(zhí)行命令 make clean解決方法:. PHONYPHONY的依賴體文件的含義與通常一樣make不檢查是否存在有文件名與依賴體中的一個名字相匹配的文件,而直接執(zhí)行與之相應的命令.PHONY: clean

52、clean:$rm *.o exec_fileLinux make管理項目PHONY目標也可以有依賴關(guān)系當一個目錄中有多個程序,將其放在一個makefile 中會更方便因為缺省目標是makefile 中的第一個目標,通常將這個phony 目標叫做all,其依賴文件為各個程序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 pro

53、g3.o sort.o utils.o105偽目標PHONY(續(xù))Linux make管理項目106Makefile中的函數(shù)計算待操作的文件、目標或待執(zhí)行的命令使用方法$(function arguments)典型函數(shù)$(subst from, to, text) :替換字符串$(subst ee, EE, feet on the street) 相當于fEEt on the strEEt$(patsubst pattern, replacement, text)$(patsubst %.c,%.o, x.c.c bar.c) 相當于x.c.o bar.o $(wildcard pattern

54、) :列出當前目錄下所有符合模式pattern格式的文件名$(wildcard *.c)objects := $(wildcard *.o) Linux make管理項目107Makefile中的條件語句四種條件語句ifeq.else.endififneqelseendififdefelseendif ifndef.elseendif conditional-directive text-if-trueendif或conditional-directive text-if-trueelse text-if-falseendifLinux make管理項目108帶條件的makefile舉例sum

55、: main.o sum.ogcc o sum main.o sum.omain.o: main.c sum.hgcc c main.c #deciding which file to compile to create sum.oifeq ($(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管理項目109可移植GNU 包的典型安裝方法下載源代碼包foo-1.0.tar.gztar xvzf foo-1.0.tar.gzcd fo

56、o-1.0./configuremake(su) make install問題1:配置腳configure是如何生成的?問題2:configure腳本怎么知道該如何生成Makefile?幕后英雄:GNU Auto 工具autoconf, automake, libtool, autoscan, autoheaderLinux make管理項目110autoconf框架圖autoscanconfigure.scanconfigure.inMakefile.amMakefile.inMakefileautomakeeditaclocal.m4aclocalconfigureautoconfSrc

57、codeautoscan./configureLinux make管理項目autoheader為軟件包創(chuàng)建configure. scan文件從源文件中抽取與函數(shù)調(diào)用和頭文件相關(guān)的信息,并為相應包創(chuàng)建一個 configure.scan文件(configure.in前身)autoscan在以命令行參數(shù)中指定的目錄為根(如果未給定參數(shù),則以當前目錄為根)的目錄樹中檢查源文件基于perl語言實現(xiàn)111autoconf流程 autoscanautoscanconfigure.scanconfigure.inMakefile.amMakefile.inMakefileautomakeeditaclocal

58、.m4aclocalconfigureautoconfSrc codeeditautoscan./configureLinux make管理項目autoheaderconfigure.scan示例112autoconf流程 autoscan(續(xù))AC_PREREQ(2.64) /表明文件所需要的autoscan版本#AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)AC_INIT(hello, 1.0, user) #偵測所指定源代碼文件是否存在,來確定源代碼目錄的有效性AC_CONFIG_SRCDIR(helloworld.c) #

59、用來生成config.h文件,以便autoheader使用AC_CONFIG_HEADERS(config.h) #指定編譯器,如果不指定,選用默認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 make管理項目編輯configure.scan,生成configure.

60、in由configure.scan文件更名而來是configure腳本的輸入文件解決在不同unix變種之間移植程序的問題庫名可能不同應用程序名可能不同結(jié)構(gòu)和常量的定義可能不同configure腳本完成autoconf與automake的初始化工作為不同的平臺定義相應的宏檢測并指定適當?shù)某绦蛎烀?、結(jié)構(gòu)和常量名等指定要為哪些目錄輸出Makefile文件113autoconf流程 editLinux make管理項目114autoconf流程 editconfiugre.in文件的一般布局AC_INIT測試程序測試函數(shù)庫測試頭文件測試類型定義測試結(jié)構(gòu)測試編譯器特性測試庫函數(shù)測試系統(tǒng)調(diào)用AC_OU

溫馨提示

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

最新文檔

評論

0/150

提交評論