Linux

Linux GCC編譯過程

 目前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)
.c為後綴的文件,C語言源代碼文件;
.a為後綴的文件,是由目標文件構成的檔案庫文件;
.C,.cc或.cxx為後綴的文件,是C++源代碼文件;
.h為後綴的文件,是程序所包含的頭文件;
.i為後綴的文件,是已經預處理過的C源代碼文件;
.ii為後綴的文件,是已經預處理過的C++源代碼文件;
.m為後綴的文件,是Objective-C源代碼文件;
.o為後綴的文件,是編譯後的目標文件;
.s為後綴的文件,是彙編語言源代碼文件;
.S為後綴的文件,是經過預編譯的彙編語言源代碼文件。
命令gcc首先調用cpp進行預處理,在預處理過程中,對源代碼文件中的文件包含(include)、預編譯語句(如宏定義define等)進行分析。接著調用cc1進行編譯,這個階段根據輸入文件生成以.o為後綴的目標文件。彙編過程是針對彙編語言的步驟,調用as進行工作,一般來講,.S為後綴的彙編語言源代碼文件和彙編、.s為後綴的彙編語言文件經過預編譯和彙編之後都生成以.o為後綴的目標文件。當所有的目標文件都生成之後,gcc就調用ld來完成最後的關鍵性工作,這個階段就是連接。在連接階段,所有的目標文件被安排在可執行程序中的恰當的位置,同時,該程序所調用到的庫函數也從各自所在的檔案庫中連到合適的地方。
例程1:hello.c
#include
int main(void)
{
printf (『Hello world, Linux programming!\n』);
return 0;
}
然後執行下面的命令編譯和運行這段程序:
# gcc hello.c -o hello
# ./hello
Hello world, Linux programming!
首先,GCC需要調用預處理程序cpp,由它負責展開在源文件中定義的宏,並向其中插入“#include”語句所包含的內容;接著,GCC會調用ccl和as將處理後的源代碼編譯成目標代碼;最後,GCC會調用鏈接程序ld,把生成的目標代碼鏈接成一個可執行程序.
◆預處理(Pre-Processing)
使用-E參數可以讓GCC在預處理結束後停止編譯過程:
# gcc -E hello.c -o hello.cpp
◆編譯(Compiling)
下一步是將hello.i編譯為目標代碼,這可以通過使用-c參數來完成:
# gcc -x cpp-output hello.cpp -o hello.o
或者
# gcc -c hello.cpp -o hello.o
◆彙編(Assembling)
◆鏈接(Linking)
# gcc hello.o -o hello
彙編應該調用as,這裡應該是一起完成了
gcc主要參數:
-o定義輸出文件
-E完成預處理/預編譯停止
-c只編譯生成.o,不連接
-x指定編譯步驟
-g gdb調試用,在可執行程序中包含標準調試信息
-O,O1,O2,O3,O4,O5優化級別
-w關閉所有警告
-Wall允許所有有用的警告
-DFOO=BAR定義預處理宏FOO的值為BAR
-IDIRNAME將DIRNAME加入到包含文件的搜索目錄中去
-LDIRNAME將DIRNAME加入到庫文件文件的搜索目錄中去
-static靜態鏈接庫
-lFOO動態連接庫,名為libFOO.o/libFOO.so(2.4/2.6)
-mcpu=CPU TYPE針對不同CPU作不同的優化,比如-m386,-mpentiumpro
 

Linux ELF

ELF Programming 教學文件
http://www.jollen.org/blog/2007/03/elf_program_loading_4_flow_chart.html
http://www.study-area.org/cyril/opentools/opentools/x869.html
 
ld :Link Editor 連結各obj寫進一個可執行檔(executable)。
ldd :秀出一個執行檔用了那些動態函式庫。
ld.so ynamic Linker, 動態連結的話,是由ld.so完成執行時期symbol的
        :參照與連結。
ld-linux.so :ELF檔的動態連結,跟ld.so一樣。只是ld.so是給a.out format的。
                :新的glicb2的ld-linux.so.2已經跟ld.so.2結合成單一程式了。
ldconfig :根據/etc/ld.so.conf內的目錄,做出動態連結所需的cache檔。

VirtualBox 分享資料夾設定

VirtualBox 分享資料夾設定
1)確認已安裝VBoxGuestAdditionals
2)lsmod | grep vb 確認 vboxvfs 與  vboxadd 是否存在
3)進入 /etc 目錄, sudo gedit modules, 在最後加入 vboxvsf與vboxadd兩行
4)在終端機端打 sudo mount -t vboxsf temp /home/user/share
5)到 /home/user/share 目錄下即可看到與  windows share 的目錄
6)如果要開機後自動 mount 請再做以下動作
You’ll need to edit your fstab file, which is located in the /etc directory. But before you can do that, you’ll either need to be logged [...]

Ubuntu 如何 Mount DVD

在 Ubuntu 中使用 IDE 介面的 DVD ROM
開機後在 /dev/sr0 代表這個 DVD ROM
一般如果是資料片可以使用
mkdir /mnt/dvd
mount /dev/sr0 /mnt/dvd
在 /mnt/dvd 下就可以看到資料片
但如果是 DVD Movie 卻會看不到任何資料
應該是 mount 的格式不對
解決方法如下 (參考 http://blog.penguintrail.com/?p=28)
sudo gedit /etc/fstab
找到 /dev/scd1 /media/cdrom0 udf,iso9660 user,noauto 0 0
改為 /dev/scd1 /media/cdrom0 auto user,noauto 0 0
之後再重新開機,就可以自動找到 DVD 的內容
另外如果要直接備份 DVD to ISO,可使用
dd if=/dev/sr0 of=/$HOME/dvdrip.iso
mount path to dvdrip.iso -o loop /mnt/iso
(可參考 http://www.trbailey.net/home/2009/06/copying-and-making-dvds-using-linux)