當前位置:首頁 » 編程軟體 » c編譯驅動

c編譯驅動

發布時間: 2024-01-15 15:46:31

㈠ 透過源碼領悟GCC到底在幹些什麼 GCC源碼分析

上半年一直在做有關GCC和LD的項目,到現在還沒做完。最近幾天編程的那台電腦壞了,所以趁此間隙寫一點相關的分析和經驗之類的跟大家共享。
一、GCC的作用和運行機制
GCC是Linux下重要的編譯工具,用法這里就不說了,滿大街都找得到。這里我重點介紹GCC的運作機制,作為代碼分析的鋪墊。全篇使用c語言子部件來作分析,因為我對其他語言的編譯沒有研究。
根據編譯原理,語言的編譯分為這么幾個步驟:詞法分析、語法分析、語義分析、中間語言生成、優化、目標代碼生成等。然而從編譯器使用的角度來看,要把源代碼翻譯為可執行文件要經過編譯和連接兩步,與此對應,一塌帆個完整的編譯系統一定包含編譯器和連接器兩大功能部件。編譯器要完成編譯原悶塵理中提到的那些任務;連接器要把編譯器生成的代碼片段拼接成一個完整的可執行程序。之所以需要連接器,是因為一般的程序都是多源文件的,而編譯器一次只編譯一個源文件(稱之為翻譯單元translation unit),因此需要連接器把所有翻譯單元對應的輸出合並成一個可執行文件。
如果一切順利,可執行程序就可以正確的生成出來。但是一旦源代碼存在某些問題,錯誤就會被報告出來。編譯器報告的錯誤一般都是局部錯誤,它會指明錯誤在哪個文件第幾行;連接器報告的錯誤一般都是全局錯誤,而且絕大多數都是多胳膊少腿的問題,比如函數重定義,無法解決的外部符號等,這些錯誤無法定位到某一行。
GCC就是這里的編譯器。准確來說,GCC是一個編譯驅動器,驅動cc1、as和ld三個部件完成編譯、匯編和連接的工作。cc1將C語言源文件編譯為匯編文件(.s)。而將匯編代碼轉換為二進制指令的工作由AS完成,生成大家都很熟悉的對象文件(.o);生成的這些對象文件再由AR程序打包成靜態庫(.a),或者由LD程序連接成可執行程序(elf、.so或其他格式)。而LD就是所謂的連接器。AS、AR、LD是屬於另外一個叫做binutils的軟體包的程序,所以要讓GCC能夠有效運作起來,除了在系統中安裝GCC外,還要安裝binutils才行。
以下是cc1、as、ld各司其責的配合完成一個編譯過程。

[plain] view plain
gcc test.c -S -o test.S
as test.S -o test.o
ld test.o -o test
通常所用的「gcc -c」就相當於「gcc -S」 + as,而對於編譯單個源文件一步到位生成可執行「gcc test.c -o test」相當於上面三個步驟的組合,中間文件被放置在臨時目錄下。從這一點看來,GCC除去編譯的功能外,更像是個driver,它可以驅動as和ld完成整個的編譯,特別是gcc也接受對象文件(.o)和靜態庫(.a)作為參數用於生成可執行程序,其實背後就是調用的LD,還可以用「-Wl,」選項給LD傳遞自定義參數。所以在大多數軟體的Makefile里,你很難找到AS和LD的字眼,gcc已經給你包辦了。
GCC源代碼里包含的主要就是cc1這部分(還包括一些其他的輔助工具,比如collect2等)。

