Linux筆記---源碼方式安裝軟件

1. 什么是開放源碼、編譯程序與可執行文件

我們使用特定編程語言(如C或Java等),編寫的純文本文件即為源碼文件。在完成源碼文件的編寫之后,再通過編譯程序將源碼文件編譯成操作系統看得懂的二進制可執行文件。

在Linux上最標準的程序語言為C,所以我們使用C語法寫完源碼(以*.c擴展名形式存在)后,以Linux上標準C語言的編譯程序gcc這個程序來編譯,就可以制作一個可執行的二進制程序。

事實上,在編譯過程中還會生成目標文件(以*.o擴展名形式存在)。此外,有時候,我們會在程序當中調用其他的外部子程序,或者是利用其他軟件提供的函數功能,這個時候,我們就必須在編譯的過程當中將該函數庫加進去。如此一來,編譯程序就可以將所有的程序代碼與函數庫做一個鏈接以生成正確的可執行文件。

2. 使用傳統程序語言進行編譯

  • 單源碼文件制作可執行文件:
// 比如我們用C編寫一個hello.c的源代碼,期望輸出Hello World!
vim hello.c
// 我們可以用gcc編譯,可執行文件的文件名默認是a
gcc hello.c
// 執行
./a.out
  • 多源碼文件利用目標文件制作可執行文件:

由于源碼文件有時候并非只有一個,所以我們無法直接進行編譯。這個時候就需要先生成目標文件,然后再以鏈接制作成為二進制可執行文件。

// 通過-c參數編譯目標文件。-O參數為生成優化
gcc [-O] -c thanks_1.c thanks_2.c
// 此時目錄里多了thanks_1.o和thanks_2.o兩個目標文件
// 進行鏈接成為可執行文件,通過-o參數指定生成的可執行文件名。-Wall參數可產生更多的編譯過程信息
gcc [-Wall] -o thanks thanks_1.o thanks_2.o
// 然后就可以執行了
./thanks
  • 加入外部函數庫

// 若上面的代碼使用到了三角函數sin,那么在生成可執行文件時,要鏈入函數庫
gcc [-Wall] -o thanks thanks_1.o thanks_2.o -lm [-L/lib -L/usr/lib -I/usr/include]
// -l:是加入某個函數庫的意思
// m:則是libm.so這個函數庫,其中,lib與擴展名(.a或.so)不需要寫
// 所以-lm表示使用libm.so(或libm.a)函數庫的意思。
// -L:后面接的路徑是函數庫搜索目錄。上面是Linux默認函數庫目錄,可以不寫
// -I:后面接的路徑是源碼內的include文件的所在目錄。上面是Linux默認include目錄,可以不寫


### 3. 用make進行宏編譯
* 為什么要用make
假設有4個源碼文件,分別是main.c、haha.c、sin_value.c和cos_value.c。按照上面的方式,我們得這么做:

// 1. 先進行編譯目標文件,最終會有4個.o的文件出現
gcc -c main.c
gcc -c haha.c
gcc -c sin_value.c
gcc -c cos_value.c
// 2. 再鏈接成為可執行文件,并加入libm數學函數,以生成main可執行文件
gcc -o main main.o haha.o sin_value.o cos_value.o -lm -L/usr/liba -L/lib
// 3. 運行文件
./main

>   一套軟件通常有一堆程序代碼文件,使用gcc來編譯的過程并不簡單。可以使用make進行編譯過程的簡化。
  執行make時,會在當前目錄下搜索Makefile文件,Makefile文件記錄了源碼如何編譯的詳細信息。通常軟件開發商會在軟件包里提供configure(或config)文件,用以檢測用戶的操作系統環境是否滿足條件。
  所以,你要進行的任務只有兩個,先執行./configure生成Makefile,再執行make編譯。

* 嘗試使用make  
vi makefile

// 1. 先編輯makefile規則文件,內容只要制作出main這個可執行文件
main: main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
// 注意第二行的gcc之前是<tab>鍵生成的空格

// 2. 使用makefile規則文件進行編譯
rm -f main *.o <==現將之前的目標文件移除
make

* makefile的基本語法與變量

目標: 目標文件1 目標文件2...
<tab> gcc -o 預新建的可執行文件 目標文件1 目標文件2

以剛才上一個范例進一步說明,我們也可以有兩個以上的操作:
vi makefile

main: main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
clean:
rm -f main main.o hah.o sin_value.o cos_value.o

如此一來,makefile就具有兩個目標,如果想要清除,輸入make clean,如果想要建立main,輸入make main。如果想要先清除再生成main,則輸入make clean main

