1. 程式人生 > >嵌入式Linux開發工具之gcc編譯器

嵌入式Linux開發工具之gcc編譯器

gcc的簡介

編譯器gcc所具備的優點

1、GNU CC(簡稱為gcc)是GNU專案中符合ANSI C標準的編譯系統,能夠編譯用C、C++和Object C等語言編寫的程式。gcc不僅功能強大,而且可以編譯如C、C++、Object C、Java、和Ada等多種語言,而且gcc又是一個交叉平臺編譯器,它能夠在當前CPU平臺上為多種不同體系結構的硬體平臺開發軟體,因此尤其適合在嵌入式領域的開發編譯.

2、那麼什麼是交叉編譯呢?
交叉編譯就是:在一種計算機環境中執行的編譯程式,能編譯出在另外一種環境下執行的程式碼編譯過程
簡單地說,就是在一個平臺上生成另一個平臺上的可執行程式碼。比如說:我們的宿主機pc機是x86體系結構的處理機,我們的目標機手機是arm體系結構的處理機,然後我們在pc機上編譯了一段可以在手機上執行的程式碼,這個過程就是交叉編譯。

這裡需要注意的是所謂平臺,實際上包含兩個概念:體系結構(Architecture)、作業系統(Operating System)。同一個體系結構可以執行不同的作業系統;同樣,同一個作業系統也可以在不同的體系結構上執行。舉例來說,我們常說的x86 Linux平臺實際上是Intel x86體系結構和Linux for x86作業系統的統稱;而x86 WinNT平臺實際上是Intel x86體系結構和Windows NT for x86作業系統的簡稱。

gcc-編譯選項

編譯器編譯的過程

一個.c檔案轉換成一個可執行檔案,實際上需要經過以下四步:
預處理—–>編譯—–>彙編—–>連結

一、預處理過程
1、預處理過程,主要負責標頭檔案展開、巨集替換、條件編譯等工作。gcc -E表示讓編譯器只進行至預處理步驟。經過預處理的.c檔案變成.i檔案。
eg:
gcc -E hello.c 讓編譯器只進行到預處理步驟,結果輸出到終端。
gcc -E hello.c > hello.i 對預處理步驟進行重定向,輸出到.i檔案中。

2、標頭檔案的寫法
/usr/include/ :標頭檔案存放在根目錄下的usr目錄下的include目錄中。

標頭檔案有兩種寫法,一種是<>包含的標頭檔案,一種是”“包含的標頭檔案。
例如:
#include <stdio.h>


#include "stdio.h"
兩者區別如下:
<>包含的標頭檔案查詢時,先去系統的標頭檔案目錄中找,如果找不到就會報錯。
“”包含的標頭檔案查詢時,先在當前的標頭檔案目錄中找,如果找不到,再去系統的標頭檔案目錄中找,還找不到就報錯。
PS:
一般情況下,系統自帶的標頭檔案用<>包含;開發人員自己寫的標頭檔案用”“包含。

二、編譯過程
編譯過程,負責將預處理生成的檔案,經過詞法分析,語法檢查生成目標檔案。gcc –c表示只進行至編譯階段。.o檔案為目標檔案。
eg:
gcc -c hello.c 只進行至編譯階段

三、彙編過程
彙編過程,是將目標檔案轉換為彙編檔案的過程。通過使用gcc –S命令進行至彙編階段。.s檔案為彙編檔案。
eg:
gcc -S hello.c 只進行至彙編階段,生成hello.s彙編檔案

四、連結過程
連結,負載根據目標檔案及所需的庫檔案產生最終的可執行檔案。
連結程式的主要工作就是將有關的目標檔案彼此相連線,也即將在一個檔案中引用的符號同該符號在另外一個檔案中的定義連線起來,使得所有的這些目標檔案成為一個能夠在作業系統裝入執行的統一整體。
連結主要解決了模組間的相互引用的問題,分為地址和空間分配,符號解析和重定位幾個步驟。實際上在編譯階段生成目標檔案時,會暫時擱置那些外部引用,而這些外部引用就是在連結時進行確定的。連結器在連結時,會根據符號名稱去相應模組中尋找對應符號。待符號確定之後,連結器會重寫之前那些未確定的符號的地址,這個過程就是重定位。

靜態庫與動態庫

一、庫檔案
庫檔案就是把一些函式與變數封裝在庫裡,我們能夠使用和呼叫這些函式與變數的功能,但是卻看不到其實現過程的檔案。
你可以簡單的把DLL看成一種倉庫,它提供給你一些可以直接拿來用的變數、函式,但是不能看到函式的實現過程,其檔案也不能單獨執行!這是庫檔案的一大特點。