二、GCC的安裝
要學習和修改GCC源碼,首先第一步是在自己的機器上用GCC源代碼編譯出一個選定版本的GCC(這里以gcc-4.5.2.tar.bz2為例,源碼可以從http://gcc.gnu.org去下載)。除此之外,GCC依賴於gmp、mpfr、mpc三個庫,如果你機器上沒有,或者版本太團罩雹老以至於無法支持新的GCC,那麼你還得去把這三個庫下載下來。
一般來說,下載GCC是從GNU的FTP鏡像網站去下載,gcc的代碼包一般放置在/release/gcc-x.y目錄下,而那三個依賴庫一般放置在/infrastructure/目錄下。
1、把依賴庫和GCC解包

[plain] view plain
tar -vjxf gmp-4.3.2.tar.bz2 -C /usr/src/
tar -vjxf mpfr-2.4.2.tar.bz2 -C /usr/src/
tar -vxf mpc-0.8.1.tar.gz -C /usr/src/
tar -vjxf gcc-4.5.2.tar.bz2 -C /usr/src/

2、到自己的home目錄下編譯依賴庫

[plain] view plain
cd ~
mkdir gmp-build
cd gmp-build
/usr/src/gmp-4.3.2/configure --prefix=/usr/local/gmp-4.3.2 #指定安裝位置
make
make check
make install

cd ~
mkdir mpfr-build
cd mpfr-build
/usr/src/mpfr-2.4.2/configure --prefix=/usr/local/mpfr-2.4.2 --with-gmp=/usr/local/gmp-4.3.2
make
make check
make install


cd ~
mkdir mpc-build
cd mpfr-build
/usr/src/mpc-0.8.1/configure --prefix=/usr/local/mpc-0.8.1 --with-mpfr=/usr/local/mpfr-2.4.2 --with-gmp=/usr/local/gmp-4.3.2
make
make check
make install

3、編譯GCC

[plain] view plain
cd ~
mkdir gcc-build
cd gcc-build
/usr/src/gcc-4.5.2/configure --prefix=/usr/local/gcc-4.5.2 --with-mpc=/usr/local/mpc-0.8.1 --with-mpfr=/usr/local/mpfr-2.4.2 --with-gmp=/usr/local/gmp-4.3.2 --enable-languages=c,c++
make
make install

㈡ 我想學習如何編寫驅動程序(C)

開發驅動用delphi最簡單,最快速
你可以到書店去找一下《delphi底層開發大全》
裡面有很詳細的驅動開發的做法,並且不難
delphi把驅動所需的相關內容都做成介面的
使用起來比C++簡單

To樓上的,微軟那個驅動製作工具叫Microsoft Driver Creator
不過現在好像已經下載不到了。。

㈢ 編寫驅動程序用c語言還是匯編語言還是控制硬體要在c中混編匯編可以給出一個例子的代碼嗎謝謝。

會匯編當然最好
硬體控制可以直接用C語言
#include <stdio.h>

extern void swi_handler(void);
/*中斷處理子程序*/
void do_swi(int num)
{
/*
switch (num)
{
case 0x1: ...
case 0x2: ...
}
*/
printf("%d helloworld\n", num);
}
//swi_handler
void install_swi_handler(void (*fun)(void))
{
unsigned int cmd;
//1.構造一條跳轉指令
*((unsigned int *)0x38) = (unsigned int)fun;
cmd = 0xe59ff028;
//2.把此指令機器碼放到0x8地址

*((unsigned int *)0x8) = cmd;
}
int main(void)
{
int i = 0;

install_swi_handler(swi_handler);

for (i = 0; i < 10; i++) {
if (i == 3) {
__asm
{
swi 0x123
}
}
else
printf("aa\n");
}
return 0;
}

熱點內容
酒瓶解壓 發布:2024-11-16 20:29:20 瀏覽:729
視頻怎樣上傳到手機 發布:2024-11-16 20:26:30 瀏覽:258
怎麼把ppt文件壓縮 發布:2024-11-16 20:22:30 瀏覽:685
linux大內存 發布:2024-11-16 20:22:28 瀏覽:950
屏蔽迅雷上傳 發布:2024-11-16 19:49:17 瀏覽:599
java怎麼定義方法 發布:2024-11-16 19:48:15 瀏覽:143
我的世界國際版為什麼連接不到伺服器 發布:2024-11-16 19:44:18 瀏覽:854
購物導航源碼 發布:2024-11-16 19:35:48 瀏覽:145
打賬號密碼是什麼 發布:2024-11-16 19:26:07 瀏覽:290
安卓4用什麼版本微信 發布:2024-11-16 19:25:11 瀏覽:693