* 用變量簡化makefile
vi makefile

LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main: ${OBJS}
gcc -o main ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}

* Tarball軟件安裝的步驟
 1. ./configure --prefix=/usr/local/apache
這個步驟就是建立makefile文件。這個步驟的相關信息應該要參考一下同目錄下的README或INSTALL文件。configure比較重要的參數是--prefix,表示軟件最終安裝的目錄,如果沒有指定,默認為/usr/local。可以只用./configure --help查看有哪些參數。
 2. make clean
清理目標文件。因為誰也不知道源碼里是否包含上次編譯過的目標文件(*.o)存在。
 3. make
make會依據makefile當中的默認工作進行編譯的行為。主要是進行gcc來將源碼編譯成可執行文件,通常還需要一些函數庫的鏈接。可執行文件放置在當前目錄下。
 4. make install
最后的安裝步驟,依據makefile里關于install的選項,將數據安裝到默認的目錄中,就完成了。
* Tarball軟件安裝建議
通常建議把軟件安裝在/usr/local/software下,源碼則放在/usr/local/src下。
例如,我們將apache安裝在/usr/local/apache當中,那么你的目錄會變成:

/usr/local/apache/etc
/usr/local/apache/bin
/usr/local/apache/lib
/usr/local/apache/man

為避免每次使用絕對路徑執行的麻煩,可以將/usr/local/apache/bin加入PATH里。
另外/usr/local/apache/man也需要加入man page搜索路徑中去。
/etc/man.config內的40~50行左右寫入如下一行:

MANPATH/usr/local/apache/man


### 4. 增加函數庫的讀取性能 
>   函數庫分為靜態和動態函數庫,靜態函數庫在編譯的時候直接整合到執行程序中,所以最終文件會比較大些,若函數庫升級,整個可執行文件必須重新編譯才能整合新版函數庫。
  動態函數庫,沒有別整合到可執行文件里,當可執行文件使用到函數庫時,程序才會去讀取函數庫使用。Linux大多是將函數庫做成動態函數庫。  

* 增加函數庫讀取性能 
比如mysql的函數庫在/usr/lib/mysql位置,我可以這么做: 
vi /etc/ld.so.conf 

include ld.so.conf.d/*.conf
/usr/lib/mysql <==這一行新增的

// 將/etc/ld.so.conf的數據讀入緩存當中,同時也將數據記錄一份在/etc/ld.so.cache文件中
idconfig

// 列出目前所有函數庫數據內容(/etc/ld.so.cache內的數據)
ldconfig -p

* 解析程序依賴的動態函數庫 

// -v選項,增加顯示其他版本信息
ldd [-v] /usr/bin/passwd

### 5. 校驗軟件正確性
   軟件下載站,一般提供了軟件的md5或sha1指紋碼,可以用以下方式校驗是否被修改過: 
* 對比指紋 

// 將結果與網站的指紋碼比對,一致則未被他人修改
md5sum CentOS-5.3-i386-netinstall.iso sha1sum CentOS-5.3-i386-netinstall.iso

我們可以利用這個機制,為Linux系統上一些重要的文件創建指紋數據庫,比如下面這些文件: 
/etc/passwd 
/etc/shadow(假如你不讓用戶改密碼了) 
/etc/group 
/usr/bin/passwd 
/sbin/portmap 
/bin/login(這個也很容易被黑客利用) 
/bin/ls 
/bin/ps 
/usr/bin/top 
使用md5sum檢查一次,將指紋記錄下來,然后經常以shell script方式由程序自行檢查指紋是否一致。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 《鳥哥的Linux私房菜》筆記 提到Linux,就不得不提GNU和GPL授權所產生的自由軟件(free softw...
    Zhang21閱讀 12,869評論 0 15
  • 一、溫故而知新 1. 內存不夠怎么辦 內存簡單分配策略的問題地址空間不隔離內存使用效率低程序運行的地址不確定 關于...
    SeanCST閱讀 7,875評論 0 27
  • 動態鏈接,在可執行文件裝載時或運行時,由操作系統的裝載程序加載庫。大多數操作系統將解析外部引用(比如庫)作為加載過...
    小5筒閱讀 5,561評論 0 3
  • 來自陳浩的一片老文,但絕對營養。 示例工程:3 個頭文件*.h,和 8 個 C 文件*.c。 初 編譯過程,源文件...
    周筱魯閱讀 4,741評論 0 17
  • 【感悟】 1、說服情緒,找個目標 每次起床總是那么困難,都會拖個10分鐘左右。起床前,情緒占據上風,不想離開溫暖的...
    i期待閱讀 113評論 0 0