Linux的庫檔案分為兩類:
1、靜態庫:是在執行程式之前就已經加入到執行程式碼中,成為執行程式的一部分來執行的,字尾名:.a
2、動態庫:是在執行程式啟動時載入到執行程式碼中,字尾名:..so
那麼其兩者的區別在於:

  • 靜態庫:執行程式之前載入到執行程式碼中,導致編譯速度慢,但是執行效率高;導致可執行檔案比較臃腫,體積比較大,佔用更多記憶體;靜態庫不易升級,升級需重新編譯;靜態庫程式碼易佈局,佈局也會影響執行效率。
  • 動態庫:在執行程式啟動時載入到執行程式碼中,導致編譯速度快,但是執行效率低;可執行檔案體積比較小,佔用記憶體比較少;動態庫易升級,更新庫即可;動態庫程式碼不易佈局,影響執行效率,減慢。

總而言之,相較之下,靜態庫的執行效率較高。

/lib-系統庫
/usr/lib-程式庫

二、靜態庫的製作&使用
建立:
gcc -c 原始檔.c
ar rcs 靜態庫名 目標檔案1 目標檔案2

庫的命名必須加字首lib,字尾.a

eg:
gcc -c add.c
ar rcs libadd.a add.o
gcc main.c -ladd
gcc main.c -ladd -L. -o main
./main
sum=11

三、動態庫的製作
建立:
gcc -shared -fPIC -o 庫名.so 原始檔.c

eg:
gcc -shared -fPIC -o libadd1.so add.c
gcc main.c ./libadd1.so -o add
./add
sum=11

附原始檔:
add.c

int add(int a, int b)
{
    return a+b;
}

main.c

#include <stdio.h>

int main()
{
    int sum = add(6,5);

    printf("sum = %d\n",sum);

    return 0;
}

四、相關編譯選項
-shared:表示產生共享物件,產生的程式碼會在裝載時進行重定位。但是無法做到讓一份指令由多個程序共享。因為單純的裝載時重定位會對程式中所有指令和資料中的絕對地址進行修改。要做到讓多個程序共享,還需要加上-fPIC。

-fPIC:地址無關程式碼,是為了能讓多個程序共享一份指令。基本思想就是將指令中需要進行修改的那部分分離出來,跟資料放到一塊。這樣指令部分就可以保持不變,而需要變化的那部分則與資料一塊,每個程序都有自己的一份副本。
參考資料

相關推薦

嵌入式Linux開發工具gcc編譯器

gcc的簡介 編譯器gcc所具備的優點 1、GNU CC(簡稱為gcc)是GNU專案中符合ANSI C標準的編譯系統,能夠編譯用C、C++和Object C等語言編寫的程式。gcc不僅功能強大,而且可以編譯如C、C++、Object C、Java、和Ad

linux開發工具gcc

img alt nbsp bsp linu 開發工具 info 鏈接 開發 首先gcc編譯鏈接的一個實例如下所示: 接下來看一下gcc的常見選項: gcc的使用示例: linux開發工具之gcc

linux開發工具Makefile(下)

