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

1. 什么是開放源碼补胚、編譯程序與可執(zhí)行文件

我們使用特定編程語言(如C或Java等)壹哺,編寫的純文本文件即為源碼文件倾剿。在完成源碼文件的編寫之后,再通過編譯程序?qū)⒃创a文件編譯成操作系統(tǒng)看得懂的二進(jìn)制可執(zhí)行文件熏挎。

在Linux上最標(biāo)準(zhǔn)的程序語言為C速勇,所以我們使用C語法寫完源碼(以*.c擴(kuò)展名形式存在)后,以Linux上標(biāo)準(zhǔn)C語言的編譯程序gcc這個程序來編譯坎拐,就可以制作一個可執(zhí)行的二進(jìn)制程序烦磁。

事實(shí)上,在編譯過程中還會生成目標(biāo)文件(以*.o擴(kuò)展名形式存在)廉白。此外个初,有時候,我們會在程序當(dāng)中調(diào)用其他的外部子程序猴蹂,或者是利用其他軟件提供的函數(shù)功能院溺,這個時候,我們就必須在編譯的過程當(dāng)中將該函數(shù)庫加進(jìn)去磅轻。如此一來珍逸,編譯程序就可以將所有的程序代碼與函數(shù)庫做一個鏈接以生成正確的可執(zhí)行文件逐虚。

2. 使用傳統(tǒng)程序語言進(jìn)行編譯

  • 單源碼文件制作可執(zhí)行文件:
// 比如我們用C編寫一個hello.c的源代碼,期望輸出Hello World谆膳!
vim hello.c
// 我們可以用gcc編譯叭爱,可執(zhí)行文件的文件名默認(rèn)是a
gcc hello.c
// 執(zhí)行
./a.out
  • 多源碼文件利用目標(biāo)文件制作可執(zhí)行文件:

由于源碼文件有時候并非只有一個,所以我們無法直接進(jìn)行編譯漱病。這個時候就需要先生成目標(biāo)文件买雾,然后再以鏈接制作成為二進(jìn)制可執(zhí)行文件。

// 通過-c參數(shù)編譯目標(biāo)文件杨帽。-O參數(shù)為生成優(yōu)化
gcc [-O] -c thanks_1.c thanks_2.c
// 此時目錄里多了thanks_1.o和thanks_2.o兩個目標(biāo)文件
// 進(jìn)行鏈接成為可執(zhí)行文件漓穿,通過-o參數(shù)指定生成的可執(zhí)行文件名。-Wall參數(shù)可產(chǎn)生更多的編譯過程信息
gcc [-Wall] -o thanks thanks_1.o thanks_2.o
// 然后就可以執(zhí)行了
./thanks
  • 加入外部函數(shù)庫

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


### 3. 用make進(jìn)行宏編譯
* 為什么要用make
假設(shè)有4個源碼文件尉间,分別是main.c权纤、haha.c、sin_value.c和cos_value.c乌妒。按照上面的方式,我們得這么做:

// 1. 先進(jìn)行編譯目標(biāo)文件外邓,最終會有4個.o的文件出現(xiàn)
gcc -c main.c
gcc -c haha.c
gcc -c sin_value.c
gcc -c cos_value.c
// 2. 再鏈接成為可執(zhí)行文件撤蚊,并加入libm數(shù)學(xué)函數(shù),以生成main可執(zhí)行文件
gcc -o main main.o haha.o sin_value.o cos_value.o -lm -L/usr/liba -L/lib
// 3. 運(yùn)行文件
./main

>   一套軟件通常有一堆程序代碼文件损话,使用gcc來編譯的過程并不簡單侦啸。可以使用make進(jìn)行編譯過程的簡化丧枪。
  執(zhí)行make時光涂,會在當(dāng)前目錄下搜索Makefile文件,Makefile文件記錄了源碼如何編譯的詳細(xì)信息拧烦。通常軟件開發(fā)商會在軟件包里提供configure(或config)文件忘闻,用以檢測用戶的操作系統(tǒng)環(huán)境是否滿足條件。
  所以恋博,你要進(jìn)行的任務(wù)只有兩個齐佳,先執(zhí)行./configure生成Makefile私恬,再執(zhí)行make編譯。

* 嘗試使用make  
vi makefile

// 1. 先編輯makefile規(guī)則文件炼吴,內(nèi)容只要制作出main這個可執(zhí)行文件
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規(guī)則文件進(jìn)行編譯
rm -f main *.o <==現(xiàn)將之前的目標(biāo)文件移除
make

* makefile的基本語法與變量

目標(biāo): 目標(biāo)文件1 目標(biāo)文件2...
<tab> gcc -o 預(yù)新建的可執(zhí)行文件 目標(biāo)文件1 目標(biāo)文件2

以剛才上一個范例進(jìn)一步說明本鸣,我們也可以有兩個以上的操作:
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就具有兩個目標(biāo)硅蹦,如果想要清除荣德,輸入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文件辐脖。這個步驟的相關(guān)信息應(yīng)該要參考一下同目錄下的README或INSTALL文件饲宛。configure比較重要的參數(shù)是--prefix,表示軟件最終安裝的目錄嗜价,如果沒有指定艇抠,默認(rèn)為/usr/local【米叮可以只用./configure --help查看有哪些參數(shù)家淤。
 2. make clean
清理目標(biāo)文件。因?yàn)檎l也不知道源碼里是否包含上次編譯過的目標(biāo)文件(*.o)存在瑟由。
 3. make
