é纳äºå æä¸æé®æ ä¸ Cç¼è¯è¿ç¨æ¦è¿° ç®åLinuxä¸æ常ç¨çCè¯è¨ç¼è¯å¨æ¯GCC(GNU Compiler Collection),å®æ¯GNU项ç®ä¸ç¬¦åANSI Cæ åçç¼è¯ç³»ç»,è½å¤ç¼è¯ç¨CãC++åObject Cçè¯è¨ç¼åçç¨åº.GCCä¸ä»
åè½é常强大,ç»æä¹å¼å¸¸çµæ´».æå¼å¾ç§°éçä¸ç¹å°±æ¯å®å¯ä»¥éè¿ä¸åçå端模åæ¥æ¯æåç§è¯è¨,å¦JavaãFortranãPascalãModula-3åAdaç. Linuxç³»ç»ä¸çgccï¼GNU C Compilerï¼æ¯GNUæ¨åºçåè½å¼ºå¤§ãæ§è½ä¼è¶çå¤å¹³å°ç¼è¯å¨ï¼æ¯GNUç代表ä½åä¹ä¸ãgccæ¯å¯ä»¥å¨å¤ç§ç¡¬ä½å¹³å°ä¸ç¼è¯åºå¯æ§è¡ç¨åºçè¶
级ç¼è¯å¨ï¼å
¶æ§è¡æçä¸ä¸è¬çç¼è¯å¨ç¸æ¯å¹³åæçè¦é«20%~30%ã 使ç¨GCCç¼è¯ç¨åºæ¶,ç¼è¯è¿ç¨å¯ä»¥è¢«ç»å为å个é¶æ®µ:
â é¢å¤ç(Pre-Processing)
â ç¼è¯(Compiling)
â æ±ç¼(Assembling)
â é¾æ¥(Linking) äº ç¼è¯è¿ç¨ä¸åç§æ件ä»ç» 1.以æ©å±ååºåæ件类å.c为åç¼çæ件ï¼Cè¯è¨æºä»£ç æ件ï¼
.a为åç¼çæ件ï¼æ¯ç±ç®æ æ件ææçæ¡£æ¡åºæ件ï¼
.Cï¼.ccæ.cxx 为åç¼çæ件ï¼æ¯C++æºä»£ç æ件ï¼
.h为åç¼çæ件ï¼æ¯ç¨åºæå
å«ç头æ件ï¼
.i 为åç¼çæ件ï¼æ¯å·²ç»é¢å¤çè¿çCæºä»£ç æ件ï¼
.ii为åç¼çæ件ï¼æ¯å·²ç»é¢å¤çè¿çC++æºä»£ç æ件ï¼
.m为åç¼çæ件ï¼æ¯Objective-Cæºä»£ç æ件ï¼
.o为åç¼çæ件ï¼æ¯ç¼è¯åçç®æ æ件ï¼
.s为åç¼çæ件ï¼æ¯æ±ç¼è¯è¨æºä»£ç æ件ï¼
.S为åç¼çæ件ï¼æ¯ç»è¿é¢ç¼è¯çæ±ç¼è¯è¨æºä»£ç æ件ã 2.LINUXç®æ æ件æè¿° LINUX å¹³å°ä¸ä¸ç§ä¸»è¦çå¯æ§è¡æä»¶æ ¼å¼ï¼a.outï¼assembler and link editor output æ±ç¼å¨åé¾æ¥ç¼è¾å¨çè¾åºï¼ãCOFFï¼Common Object File Format éç¨å¯¹è±¡æä»¶æ ¼å¼ï¼ãELFï¼Executable and Linking Format å¯æ§è¡åé¾æ¥æ ¼å¼ï¼ãå
¶ä¸ELFæ¯x86 Linuxç³»ç» ä¸çä¸ç§å¸¸ç¨ç®æ æ件(object file)æ ¼å¼ï¼æä¸ç§ä¸»è¦ç±»å: (1)éäºè¿æ¥çå¯éå®ä½æ件(relocatable file)ï¼å¯ä¸å
¶å®ç®æ æ件ä¸èµ·å建å¯æ§è¡æ件åå
±äº«ç®æ æ件ãç¼è¯äº§çç.oæ件就å±äºè¿ç±»ã
(2)éäºæ§è¡çå¯æ§è¡æ件(executable file)ï¼ç¨äºæä¾ç¨åºçè¿ç¨æ åï¼å è½½å°å
åæ§è¡ãè¿å°±æ¯ç¼è¯ãé¾æ¥ä¹åå½¢æçæç»æ件ã
(3)å
±äº«ç®æ æ件(shared object file)ï¼è¿æ¥å¨å¯å°å®ä¸å
¶å®å¯éå®ä½æ件åå
±äº«ç®æ æ件è¿æ¥æå
¶å®çç®æ æ件ï¼å¨æè¿æ¥å¨åå¯å°å®ä¸å¯æ§è¡æ件åå
¶å®å
±äº«ç®æ æ件ç»åèµ·æ¥å建ä¸ä¸ªè¿ç¨æ åãè¿å°±æ¯åºæ件ï¼åªæå¨æåºæ件ã 详ç»äºè§£è¯·çæ¬äººæ¶èçãLINUXå¯æ§è¡æ件åæã ä¸ ç¼è¯è¿ç¨è¯¦è§£ Cè¯è¨çç¼è¯é¾æ¥è¿ç¨è¦ææ们ç¼åçä¸ä¸ªcç¨åºï¼æºä»£ç ï¼è½¬æ¢æå¯ä»¥å¨ç¡¬ä»¶ä¸è¿è¡çç¨åºï¼å¯æ§è¡ä»£ç ï¼ï¼éè¦è¿è¡ç¼è¯åé¾æ¥ãç¼è¯å°±æ¯æææ¬å½¢å¼æºä»£ç ç¿»è¯ä¸ºæºå¨è¯è¨å½¢å¼çç®æ æ件çè¿ç¨ãé¾æ¥æ¯æç®æ æ件ãæä½ç³»ç»çå¯å¨ä»£ç åç¨å°çåºæ件è¿è¡ç»ç»å½¢ææç»çæå¯æ§è¡ä»£ç çè¿ç¨ãè¿ç¨å¾è§£å¦ä¸ï¼
ä»å¾ä¸å¯ä»¥çå°ï¼æ´ä¸ªä»£ç çç¼è¯è¿ç¨å为ç¼è¯åé¾æ¥ä¸¤ä¸ªè¿ç¨ï¼ç¼è¯å¯¹åºå¾ä¸ç大æ¬å·æ¬èµ·çé¨åï¼å
¶ä½å为é¾æ¥è¿ç¨ã 1. ç¼è¯è¿ç¨ ç¼è¯è¿ç¨åå¯ä»¥åæ两个é¶æ®µï¼ç¼è¯åæ±ç¼ã 1ï¼ç¼è¯ ç¼è¯æ¯è¯»åæºç¨åºï¼å符æµï¼ï¼å¯¹ä¹è¿è¡è¯æ³åè¯æ³çåæï¼å°é«çº§è¯è¨æ令转æ¢ä¸ºåè½çæçæ±ç¼ä»£ç ï¼æºæ件çç¼è¯è¿ç¨å
å«ä¸¤ä¸ªä¸»è¦é¶æ®µï¼ 第ä¸ä¸ªé¶æ®µæ¯é¢å¤çé¶æ®µï¼å¨æ£å¼çç¼è¯é¶æ®µä¹åè¿è¡ãé¢å¤çé¶æ®µå°æ ¹æ®å·²æ¾ç½®å¨æ件ä¸çé¢å¤çæ令æ¥ä¿®æ¹æºæ件çå
容ãå¦#includeæ令就æ¯ä¸ä¸ªé¢å¤çæ令ï¼å®æ头æ件çå
容添å å°.cppæ件ä¸ãè¿ä¸ªå¨ç¼è¯ä¹åä¿®æ¹æºæ件çæ¹å¼æä¾äºå¾å¤§ççµæ´»æ§ï¼ä»¥éåºä¸åç计ç®æºåæä½ç³»ç»ç¯å¢çéå¶ãä¸ä¸ªç¯å¢éè¦ç代ç è·å¦ä¸ä¸ªç¯å¢æéç代ç å¯è½ææä¸åï¼å 为å¯ç¨ç硬件ææä½ç³»ç»æ¯ä¸åçãå¨è®¸å¤æ
åµä¸ï¼å¯ä»¥æç¨äºä¸åç¯å¢ç代ç æ¾å¨åä¸ä¸ªæ件ä¸ï¼åå¨é¢å¤çé¶æ®µä¿®æ¹ä»£ç ï¼ä½¿ä¹éåºå½åçç¯å¢ã主è¦æ¯ä»¥ä¸å æ¹é¢çå¤çï¼ (1)å®å®ä¹æä»¤ï¼ å¦ #define a b
对äºè¿ç§ä¼ªæ令ï¼é¢ç¼è¯æè¦åçæ¯å°ç¨åºä¸çææaç¨bæ¿æ¢ï¼ä½ä½ä¸ºå符串常éç aåä¸è¢«æ¿æ¢ãè¿æ #undefï¼åå°åæ¶å¯¹æ个å®çå®ä¹ï¼ä½¿ä»¥å该串çåºç°ä¸å被æ¿æ¢ã (2)æ¡ä»¶ç¼è¯æä»¤ï¼ å¦#ifdefï¼#ifndefï¼#elseï¼#elifï¼#endifçã
è¿äºä¼ªæ令çå¼å
¥ä½¿å¾ç¨åºåå¯ä»¥éè¿å®ä¹ä¸åçå®æ¥å³å®ç¼è¯ç¨åºå¯¹åªäºä»£ç è¿è¡å¤çãé¢ç¼è¯ç¨åºå°æ ¹æ®æå
³çæ件ï¼å°é£äºä¸å¿
è¦ç代ç è¿æ»¤æã
ï¼3)头æ件å
å«æä»¤ï¼ å¦#include "FileName"æè
#include <FileName>çã å¨å¤´æ件ä¸ä¸è¬ç¨ä¼ªæ令#defineå®ä¹äºå¤§éçå®ï¼æ常è§çæ¯å符常éï¼ï¼åæ¶å
å«æåç§å¤é¨ç¬¦å·ç声æãéç¨å¤´æ件çç®ç主è¦æ¯ä¸ºäºä½¿æäºå®ä¹å¯ä»¥ä¾å¤ä¸ªä¸åçCæºç¨åºä½¿ç¨ãå 为å¨éè¦ç¨å°è¿äºå®ä¹çCæºç¨åºä¸ï¼åªéå ä¸ä¸æ¡#includeè¯å¥å³å¯ï¼èä¸å¿
åå¨æ¤æ件ä¸å°è¿äºå®ä¹éå¤ä¸éãé¢ç¼è¯ç¨åºå°æ头æ件ä¸çå®ä¹ç»ç»é½å å
¥å°å®æ产ççè¾åºæ件ä¸ï¼ä»¥ä¾ç¼è¯ç¨åºå¯¹ä¹è¿è¡å¤çãå
å«å°cæºç¨åºä¸ç头æ件å¯ä»¥æ¯ç³»ç»æä¾çï¼è¿äºå¤´æ件ä¸è¬è¢«æ¾å¨ /usr/includeç®å½ä¸ãå¨ç¨åºä¸#includeå®ä»¬è¦ä½¿ç¨å°æ¬å·ï¼< >ï¼ãå¦å¤å¼å人åä¹å¯ä»¥å®ä¹èªå·±ç头æ件ï¼è¿äºæ件ä¸è¬ä¸cæºç¨åºæ¾å¨åä¸ç®å½ä¸ï¼æ¤æ¶å¨#includeä¸è¦ç¨åå¼å·ï¼""ï¼ã
(4)ç¹æ®ç¬¦å·ï¼é¢ç¼è¯ç¨åºå¯ä»¥è¯å«ä¸äºç¹æ®ç符å·ã
ä¾å¦å¨æºç¨åºä¸åºç°çLINEæ è¯å°è¢«è§£é为å½åè¡å·ï¼åè¿å¶æ°ï¼ï¼FILEå被解é为å½å被ç¼è¯çCæºç¨åºçå称ãé¢ç¼è¯ç¨åºå¯¹äºå¨æºç¨åºä¸åºç°çè¿äºä¸²å°ç¨åéçå¼è¿è¡æ¿æ¢ã
é¢ç¼è¯ç¨åºæå®æçåºæ¬ä¸æ¯å¯¹æºç¨åºçâæ¿ä»£âå·¥ä½ãç»è¿æ¤ç§æ¿ä»£ï¼çæä¸ä¸ªæ²¡æå®å®ä¹ã没ææ¡ä»¶ç¼è¯æ令ã没æç¹æ®ç¬¦å·çè¾åºæ件ãè¿ä¸ªæ件çå«ä¹å没æç»è¿é¢å¤ççæºæ件æ¯ç¸åçï¼ä½å
容ææä¸åãä¸ä¸æ¥ï¼æ¤è¾åºæ件å°ä½ä¸ºç¼è¯ç¨åºçè¾åºè被翻è¯æ为æºå¨æ令ã
第äºä¸ªé¶æ®µç¼è¯ãä¼åé¶æ®µï¼ç»è¿é¢ç¼è¯å¾å°çè¾åºæ件ä¸ï¼åªæ常éï¼å¦æ°åãå符串ãåéçå®ä¹ï¼ä»¥åCè¯è¨çå
³é®åï¼å¦main,if,else,for,while,{,}, +,-,*,\ççã
ç¼è¯ç¨åºæè¦ä½å¾å·¥ä½å°±æ¯éè¿è¯æ³åæåè¯æ³åæï¼å¨ç¡®è®¤ææçæ令é½ç¬¦åè¯æ³è§åä¹åï¼å°å
¶ç¿»è¯æçä»·çä¸é´ä»£ç 表示ææ±ç¼ä»£ç ã
ä¼åå¤çæ¯ç¼è¯ç³»ç»ä¸ä¸é¡¹æ¯è¾è°æ·±çææ¯ãå®æ¶åå°çé®é¢ä¸ä»
åç¼è¯ææ¯æ¬èº«æå
³ï¼èä¸åæºå¨ç硬件ç¯å¢ä¹æå¾å¤§çå
³ç³»ãä¼åä¸é¨åæ¯å¯¹ä¸é´ä»£ç çä¼åãè¿ç§ä¼åä¸ä¾èµäºå
·ä½ç计ç®æºãå¦ä¸ç§ä¼åå主è¦é对ç®æ 代ç ççæèè¿è¡çã
对äºåä¸ç§ä¼åï¼ä¸»è¦çå·¥ä½æ¯å é¤å
Œ
±è¡¨è¾¾å¼ã循ç¯ä¼åï¼ä»£ç å¤æã强度åå¼±ãåæ¢å¾ªç¯æ§å¶æ¡ä»¶ãå·²ç¥éçå并çï¼ãå¤åä¼ æï¼ä»¥åæ ç¨èµå¼çå é¤ï¼ççã åä¸ç§ç±»åçä¼ååæºå¨ç硬件ç»æå¯åç¸å
³ï¼æ主è¦çæ¯èèæ¯å¦ä½å
åå©ç¨æºå¨çå个硬件å¯åå¨åæ¾çæå
³åéçå¼ï¼ä»¥åå°å¯¹äºå
åç访é®æ¬¡æ°ãå¦å¤ï¼å¦ä½æ ¹æ®æºå¨ç¡¬ä»¶æ§è¡æ令çç¹ç¹ï¼å¦æµæ°´çº¿ãRISCãCISCãVLIWçï¼è对æ令è¿è¡ä¸äºè°æ´ä½¿ç®æ 代ç æ¯è¾çï¼æ§è¡çæçæ¯è¾é«ï¼ä¹æ¯ä¸ä¸ªéè¦çç 究课é¢ã
2ï¼æ±ç¼
æ±ç¼å®é
ä¸æææ±ç¼è¯è¨ä»£ç ç¿»è¯æç®æ æºå¨æ令çè¿ç¨ã对äºè¢«ç¿»è¯ç³»ç»å¤ççæ¯ä¸ä¸ªCè¯è¨æºç¨åºï¼é½å°æç»ç»è¿è¿ä¸å¤çèå¾å°ç¸åºçç®æ æ件ãç®æ æ件ä¸æåæ¾çä¹å°±æ¯ä¸æºç¨åºçæçç®æ çæºå¨è¯è¨ä»£ç ãç®æ æ件ç±æ®µç»æãé常ä¸ä¸ªç®æ æ件ä¸è³å°æ两个段ï¼ä»£ç 段ï¼è¯¥æ®µä¸æå
å«ç主è¦æ¯ç¨åºçæ令ã该段ä¸è¬æ¯å¯è¯»åå¯æ§è¡çï¼ä½ä¸è¬å´ä¸å¯åãæ°æ®æ®µï¼ä¸»è¦åæ¾ç¨åºä¸è¦ç¨å°çåç§å
¨å±åéæéæçæ°æ®ãä¸è¬æ°æ®æ®µé½æ¯å¯è¯»ï¼å¯åï¼å¯æ§è¡çã 2. é¾æ¥è¿ç¨ ç±æ±ç¼ç¨åºçæçç®æ æ件并ä¸è½ç«å³å°±è¢«æ§è¡ï¼å
¶ä¸å¯è½è¿æ许å¤æ²¡æ解å³çé®é¢ã
ä¾å¦ï¼æ个æºæ件ä¸çå½æ°å¯è½å¼ç¨äºå¦ä¸ä¸ªæºæ件ä¸å®ä¹çæ个符å·ï¼å¦åéæè
å½æ°è°ç¨çï¼ï¼å¨ç¨åºä¸å¯è½è°ç¨äºæ个åºæ件ä¸çå½æ°ï¼ççãææçè¿äºé®é¢ï¼é½éè¦ç»é¾æ¥ç¨åºçå¤çæ¹è½å¾ä»¥è§£å³ã
é¾æ¥ç¨åºç主è¦å·¥ä½å°±æ¯å°æå
³çç®æ æ件彼æ¤ç¸è¿æ¥ï¼ä¹å³å°å¨ä¸ä¸ªæ件ä¸å¼ç¨ç符å·å该符å·å¨å¦å¤ä¸ä¸ªæ件ä¸çå®ä¹è¿æ¥èµ·æ¥ï¼ä½¿å¾ææçè¿äºç®æ æ件æ为ä¸ä¸ªè½å¤è¯¶æä½ç³»ç»è£
å
¥æ§è¡çç»ä¸æ´ä½ã
æ ¹æ®å¼å人åæå®çååºå½æ°çé¾æ¥æ¹å¼çä¸åï¼é¾æ¥å¤çå¯å为两ç§ï¼ (1)éæé¾æ¥ å¨è¿ç§é¾æ¥æ¹å¼ä¸ï¼å½æ°ç代ç å°ä»å
¶æå¨å°éæé¾æ¥åºä¸è¢«æ·è´å°æç»çå¯æ§è¡ç¨åºä¸ãè¿æ ·è¯¥ç¨åºå¨è¢«æ§è¡æ¶è¿äºä»£ç å°è¢«è£
å
¥å°è¯¥è¿ç¨çèæå°å空é´ä¸ãéæé¾æ¥åºå®é
ä¸æ¯ä¸ä¸ªç®æ æ件çéåï¼å
¶ä¸çæ¯ä¸ªæ件å«æåºä¸çä¸ä¸ªæè
ä¸ç»ç¸å
³å½æ°ç代ç ã (2)å¨æé¾æ¥
å¨æ¤ç§æ¹å¼ä¸ï¼å½æ°ç代ç 被æ¾å°ç§°ä½æ¯å¨æé¾æ¥åºæå
±äº«å¯¹è±¡çæ个ç®æ æ件ä¸ãé¾æ¥ç¨åºæ¤æ¶æä½çåªæ¯å¨æç»çå¯æ§è¡ç¨åºä¸è®°å½ä¸å
±äº«å¯¹è±¡çåå以åå
¶å®å°éçç»è®°ä¿¡æ¯ãå¨æ¤å¯æ§è¡æ件被æ§è¡æ¶ï¼å¨æé¾æ¥åºçå
¨é¨å
容å°è¢«æ å°å°è¿è¡æ¶ç¸åºè¿ç¨çèå°å空é´ãå¨æé¾æ¥ç¨åºå°æ ¹æ®å¯æ§è¡ç¨åºä¸è®°å½çä¿¡æ¯æ¾å°ç¸åºçå½æ°ä»£ç ã
对äºå¯æ§è¡æ件ä¸çå½æ°è°ç¨ï¼å¯åå«éç¨å¨æé¾æ¥æéæé¾æ¥çæ¹æ³ã使ç¨å¨æé¾æ¥è½å¤ä½¿æç»çå¯æ§è¡æ件æ¯è¾çå°ï¼å¹¶ä¸å½å
±äº«å¯¹è±¡è¢«å¤ä¸ªè¿ç¨ä½¿ç¨æ¶è½è约ä¸äºå
åï¼å 为å¨å
åä¸åªéè¦ä¿åä¸ä»½æ¤å
±äº«å¯¹è±¡ç代ç ãä½å¹¶ä¸æ¯ä½¿ç¨å¨æé¾æ¥å°±ä¸å®æ¯ä½¿ç¨éæé¾æ¥è¦ä¼è¶ãå¨æäºæ
åµä¸å¨æé¾æ¥å¯è½å¸¦æ¥ä¸äºæ§è½ä¸æ害ãå ç¼è¯è¿ç¨å®ä¾æè¿° linuxä¸ä½¿ç¨çgccç¼è¯å¨æä¸è¿°çå 个è¿ç¨éæï¼ä¸ä¸ªå½ä»¤å°±è½å®æç¼è¯çæ´ä¸ªè¿ç¨ã为äºè¯¦ç»è¯´ææ¯ä¸ªæ¥éª¤ï¼ä¸é¢æ们å°åé¨æ§è¡ãä¸å¾æ¯gcc代ççç¼è¯è¿ç¨
ä¾ç¨: å¨linuxä¸å建æ件hello.cï¼å
容å¦ä¸ï¼
#include <stdio.h>
int main(void)
{
printf ("Hello,everybody!\n");
return 0;
} â é¢å¤ç(Pre-Processing)
使ç¨-Eåæ°å¯ä»¥è®©GCCå¨é¢å¤çç»æååæ¢ç¼è¯è¿ç¨ï¼å¯¹åºçå½ä»¤æ¯cpp,
# gcc -E hello.c -o hello.i ç¨ç¼è¾å¨æå¼hello.i,å¯ä»¥çå°stdio.hæ件被å±å¼å°äºhello.iä¸ã â ç¼è¯(Compiling)
使ç¨-Såæ°å°hello.iç¼è¯ä¸ºæ±ç¼ç¨åº,使ç¨çå½ä»¤æ¯cc -S,
#gcc âS hello.i âo hello.s ç¨ç¼è¾å¨æå¼hello.sï¼æ¾ç¶å·²ç»åæäºæ±ç¼ä»£ç ã â æ±ç¼(Assembling)
使ç¨-cåæ°å°hello.sç¼è¯ä¸ºç®æ æ件,对åºçå½ä»¤æ¯as,
#gcc âc hello.s âo hello.o å¯ä»¥å©ç¨å·¥å
·readelfæè
objdump读åºhello.oçä¿¡æ¯ã â é¾æ¥(Linking) 产çå¯æ§è¡æ件ï¼å©ç¨å½ä»¤ld
# gcc hello.o -o hello
å©ç¨readelf,å¯ä»¥çå°hello.oåhelloæ件çåºå«ã
追é®æ太å¤åäºå§ï¼è¾è¦ä½ äº