int src pattern 可執行 nts spa roots 可執行文件 ats make 常用內嵌函數以及多級目錄Makefile 一、函數調用 $(function arguments),利用$號引用函數,下面是Makefile中常用三個函數: 1、$(w

linux開發工具】除了gcc, 還有哪些常用的牛逼的編譯器(不限制程式語言, 不限制平臺).

MSVC Windows平臺上最常用的編譯器,在C++編譯器聖戰中的勝利者。隨著微軟釋出基於Clang/C2,這一條路以後若成功MSVC與Clang/C2並行甚至逐步退出舞臺是很有可能的。 Clang licence極度友好,程式碼質量非常棒,採用的IR為LL

linux開發工具學習(vim、gdb、gcc/g++、makefile)

一. 編輯器vim 1.vim的常用操作總結 2.vim的簡單配置 低配版vim 目錄/etc/下面,有一個vimrc的公共配置檔案,對所有的使用者都可用。但是我們一般不這樣做,為了保證使用者的獨

嵌入式Linux開發第一彈 網路配置

有好多人問我,為什麼我的電腦、虛擬機器以及目標板之間總有那麼兩個是ping不通的,這給我們的開發帶來了很多不必要的麻煩,總體原因還是網路沒有配置好……那麼今天,我們就來講講這個問題的解決方案,作為我公眾平臺的第一彈;          在我們裝好虛擬機器、Windows下

你對學習嵌入式linux開發有什麽好的意見嗎?

淩陽教育 嵌入式linux 現在,嵌入式行業的發展是比較讓人困惑的,為什麽會有此一說呢?因為現在很的嵌入式學習愛好者,大家對於學習嵌入式Linux(嵌入式Linux培訓 嵌入式Linux教程 )應用開發和學習系統開發有或者說是驅動開發,這三個方面 ?淩陽教育的老師經過調查得出了一些比較豐富的答案

Linux實用工具GPG

gpg gnupg 對稱加密前言:GPG是自由軟件基金會開發用於替代商業加密軟件PGP的替代品,取名為GnuPG。GPG有許多用途,本文主要介紹文件加密。紅帽系列Linux中軟件包為gnupg2對稱加密方式:1、實用gpg完成文件加密使用方法:gpg -c file 在彈出頁面輸入兩遍口令即可加密文件,加密

1、嵌入式Linux開發環境搭建

什麽 技術 串口 程序 環境 str ORC arm 上進 1、前提準備 硬件環境: 筆記本電腦 軟件環境: 裸機安裝Windows10_64位 VMWare版本:VMWare WorkStation 14Pro Ubuntu版本:Ubuntu16.04LTS 總

Ubuntu-18.04 LTS嵌入式linux開發環境搭建

pam.d ron inetd Oz net-tools ack dba 處理 vpd Ubuntu-18.04 LTS嵌入式linux開發環境搭建 ubuntu-18.04 LTS於 2018年4月2

linux***檢測工具aide

來安 advance 公司 感覺 base -i 系統 out 進行 AIDE(Advanced Intrusion Detection Environment,高級檢測環境)是個檢測工具,主它通過系統的“縮影”來進行對比,將期間的操作記錄清楚的繼續下來。比如說一個×××在

開發工具Git(二)

一次 別名 拉取 官網 wan img log 方法 用戶 目錄 四、Git安裝與配置 (一)安裝 (二)配置 (三)創建倉庫 五、Git基本命令 六、Git分支 上一篇講了Git的基本原理,建議沒看過的同學先看看,然後這次我們來講Git的具體操作和指令。 四、G

嵌入式Linux開發——(十七)Linux裝置驅動開發

一、字元裝置驅動程式 1)應用程式、庫、核心、驅動程式的關係 2)Linux驅動程式的分類和開發步驟     ①Linux的外設可分為3類:字元裝置(character device)、塊裝置(block device)、網路介面(network interfa

嵌入式Linux開發——(十六)Linux核心除錯技術

1、核心列印函式printk     ①printk函式與printf函式用法格式完全相同     ②它所列印的字串頭部可以加入“<n>”樣式字元,n=0---7表示這條資訊的記錄  級別     ③對於p

嵌入式Linux開發——(十五)移植YAFFS檔案系統

一、移植YAFFS檔案系統 1)YAFFS檔案系統的介紹     ①YAFFS(yet another flash file system)是一種類似於JFFS / JFFS2,專門為NAND Flash設計的嵌入式檔案系統,適用於大     &nbs

嵌入式Linux開發——(十四)移植Linux核心

基於Linux2.6.22.6 1、相關常識     ①VERSION = 2   PATCHLEVEL=6        主版本號,穩定版本用偶數來表示,每隔2~~3年出現一個穩定版 &nbs

嵌入式Linux開發——(十三)u-boot常用命令

1、幫助命令help 執行help命令可以看到U-Boot中所有命令的作用,如“help bootm”可以用“?”來替代,比如“?Bootm”。 2、下載命令 Boot支援串列埠下載、網路下載,相關命令有:loadb、loads、loadx、loady和tftpboot、nfs。 &

嵌入式Linux開發——(十二)u-boot注意事項

1、增加新功能:     ①同時支援本書使用的S3C2440和S3C2410開發板     ②支援串列埠xmodem協議     ③支援網絡卡晶片CS8900     ④支援NAND Flash 讀寫

嵌入式Linux開發——(十一)u-boot原始碼分析

1、U-Boot的特性:     ①開放原始碼     ②支援多種嵌入式作業系統核心:Linux、NetBSD、VxWorks、QNx、RTEMS、ARTOS、 LynxOS     ③支援多種架構的CPU:Power

linux開發工具】常用的編輯器

Vim  Vim是從 vi 發展出來的一個文字編輯器。在Vi的基礎上改進和增加了很多特性,是一個自由軟體,其在程式碼自動補全、編譯錯誤跳轉等方便程式設計的功能特別豐富,在程式設計師中被廣泛使用,和Emacs並列成為類Unix系統使用者最喜歡的編輯器。 Ecli