make會依據(jù)makefile當(dāng)中的默認(rèn)工作進(jìn)行編譯的行為絮重。主要是進(jìn)行g(shù)cc來將源碼編譯成可執(zhí)行文件,通常還需要一些函數(shù)庫的鏈接歹苦∏嗌耍可執(zhí)行文件放置在當(dāng)前目錄下。
 4. make install
最后的安裝步驟殴瘦,依據(jù)makefile里關(guān)于install的選項(xiàng)狠角,將數(shù)據(jù)安裝到默認(rèn)的目錄中,就完成了蚪腋。
* Tarball軟件安裝建議
通常建議把軟件安裝在/usr/local/software下丰歌,源碼則放在/usr/local/src下。
例如屉凯,我們將apache安裝在/usr/local/apache當(dāng)中立帖,那么你的目錄會變成:

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

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

MANPATH/usr/local/apache/man


### 4. 增加函數(shù)庫的讀取性能 
>   函數(shù)庫分為靜態(tài)和動態(tài)函數(shù)庫,靜態(tài)函數(shù)庫在編譯的時候直接整合到執(zhí)行程序中,所以最終文件會比較大些宵蕉,若函數(shù)庫升級酝静,整個可執(zhí)行文件必須重新編譯才能整合新版函數(shù)庫。
  動態(tài)函數(shù)庫羡玛,沒有別整合到可執(zhí)行文件里别智,當(dāng)可執(zhí)行文件使用到函數(shù)庫時,程序才會去讀取函數(shù)庫使用稼稿。Linux大多是將函數(shù)庫做成動態(tài)函數(shù)庫薄榛。  

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

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

// 將/etc/ld.so.conf的數(shù)據(jù)讀入緩存當(dāng)中让歼,同時也將數(shù)據(jù)記錄一份在/etc/ld.so.cache文件中
idconfig

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

* 解析程序依賴的動態(tài)函數(shù)庫 

// -v選項(xiàng)敞恋,增加顯示其他版本信息
ldd [-v] /usr/bin/passwd

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

// 將結(jié)果與網(wǎng)站的指紋碼比對硬猫,一致則未被他人修改
md5sum CentOS-5.3-i386-netinstall.iso sha1sum CentOS-5.3-i386-netinstall.iso

我們可以利用這個機(jī)制,為Linux系統(tǒng)上一些重要的文件創(chuàng)建指紋數(shù)據(jù)庫改执,比如下面這些文件: 
/etc/passwd 
/etc/shadow(假如你不讓用戶改密碼了) 
/etc/group 
/usr/bin/passwd 
/sbin/portmap 
/bin/login(這個也很容易被黑客利用) 
/bin/ls 
/bin/ps 
/usr/bin/top 
使用md5sum檢查一次啸蜜,將指紋記錄下來,然后經(jīng)常以shell script方式由程序自行檢查指紋是否一致辈挂。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衬横,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子终蒂,更是在濱河造成了極大的恐慌蜂林,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拇泣,死亡現(xiàn)場離奇詭異噪叙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)霉翔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門构眯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人早龟,你說我怎么就攤上這事∶ㄧ裕” “怎么了葱弟?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長猜丹。 經(jīng)常有香客問我芝加,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任藏杖,我火速辦了婚禮将塑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蝌麸。我一直安慰自己点寥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布来吩。 她就那樣靜靜地躺著敢辩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弟疆。 梳的紋絲不亂的頭發(fā)上戚长,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機(jī)與錄音怠苔,去河邊找鬼同廉。 笑死,一個胖子當(dāng)著我的面吹牛柑司,可吹牛的內(nèi)容都是我干的迫肖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼帜羊,長吁一口氣:“原來是場噩夢啊……” “哼咒程!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起讼育,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤帐姻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后奶段,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饥瓷,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年痹籍,在試婚紗的時候發(fā)現(xiàn)自己被綠了呢铆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹲缠,死狀恐怖棺克,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情线定,我是刑警寧澤娜谊,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站斤讥,受9級特大地震影響纱皆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一派草、第九天 我趴在偏房一處隱蔽的房頂上張望搀缠。 院中可真熱鬧,春花似錦近迁、人聲如沸艺普。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衷敌。三九已至,卻和暖如春拓瞪,著一層夾襖步出監(jiān)牢的瞬間缴罗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工祭埂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留面氓,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓蛆橡,卻偏偏與公主長得像舌界,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子泰演,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 《鳥哥的Linux私房菜》筆記 提到Linux呻拌,就不得不提GNU和GPL授權(quán)所產(chǎn)生的自由軟件(free softw...
    Zhang21閱讀 12,501評論 0 15
  • 一、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡單分配策略的問題地址空間不隔離內(nèi)存使用效率低程序運(yùn)行的地址不確定 關(guān)于...
    SeanCST閱讀 7,784評論 0 27
  • 動態(tài)鏈接睦焕,在可執(zhí)行文件裝載時或運(yùn)行時藐握,由操作系統(tǒng)的裝載程序加載庫。大多數(shù)操作系統(tǒng)將解析外部引用(比如庫)作為加載過...
    小5筒閱讀 5,484評論 0 3
  • 來自陳浩的一片老文垃喊,但絕對營養(yǎng)猾普。 示例工程:3 個頭文件*.h,和 8 個 C 文件*.c本谜。 初 編譯過程初家,源文件...
    周筱魯閱讀 4,688評論 0 17
  • 【感悟】 1、說服情緒乌助,找個目標(biāo) 每次起床總是那么困難溜在,都會拖個10分鐘左右。起床前他托,情緒占據(jù)上風(fēng)炕泳,不想離開溫暖的...
    i期待閱讀 108評論 0 0