gcc編譯匯編文件
㈠ 關於c語言的編譯過程,GCC與windows下的c編譯器(如VS2010)的編譯過程是否存在區別
一般的編譯步驟是如此, 但也有一步到位的編譯器
㈡ 我想用gcc編譯一個匯編程序,就是把c語言轉成匯編。
假設你的函數保存在main.c中。
gcc -S main.c -o main.s
-S表示assembly 匯編的意思,也就是生成匯編文件
㈢ 嵌入式軟體中GCC編譯,匯編,鏈接,調試的作用
GCC:是一套由GNU工程開發的支持多種編程語言的編譯器。將程序代碼編譯成機器語言。
編譯:1、利用編譯程序從源語言編寫的源程序產生目標程序的過程。
2、用編譯程序產生目標程序的動作。 編譯就是把高級語言變成計算機可以識別的2進制
語言,計算機只認識1和0,編譯程序把人們熟悉的語言換成2進制的。 編譯程序把一
個源程序翻譯成目標程序的工作過程分為五個階段:詞法分析;語法分析;語義檢查
和中間代碼生成;代碼優化;目標代碼生成。主要是進行詞法分析和語法分析,又稱
為源程序分析,分析過程中發現有語法錯誤,給出提示信息。
匯編:把匯編語言翻譯成機器語言的過程稱為匯編,在匯編語言中,用助記符(Memoni)代替操作
碼,用地址符號(Symbol)或標號(Label)代替地址碼。這樣用符號代替機器語言的二進制
碼,就把機器語言變成了匯編語言
連接:用來把要執行的程序與庫文件或其他已經翻譯好的子程序(能完成一種獨立功能的程序
模塊)連接在一起,形成機器能執行的程序。
調試:編好程序後,用各種手段進行查錯和排錯的過程。
㈣ xcode/gcc c語言 怎麼調用匯編代碼
1、如果匯編程序是可執行文件,比如exe文件,則可以使用system函數直接調用。比如下面的代碼,用system()打開windows上的記事本程序。
#include <stdio.h>
#include <stdlib.h>
int main()
{
system("notepad.exe");
return 0;
}
2、在C語言源碼中,可以通過內聯匯編來直接編寫匯編程序代碼。不同的編譯器使用內聯匯編的方法不同,vc/vs編譯器中一般使用__asm關鍵字來使用內聯匯編,gcc編譯器一般使用asm關鍵字來使用內聯匯編,以vc6.0為例,下面的代碼通過使用內聯匯編來計算1+1,並將結果保存到int型變數result中。
#include <stdio.h>
int main()
{
int result;
_asm {
mov eax,1
mov ebx,1
add eax,ebx
mov result, eax
}
printf("1+1=%d\n", result);
return 0;
}
㈤ gcc是什麼意思
GCC(GNU Compiler Collection,GNU編譯器套件),是由 GNU 開發的編程語言編譯器。它是以GPL許可證所發行的自由軟體,也是 GNU計劃的關鍵部分。
GCC原本作為GNU操作系統的官方編譯器,現已被大多數類Unix操作系統(如linux、BSD、Mac OS X等)採納為標準的編譯器,GCC同樣適用於微軟的Windows。GCC是自由軟體過程發展中的著名例子,由自由軟體基金會以GPL協議發布。
GCC功能與作用:
1、預處理
命令gcc首先調用cpp進行預處理,在預處理過程中,對源代碼文件中的文件包含(include)、預編譯語句(如宏定義define等)進行分析。
2、編譯
用GCC編譯C/C++代碼時,它會試著用最少的時間完成編譯並且編譯後的代碼易於調試。易於調試意味著編譯後的代碼與源代碼有同樣的執行順序,編譯後的代碼沒有經過優化。
3、連接
當所有的目標文件都生成之後,gcc就調用ld來完成最後的關鍵性工作,這個階段就是連接。在連接階段,所有的目標文件被安排在可執行程序中的恰當的位置,同時,該程序所調用到的庫函數也從各自所在的檔案庫中連到合適的地方。
4、匯編
匯編過程是針對匯編語言的步驟,調用as進行工作,一般來講,.S為後綴的匯編語言源代碼文件和匯編、.s為後綴的匯編語言文件經過預編譯和匯編之後都生成以.o為後綴的目標文件。
GCC在執行編譯工作的時候,總共需要4步:
1、預處理,生成 .i 的文件[預處理器cpp]
2、將預處理後的文件轉換成匯編語言, 生成文件 .s [編譯器egcs]
3、有匯編變為目標代碼(機器代碼)生成 .o 的文件[匯編器as]
4、連接目標代碼, 生成可執行程序 [鏈接器ld]
常用選項
-ansi 只支持 ANSI 標準的 C 語法。這一選項將禁止 GNU C 的某些特色, 例如 asm 或 typeof 關鍵詞。
1、-c:只編譯並生成目標文件。
2、-DMACRO:以字元串"1"定義 MACRO 宏。
3、-DMACRO=DEFN:以字元串"DEFN"定義 MACRO 宏。
4、-E:只運行 C 預編譯器。
5、-g:生成調試信息。GNU 調試器可利用該信息。
6、-IDIRECTORY:指定額外的頭文件搜索路徑DIRECTORY。
7、-LDIRECTORY:指定額外的函數庫搜索路徑DIRECTORY。
8、-lLIBRARY:連接時搜索指定的函數庫LIBRARY。
9、-m486:針對 486 進行代碼優化。
㈥ 為什麼我用gcc編譯c程序到最後無法自動生成一個exe程序
把你的命令行(控制台)輸出的信息貼上來看看,根據提示信息才好判斷.
GCC編譯C源碼有四個步驟:
預處理----->
編譯
---->
匯編
---->
鏈接
現在我們就用GCC的命令選項來逐個剖析GCC過程。
1)預處理(Pre-processing)
在該階段,編譯器將C源代碼中的包含的頭文件如stdio.h編譯進來,用戶可以使用gcc的選項」-E」進行查看。
用法:#gcc
-E
hello.c
-o
hello.i
作用:將hello.c預處理輸出hello.i文件。
2)編譯階段(Compiling)
第二步進行的是編譯階段,在這個階段中,Gcc首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤後,Gcc把代碼翻譯
成匯編語言。用戶可以使用」-S」選項來進行查看,該選項只進行編譯而不進行匯編,生成匯編代碼。
選項
-S
用法:[root]#
gcc
–S
hello.i
–o
hello.s
作用:將預處理輸出文件hello.i匯編成hello.s文件。
[root@richard
hello-gcc]#
ls
hello.c
hello.i
hello.s
3)匯編階段(Assembling)
匯編階段是把編譯階段生成的」.s」文件轉成二進制目標代碼.
選項
-c
用法:[root]#
gcc
–c
hello.s
–o
hello.o
作用:將匯編輸出文件test.s編譯輸出test.o文件。
[root]#
gcc
-c
hello.s
-o
hello.o
[root]#
ls
hello.c
hello.i
hello.o
hello.s
4)鏈接階段(Link)
在成功編譯之後,就進入了鏈接階段。
無選項鏈接
用法:[root]#
gcc
hello.o
–o
hello.exe
作用:將編譯輸出文件hello.o鏈接成最終可執行文件hello.exe。
[root]#
ls
hello.c
hello.exe
hello.i
hello.o
hello.s
運行該可執行文件,出現正確的結果如下。
[root@localhost
Gcc]#
./hello
Hello
World!
㈦ GCC如何編譯一個匯編文件,得到可執行文件
gcc -c my.s(生成my.o)
gcc -o my my.o
my就是所要的可執行文件
或者直接可以gcc -o my my.s
㈧ eclipse ds-5 用gcc編譯器編譯純匯編代碼時出現undefined reference to "main"錯誤
1. 鏈接時缺失了相關目標文件(.o)
2. 鏈接時缺少相關的庫文件(.a/.so)
3. 鏈接的庫文件中又使用了另一個庫文件
4 多個庫文件鏈接順序問題
㈨ linux下gcc的安裝與使用
方法一:
該方法超簡單:
sudoapt-getbuild-depgcc
就上面這條命令就可以搞定
方法二:
sudoapt-getinstallbuild-essential
還是簡單,一句命令也可以搞定
安裝完了可以執行
gcc--version
的命令來查看版本,輸出如下:
gcc(GCC)4.2.3(Ubuntu4.2.3-2ubuntu7)
Copyright(C)2007FreeSoftwareFoundation,Inc.
編譯則使用gcc命令。要往下學習首先就得熟悉gcc命令的用法。
gcc命令提供了非常多的命令選項,但並不是所有都要熟悉,初學時掌握幾個常用的就可以了,到後面再慢慢學習其它選項,免得因選項太多而打擊了學習的信心。
一. 常用編譯命令選項
假設源程序文件名為test.c。
1. 無選項編譯鏈接
用法:#gcc test.c
作用:將test.c預處理、匯編、編譯並鏈接形成可執行文件。這里未指定輸出文件,默認輸出為a.out。
2. 選項 -o
用法:#gcc test.c -o test
作用:將test.c預處理、匯編、編譯並鏈接形成可執行文件test。-o選項用來指定輸出文件的文件名。
3. 選項 -E
用法:#gcc -E test.c -o test.i
作用:將test.c預處理輸出test.i文件。
4. 選項 -S
用法:#gcc -S test.i
作用:將預處理輸出文件test.i匯編成test.s文件。
5. 選項 -c
用法:#gcc -c test.s
作用:將匯編輸出文件test.s編譯輸出test.o文件。
6. 無選項鏈接
用法:#gcc test.o -o test
作用:將編譯輸出文件test.o鏈接成最終可執行文件test。
7. 選項-O
用法:#gcc -O1 test.c -o test
作用:使用編譯優化級別1編譯程序。級別為1~3,級別越大優化效果越好,但編譯時間越長。
二. 多源文件的編譯方法
如果有多個源文件,基本上有兩種編譯方法:
[假設有兩個源文件為test.c和testfun.c]
1. 多個文件一起編譯
用法:#gcc testfun.c test.c -o test
作用:將testfun.c和test.c分別編譯後鏈接成test可執行文件。
2. 分別編譯各個源文件,之後對編譯後輸出的目標文件鏈接。
用法:
#gcc -c testfun.c //將testfun.c編譯成testfun.o
#gcc -c test.c //將test.c編譯成test.o
#gcc -o testfun.o test.o -o test //將testfun.o和test.o鏈接成test
以上兩種方法相比較,第一中方法編譯時需要所有文件重新編譯,而第二種方法可以只重新編譯修改的文件,未修改的文件不用重新編譯。
㈩ 用gcc編譯器C語言程序的技巧
方法/步驟
1、編寫c代碼,並輸入以下代碼,生成文件hello.c
[root@wahoo
test]#
vim
hello.c
#include
<stdio.h>
#define
DISPLAY
"hello
c!"
int
main(void)
{
printf("%s\n",
DISPLAY
);
return
0;
}
ZZ(說明:ZZ當前文件進行快速保存操作)
2、預編譯(Preprocessing)
會對各種預處理指令(#include
#define
#ifdef
等#開始的代碼行)進行處理,刪除注釋和多餘的空白字元,生成一份新的代碼
[root@wahoo
test]#gcc
-E
hello.c
-o
hello.i
E
參數
通知gcc對目標文件進行預編譯,這里是對文件hello.c文件
o
參數
是對命令輸出結果進行導入操作,這里是把
gcc
-E
hello.c
操作結果輸出到文件hello.i(命名要自定義)中進行保存
這個命令執行完後我們目錄下多了一個文件hello.i,你可以查閱一下文件的內容。
3、編譯(Compilation)
對代碼進行語法、語義分析和錯誤判斷,生成匯編代碼文件
[root@wahoo
test]#gcc
-S
hello.i
-o
hello.s
S
參數
通知gcc對目標文件進行編譯,這里是對文件hello.i文件
通過這一步我們知道
C語言跟匯編的
關系,至於他們之前是如何進行轉換的,大家可以進行更深入的學習與探討。
此時目錄下多了一個hello.s文件,內容如圖
4、匯編(Assembly)
把匯編代碼轉換與計算機可認識的二進制文件,要知道計算機只認識0和1呢
[root@wahoo
test]#gcc
-c
hello.s
-o
hello.o
c
參數
通知gcc對目標文件執行指令轉換操作
此步驟我們得到文件hello.o
大家也同樣打開文件查看一下,這個文件裡面幾乎沒幾個字元大家能看懂,這就對了,但大家可以通過這種方法將其轉化為我們可讀的形式:
[root@wahoo
test]#readelf
-a
hello.o
5、鏈接(Linking/Build)
通俗的講就是把多個*.o文件合並成一個可執行文件,二進制指令文件
[root@wahoo
test]#gcc
hello.o
-o
hello
這里我們就得到了一個可以直接在系統下執行的文件
hello
我們也可以對這個文件進行readelf操作,也可以進行二進制指令轉匯編的操作
[root@wahoo
test]#objmp
-d
hello
6、程序運行
[root@wahoo
test]#./hello
hello
c!
7、總結:gcc
編譯c程序的主要過程包括
預編譯->編譯->匯編->連接
四個過程,每個過程都分別進行不同的處理,了解了這其中的一些原理,對c編程的理解大有益處