linuxas匯編
你的編譯環境有問題。
as 提示不支持某個參數,而且從上面看你應該在編譯 arm 架構的內核,但後面的提示是 as 命令,這種名字的命令(沒有架構前綴)應該是本地編譯器。我想你不太可能在 arm 上本地編譯內核吧(實際上確實可以,而且我以前玩 arm 也都傾向於 arm 上本地編譯,就是速度慢,需要用 distcc 加速,但兼容好)?
貌似是 -EL 參數 ix86 架構不支持。所以不太可能這步就是應該用本地 as 編譯。
如果不是 arm 本地編譯,那有可能這步用錯了 as 這個匯編器命令。你的台式計算機 as 是 x86 或者 amd64 的,肯定不支持 arm 特有的編譯參數和代碼。
你看看你的編譯文章吧。可能有錯,不符合現在內核編譯的規范了。或者 GCC 版本太老或者太新不支持這個參數。不排除你的交叉編譯環境有問題。
別聽那匿名胡扯的,內核源代碼根本沒有 configure 。
㈡ 「干貨」嵌入式Linux系統移植的四大步驟(上)
在學習系統移植的相關知識,在學習和調試過程中,發現了很多問題,也解決了很多問題,但總是對於我們的開發結果有一種莫名其妙的感覺,糾其原因,主要對於我們的開發環境沒有一個深刻的認識,有時候幾個簡單的命令就可以完成非常復雜的功能,可是我們有沒有想過,為什麼會有這樣的效果?
如果沒有去追問,只是機械地完成,並且看到實驗效果,這樣做其實並沒有真正的掌握系統移植的本質。
在做每一個步驟的時候, 首先問問自己,為什麼要這樣做,然後再問問自己正在做什麼? 搞明白這幾個問題,我覺得就差不多了,以後不管更換什麼平台,什麼晶元,什麼開發環境,你都不會迷糊,很快就會上手。對於嵌入式的學習方法,我個人方法就是:從宏觀上把握(解決為什麼的問題),微觀上研究(解決正在做什麼的問題),下面以自己學習的arm-cortex_a8開發板為目標,介紹下自己的學習方法和經驗。
嵌入式Linux系統移植主要由四大部分組成:
一、搭建交叉開發環境
二、bootloader的選擇和移植
三、kernel的配置、編譯、和移植
四、根文件系統的製作
第一部分:搭建交叉開發環境
先介紹第一分部的內容:搭建交叉開發環境,首先必須得思考兩個問題,什麼是交叉環境? 為什麼需要搭建交叉環境?
先回答第一個問題,在嵌入式開發中,交叉開發是很重要的一個概念,開發的第一個環節就是搭建環境,第一步不能完成,後面的步驟從無談起,這里所說的交叉開發環境主要指的是:在開發主機上(通常是我的pc機)開發出能夠在目標機(通常是我們的開發板)上運行的程序。嵌入式比較特殊的是不能在目標機上開發程序(狹義上來說),因為對於一個原始的開發板,在沒有任何程序的情況下它根本都跑不起來,為了讓它能夠跑起來,我們還必須要藉助pc機進行燒錄程序等相關工作,開發板才能跑起來,這里的pc機就是我們說的開發主機,想想如果沒有開發主機,我們的目標機基本上就是無法開發,這也就是電子行業的一句名言:搞電子,說白了,就是玩電腦!
然後回答第二個問題,為什麼需要交叉開發環境?主要原因有以下幾點:
原因 1: 嵌入式系統的硬體資源有很多限制,比如cpu主頻相對較低,內存容量較小等,想想讓幾百MHZ主頻的MCU去編譯一個Linux kernel會讓我們等的不耐煩,相對來說,pc機的速度更快,硬體資源更加豐富,因此利用pc機進行開發會提高開發效率。
原因2: 嵌入式系統MCU體系結構和指令集不同,因此需要安裝交叉編譯工具進行編譯,這樣編譯的目標程序才能夠在相應的平台上比如:ARM、MIPS、 POWEPC上正常運行。
交叉開發環境的硬體組成主要由以下幾大部分 :
1.開發主機
2.目標機(開發板)
3.二者的鏈接介質,常用的主要有3種方式:(1)串口線 (2)USB線 (3)網線
對應的硬體介質,還必須要有相應的軟體「介質」支持:
1.對於串口,通常用的有串口調試助手,putty工具等,工具很多,功能都差不多,會用一兩款就可以;
2.對於USB線,當然必須要有USB的驅動才可以,一般晶元公司會提供,比如對於三星的晶元,USB下載主要由DNW軟體來完成;
3.對於網線,則必須要有網路協議支持才可以, 常用的服務主要兩個
第一:tftp服務:
主要用於實現文件的下載,比如開發調試的過程中,主要用tftp把要測試的bootloader、kernel和文件系統直接下載到內存中運行,而不需要預先燒錄到Flash晶元中,一方面,在測試的過程中,往往需要頻繁的下載,如果每次把這些要測試的文件都燒錄到Flash中然後再運行也可以,但是缺點是:過程比較麻煩,而且Flash的擦寫次數是有限的;另外一方面:測試的目的就是把這些目標文件載入到內存中直接運行就可以了,而tftp就剛好能夠實現這樣的功能,因此,更沒有必要把這些文件都燒錄到Flash中去。
第二: nfs服務:
主要用於實現網路文件的掛載,實際上是實現網路文件的共享,在開發的過程中,通常在系統移植的最後一步會製作文件系統,那麼這是可以把製作好的文件系統放置在我們開發主機PC的相應位置,開發板通過nfs服務進行掛載,從而測試我們製作的文件系統是否正確,在整個過程中並不需要把文件系統燒錄到Flash中去,而且掛載是自動進行掛載的,bootload啟動後,kernel運行起來後會根據我們設置的啟動參數進行自動掛載,因此,對於開發測試來講,這種方式非常的方便,能夠提高開發效率。
另外,還有一個名字叫 samba 的服務也比較重要,主要用於文件的共享,這里說的共享和nfs的文件共享不是同一個概念,nfs的共享是實現網路文件的共享,而samba實現的是開發主機上 Windows主機和Linux虛擬機之間的文件共享,是一種跨平台的文件共享 ,方便的實現文件的傳輸。
以上這幾種開發的工具在嵌入式開發中是必備的工具,對於嵌入式開發的效率提高做出了偉大的貢獻,因此,要對這幾個工具熟練使用,這樣你的開發效率會提高很多。等測試完成以後,就會把相應的目標文件燒錄到Flash中去,也就是等發布產品的時候才做的事情,因此對於開發人員來說,所有的工作永遠是測試。
通過前面的工作,我們已經准備好了交叉開發環境的硬體部分和一部分軟體,最後還缺少交叉編譯器,讀者可能會有疑問,為什麼要用交叉編譯器?前面已經講過,交叉開發環境必然會用到交叉編譯工具,通俗地講就是在一種平台上編譯出能運行在體系結構不同的另一種平台上的程序,開發主機PC平台(X86 CPU)上編譯出能運行在以ARM為內核的CPU平台上的程序,編譯得到的程序在X86 CPU平台上是不能運行的,必須放到ARM CPU平台上才能運行,雖然兩個平台用的都是Linux系統。相對於交叉編譯,平常做的編譯叫本地編譯,也就是在當前平台編譯,編譯得到的程序也是在本地執行。用來編譯這種跨平台程序的編譯器就叫交叉編譯器,相對來說,用來做本地編譯的工具就叫本地編譯器。所以要生成在目標機上運行的程序,必須要用交叉編譯工具鏈來完成。
這里又有一個問題,不就是一個交叉編譯工具嗎?為什麼又叫交叉工具鏈呢?原因很簡單,程序不能光編譯一下就可以運行,還得進行匯編和鏈接等過程,同時還需要進行調試,對於一個很大工程,還需要進行工程管理等等,所以,這里 說的交叉編譯工具是一個由 編譯器、連接器和解釋器 組成的綜合開發環境,交叉編譯工具鏈主要由binutils(主要包括匯編程序as和鏈接程序ld)、gcc(為GNU系統提供C編譯器)和glibc(一些基本的C函數和其他函數的定義) 3個部分組成。有時為了減小libc庫的大小,也可以用別的 c 庫來代替 glibc,例如 uClibc、dietlibc 和 newlib。
那麼,如何得到一個交叉工具鏈呢?是從網上下載一個「程序」然後安裝就可以使用了嗎?回答這個問題之前先思考這樣一個問題,我們的交叉工具鏈顧名思義就是在PC機上編譯出能夠在我們目標開發平台比如ARM上運行的程序,這里就又有一個問題了,我們的ARM處理器型號非常多,難道有專門針對我們某一款的交叉工具鏈嗎?若果有的話,可以想一想,這么多處理器平台,每個平台專門定製一個交叉工具鏈放在網路上,然後供大家去下載,想想可能需要找很久才能找到適合你的編譯器,顯然這種做法不太合理,且浪費資源!因此,要得到一個交叉工具鏈,就像我們移植一個Linux內核一樣,我們只關心我們需要的東西,編譯我們需要的東西在我們的平台上運行,不需要的東西我們不選擇不編譯,所以,交叉工具鏈的製作方法和系統移植有著很多相似的地方,也就是說,交叉開發工具是一個支持很多平台的工具集的集合(類似於Linux源碼),然後我們只需從這些工具集中找出跟我們平台相關的工具就行了,那麼如何才能找到跟我們的平台相關的工具,這就是涉及到一個如何製作交叉工具鏈的問題了。
通常構建交叉工具鏈有如下三種方法:
方法一 : 分步編譯和安裝交叉編譯工具鏈所需要的庫和源代碼,最終生成交叉編譯工具鏈。該方法相對比較困難,適合想深入學習構建交叉工具鏈的讀者。如果只是想使用交叉工具鏈,建議使用下列的方法二構建交叉工具鏈。
方法二: 通過Crosstool-ng腳本工具來實現一次編譯,生成交叉編譯工具鏈,該方法相對於方法一要簡單許多,並且出錯的機會也非常少,建議大多數情況下使用該方法構建交叉編譯工具鏈。
方法三 : 直接通過網上下載已經製作好的交叉編譯工具鏈。該方法的優點不用多說,當然是簡單省事,但與此同時該方法有一定的弊端就是局限性太大,因為畢竟是別人構建好的,也就是固定的,沒有靈活性,所以構建所用的庫以及編譯器的版本也許並不適合你要編譯的程序,同時也許會在使用時出現許多莫名其妙的錯誤,建議讀者慎用此方法。
crosstool-ng是一個腳本工具,可以製作出適合不同平台的交叉編譯工具鏈,在進行製作之前要安裝一下軟體:
$ sudo apt-get install g++ libncurses5-dev bison flex texinfo automake libtool patch gcj cvs cvsd gawk
crosstool腳本工具可以在http://ymorin.is-a-geek.org/projects/crosstool下載到本地,然後解壓,接下來就是進行安裝配置了,這個配置優點類似內核的配置。主要的過程有以下幾點:
1. 設定源碼包路徑和交叉編譯器的安裝路徑
2. 修改交叉編譯器針對的構架
3. 增加編譯時的並行進程數,以增加運行效率,加快編譯,因為這個編譯會比較慢。
4. 關閉JAVA編譯器 ,減少編譯時間
5. 編譯
6. 添加環境變數
7. 刷新環境變數。
8. 測試交叉工具鏈
到此,嵌入式Linux系統移植四大部分的第一部分工作全部完成,接下來可以進行後續的開發了。
第二部分:bootloader的選擇和移植
01 Boot Loader 概念
就是在操作系統內核運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬體設備、建立內存空間的映射圖,從而將系統的軟硬體環境帶到一個合適的狀態,以便為最終調用操作系統內核准備好正確的環境,他就是所謂的引導載入程序(Boot Loader)。
02 為什麼系統移植之前要先移植BootLoader?
BootLoader的任務是引導操作系統,所謂引導操作系統,就是啟動內核,讓內核運行就是把內核載入到內存RAM中去運行,那先問兩個問題:第一個問題,是誰把內核搬到內存中去運行?第二個問題:我們說的內存是SDRAM,大家都知道,這種內存和SRAM不同,最大的不同就是SRAM只要系統上電就可以運行,而SDRAM需要軟體進行初始化才能運行,那麼在把內核搬運到內存運行之前必須要先初始化內存吧,那麼內存是由誰來初始化的呢?其實這兩件事情都是由bootloader來乾的,目的是為內核的運行准備好軟硬體環境,沒有bootloadr我們的系統當然不能跑起來。
03 bootloader的分類
首先更正一個錯誤的說法,很多人說bootloader就是U-boot,這種說法是錯誤的,確切來說是u-boot是bootloader的一種。也就是說bootloader具有很多種類,
由上圖可以看出,不同的bootloader具有不同的使用范圍,其中最令人矚目的就是有一個叫U-Boot的bootloader,是一個通用的引導程序,而且同時支持X86、ARM和PowerPC等多種處理器架構。U-Boot,全稱 Universal Boot Loader,是遵循GPL條款的開放源碼項目,是由德國DENX小組開發的用於多種嵌入式CPU的bootloader程序,對於Linux的開發,德國的u-boot做出了巨大的貢獻,而且是開源的。
u-boot具有以下特點:
① 開放源碼;
② 支持多種嵌入式操作系統內核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS;
③ 支持多個處理器系列,如PowerPC、ARM、x86、MIPS、XScale;
④ 較高的可靠性和穩定性;
⑤ 高度靈活的功能設置,適合U-Boot調試、操作系統不同引導要求、產品發布等;
⑥ 豐富的設備驅動源碼,如串口、乙太網、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤等;
⑦ 較為豐富的開發調試文檔與強大的網路技術支持;
其實,把u-boot可以理解為是一個小型的操作系統。
04 u-boot的目錄結構
* board 目標板相關文件,主要包含SDRAM、FLASH驅動;
* common 獨立於處理器體系結構的通用代碼,如內存大小探測與故障檢測;
* cpu 與處理器相關的文件。如mpc8xx子目錄下含串口、網口、LCD驅動及中斷初始化等文件;
* driver 通用設備驅動,如CFI FLASH驅動(目前對INTEL FLASH支持較好)
* doc U-Boot的說明文檔;
* examples可在U-Boot下運行的示常式序;如hello_world.c,timer.c;
* include U-Boot頭文件;尤其configs子目錄下與目標板相關的配置頭文件是移植過程中經常要修改的文件;
* lib_xxx 處理器體系相關的文件,如lib_ppc, lib_arm目錄分別包含與PowerPC、ARM體系結構相關的文件;
* net 與網路功能相關的文件目錄,如bootp,nfs,tftp;
* post 上電自檢文件目錄。尚有待於進一步完善;
* rtc RTC驅動程序;
* tools 用於創建U-Boot S-RECORD和BIN鏡像文件的工具;
05 u-boot的工作模式
U-Boot的工作模式有 啟動載入模式和下載模式 。啟動載入模式是Bootloader的正常工作模式,嵌入式產品發布時,Bootloader必須工作在這種模式下,Bootloader將嵌入式操作系統從FLASH中載入到SDRAM中運行,整個過程是自動的。 下載模式 就是Bootloader通過某些通信手段將內核映像或根文件系統映像等從PC機中下載到目標板的SDRAM中運行,用戶可以利用Bootloader提供的一些令介面來完成自己想要的操作,這種模式主要用於測試和開發。
06 u-boot的啟動過程
大多數BootLoader都分為stage1和stage2兩大部分,U-boot也不例外。依賴於cpu體系結構的代碼(如設備初始化代碼等)通常都放在stage1且可以用匯編語言來實現,而stage2則通常用C語言來實現,這樣可以實現復雜的功能,而且有更好的可讀性和移植性。
1、 stage1(start.s代碼結構)
U-boot的stage1代碼通常放在start.s文件中,它用匯編語言寫成,其主要代碼部分如下:
(1) 定義入口。由於一個可執行的image必須有一個入口點,並且只能有一個全局入口,通常這個入口放在rom(Flash)的0x0地址,因此,必須通知編譯器以使其知道這個入口,該工作可通過修改連接器腳本來完成。
(2)設置異常向量(exception vector)。
(3)設置CPU的速度、時鍾頻率及中斷控制寄存器。
(4)初始化內存控制器 。
(5)將rom中的程序復制到ram中。
(6)初始化堆棧 。
(7)轉到ram中執行,該工作可使用指令ldrpc來完成。
2、 stage2(C語言代碼部分)
lib_arm/board.c中的start armboot是C語言開始的函數,也是整個啟動代碼中C語言的主函數,同時還是整個u-boot(armboot)的主函數,該函數主要完成如下操作:
(1)調用一系列的初始化函數。
(2)初始化flash設備。
(3)初始化系統內存分配函數。
(4)如果目標系統擁有nand設備,則初始化nand設備。
(5)如果目標系統有顯示設備,則初始化該類設備。
(6)初始化相關網路設備,填寫ip,c地址等。
(7)進入命令循環(即整個boot的工作循環),接受用戶從串口輸入的命令,然後進行相應的工作。
07 基於cortex-a8的s5pc100bootloader啟動過程分析
s5pc100支持兩種啟動方式,分別為USB啟動方式和NandFlash啟動方式:
1. S5PC100 USB啟動過程
[1] A8 reset, 執行iROM中的程序
[2] iROM中的程序根據S5PC100的配置管腳(SW1開關4,撥到4對面),判斷從哪裡啟動(USB)
[3] iROM中的程序會初始化USB,然後等待PC機下載程序
[4] 利用DNW程序,從PC機下載SDRAM的初始化程序到iRAM中運行,初始化SDRAM
[5] SDRAM初始化完畢,iROM中的程序繼續接管A8, 然後等待PC下載程序(BootLoader)
[6] PC利用DNW下載BootLoader到SDRAM
[7] 在SDRAM中運行BootLoader
2. S5PC100 Nandflash啟動過程
[1] A8 reset, 執行IROM中的程序
[2] iROM中的程序根據S5PC100的配置管腳(SW1開關4,撥到靠4那邊),判斷從哪裡啟動(Nandflash)
[3] iROM中的程序驅動Nandflash
[4] iROM中的程序會拷貝Nandflash前16k到iRAM
[5] 前16k的程序(BootLoader前半部分)初始化SDRAM,然後拷貝完整的BootLoader到SDRAM並運行
[6] BootLoader拷貝內核到SDRAM,並運行它
[7] 內核運行起來後,掛載rootfs,並且運行系統初始化腳本
08 u-boot移植(基於cortex_a8的s5pc100為例)
1.建立自己的平台
(1).下載源碼包2010.03版本,比較穩定
(2).解壓後添加我們自己的平台信息,以smdkc100為參考版,移植自己s5pc100的開發板
(3).修改相應目錄的文件名,和相應目錄的Makefile,指定交叉工具鏈。
(4).編譯
(5).針對我們的平台進行相應的移植,主要包括修改SDRAM的運行地址,從0x20000000
(6).「開關」相應的宏定義
(7).添加Nand和網卡的驅動代碼
(8).優化go命令
(9).重新編譯 make distclean(徹底刪除中間文件和配置文件) make s5pc100_config(配置我們的開發板) make(編譯出我們的u-boot.bin鏡像文件)
(10).設置環境變數,即啟動參數,把編譯好的u-boot下載到內存中運行,過程如下:
1. 配置開發板網路
ip地址配置:
$setenv ipaddr 192.168.0.6 配置ip地址到內存的環境變數
$saveenv 保存環境變數的值到nandflash的參數區
網路測試:
在開發開發板上ping虛擬機:
$ ping 192.168.0.157(虛擬機的ip地址)
如果網路測試失敗,從下面幾個方面檢查網路:
1. 網線連接好
2. 開發板和虛擬機的ip地址是否配置在同一個網段
3. 虛擬機網路一定要採用橋接(VM--Setting-->option)
4. 連接開發板時,虛擬機需要設置成 靜態ip地址
2. 在開發板上,配置tftp伺服器(虛擬機)的ip地址
$setenv serverip 192.168.0.157(虛擬機的ip地址)
$saveenv
3. 拷貝u-boot.bin到/tftpboot(虛擬機上的目錄)
4. 通過tftp下載u-boot.bin到開發板內存
$ tftp 20008000(內存地址即可) u-boot.bin(要下載的文件名)
如果上面的命令無法正常下載:
1. serverip配置是否正確
2. tftp服務啟動失敗,重啟tftp服務
#sudo service tftpd-hpa restart
5. 燒寫u-boot.bin到nandflash的0地址
$nand erase 0(起始地址) 40000(大小) 擦出nandflash 0 - 256k的區域
$nand write 20008000((緩存u-boot.bin的內存地址) 0(nandflash上u-boot的位置) 40000(燒寫大小)
6. 切換開發板的啟動方式到nandflash
1. 關閉開發板
2. 把SW1的開關4撥到4的那邊
3. 啟動開發板,它就從nandflash啟動
㈢ Linux下有沒有類似DOS下的debug.exe程序
有,gdb的x命令,用法:x addr。
詳情參考書籍《Debugging With GDB》「Examing Memory」章節。
此外linux下可鉛賀以用第三槐世派方的as,as86,nasm等工返笑具,都提供匯編功能
㈣ linux 系統下as命令是什麼意思 怎麼用
as命令是gcc套件中的匯編器,它採用的是AT/T的匯編語法,和windows下的MASM不太一樣
㈤ C語言工作原理
作為一種編程語言,本身是談不上工作原理的,實際上C語言所有的語法,正是C語言編譯器的工作原理或者工作機制的具體實現。要細致的討論起來是不可能,但是作為C語言程序員,必須了解這個大致的流程。一個程序,從C語言源碼,到系統可執行的文件,一般經歷四個過程。
1、預處理階斷,這個階斷是文本處理階斷,有預處理器來完成,會將源碼中的帶"#"開頭的預處理命令進行相應的處理,在Linux上C語言的預處理器程序是cp命令。
2、編譯階斷,這個階斷是有C語言編譯階斷,在Linux上C語言的編譯器是cc命令,它將C語言源碼轉換成匯編指令。
3、匯編階斷,這個階斷是匯編編譯階斷,在Linux上C語言的匯編器是as命令,這個階斷會將匯編指令編譯成二進制機器碼。
4、鏈接階斷,這個階斷是會將匯編階斷生成的機器碼目標文件,裝載成一個系統可執行的文件,在Linux平台以ELF格式進行組裝,在Windows平台上以PE格式進行組裝。在Linux平台上的鏈接器命令為ld,在windows平台上的鏈接器命令為linker。
㈥ linux Makefile問題.S.s: $(CPP) $(CFLAGS) $< -o $*.s什麼意思
請慢慢看,真要詳細講起來,文字實在太多了,但是由於時間原因,我只能以粗略的文字講,語言有一些邏輯漏洞,請見諒。
首先我會以粗略的文字回答你的其中一個問題,然後後面會給出第二個問題的答案。
問:什麼時候會執行這些規則及其相對應的命令?
答:當你給make命令指定了它要生成的終極目標時,它會從要生成的終極目標定址依賴的依賴條件,然後依賴條件一級一級的查找並執行相對應的命令。即如果當有目標需要.s、.o這些依賴條件的時候,會取找要生成.s、.o目標的依賴條件,這個時候就會執行這些規則:
.S.s:
$(CPP) $(CFLAGS) $< -o $*.s
.S.o:
$(CC) $(CFLAGS) -c $< -o $*.o
.c.o:
$(CC) $(CFLAGS) -c $< -o $*.o
一、
源代碼文件必須經過:預處理(cpp)、編譯(ccl)、匯編(as)、鏈接(ld)。這四個階段最終才得到可執行的程序:
makefile里定義了變數CPP=cpp;其中$(CPP)的意思是去定義變數CPP里的值:cpp,用cpp來預處理源文件。
$(CFLAGS)的意思是取定義變數CDLAGS裡面的值,一般是一些自我定義的預處理命令和編譯命令的參數。
$<的意思是:在規則的命令中,表示第一個依賴條件
-o是一個預處理、編譯等執行命令需要的參數
/*
其實這條命令:$(CPP) $(CFLAGS) $< -o $*.s,就是一條預處理命令,將一個源文件預處理為.s文件後綴的文件,*為通配符。那源文件在哪裡呢。其實這條命令.S.s: 已經說了以.S結尾的文件就是源文件。那這條命令.S.s這么說了呢?請看下面的後綴規則講解。
*/
二、
老式風格的"後綴規則"
後綴規則是一個比較老式的定義隱含規則的方法。後綴規則會被模式規則逐步地取代。因為模式規則更強更清晰。為了和老版本的Makefile兼容,GNU make同樣兼容於這些東西。後綴規則有兩種方式:"雙後綴"和"單後綴"。
雙後綴規則定義了一對後綴:目標文件的後綴和依賴目標(源文件)的後綴。如".c.o"相當於"%o : %c"。單後綴規則只定義一個後綴,也就是源文件的後綴。
後綴規則中所定義的後綴應該是make所認識的,如果一個後綴是make所認識的,那麼這個規則就是單後綴規則,而如果兩個連在一起的後綴都被make所認識,那就是雙後綴規則。例如:".c"和".o"都是make所知道。
因而,如果你定義了一個規則是".c.o"那麼其就是雙後綴規則,意義就是".c" 是源文件的後綴,".o"是目標文件的後綴。如下示例:
.c.o:
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
其中.c.o:這個命令表示源文件的後綴為.c,目標文件的後綴為.o;即也可理解為:生成.o的目標文件依賴條件是源文件.c
下面命令是將是所有的.c源文件都編譯成.o的目標文件。
註:後綴規則不允許任何的依賴文件,如果有依賴文件的話,那就不是後綴規則,那些後綴統統被認為是文件名,
如:
.c.o: foo.h
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
這個例子,就是說,文件".c.o"依賴於文件"foo.h",而不是我們想要的這樣:
%.o: %.c foo.h
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
因此後綴規則不允許任何的依賴文件。
㈦ Linux系統中的redhat的常用輸入命令有哪些
redhat linux的命令
一. 啟動,關機,登入,登出相關命令
<login> 登錄
<logout> 登出
<exit> 登出
<shutdown> 停止系統
<halt> 停止系統
<reboot> 重啟動
<poweroff> 切斷電源
<sync> 把內存里的內容寫入磁碟
<lilo> 安裝lilo啟動管理程序
<grub> 安裝lilo啟動管理程序
二. Shell相關命令
<chsh> 切換Shell
<history> 顯示命令履歷
<alias> 設置命令別名
<unalias> 取消命令別名
<which> 顯示命令所在位置
<type> 查詢命令種類
<echo> 顯示字元串或者變數內容
<set> 設置/顯示Shell變數
<printenv> 顯示環境變數
<export> 設置環境變數
<env> 設置臨時環境變數
<unset> 釋放環境變數
<setenv> 設置環境變數
<unsetenv> 釋放環境變數
<source> 執行文件當中的命令
<man> 查詢命令手冊
<info> 查詢超文本命令手冊
<whatis> 顯示命令簡介
<apropos> 通過關鍵字查詢手冊
三. 用戶管理相關命令
<su> 切換到其他用戶
<useradd> 追加用戶
<adser> 追加用戶
<userdel> 刪除用戶
<usermod> 修改用戶設置
<chfn> 修改用戶私人信息
<groupadd> 追加組
<groupdel> 刪除組
<groupmod> 修改組設置
<passwd> 更改密碼
<whoami> 顯示用戶名
<logname> 顯示登錄用戶帳號
<users> 顯示所有登錄用戶信息
<who> 查詢登錄用戶信息
<w> 查詢登錄用戶信息
<id> 顯示指定用戶的ID信息
<groups> 顯示指定用戶的所屬組
<finger> 顯示指定用戶的個人信息
<mesg> 開關與他人收發消息
<write> 給其他用戶發消息
<wall> 給所有用戶發消息
<talk> 和其他用戶聊天
四. 系統消息相關命令
<date> 顯示/設置當前時間
<uptime> 顯示系統運行時間
<arch> 顯示機器的核心構架(如i386)
<uname> 顯示操作系統信息
<tty> 顯示終端名
<last> 顯示登錄/登出在履歷
<lastb> 顯示非法登錄信息
<mpkeys> 顯示當前鍵盤配置
<loadkeys> 變更鍵盤配置
<df> 查詢磁碟使用信息
<> 查詢磁碟使用信息
<dmesg> 顯示系統啟動消息
<script> 保存輸入輸出到文件
五. 文件操作相關命令
<ls> 顯示文件列表
<tree> 顯示目錄樹
<pwd> 顯示當前路徑
<cd> 更改當前路徑
<pushd> 追加路徑到目錄堆棧
<popd> 從目錄堆棧刪除路徑
<dirs> 顯示目錄堆棧的內容
<mkdir> 創建路徑
<rmdir> 刪除路徑
<cp> 復制文件/目錄
<rm> 刪除文件/目錄
<mv> 移動文件/目錄,修改文件名
<chown> 更改文件/目錄的所有者
<chgrp> 修改文件/目錄的所有組
<chmod> 修改文件/目錄的許可權
<touch> 更改文件時間
<ln> 建立文件/目錄鏈接
<find> 查找文件
<whereis> 顯示文件存在的路徑名
<file> 查詢文件種類
<size> 查詢文件大小
六. 文件編輯相關命令
<cat> 顯示文件內容
<tee> 輸出到文件和屏幕
<more> 分屏顯示文件內容
<less> 分屏顯示文件內容
<head> 顯示文件頭部內容
<tail> 顯示文件尾部內容
<fold> 折疊顯示長行
<sort> 排列文件的行
<cmp> 比較文件內容
<diff> 顯示文件差異
<nkf> 更改日語文件編碼
<dd> 變更文件之後復制
<wc> 統計文本單詞數,文件大小等
<split> 分割文件
<paste> 以行連接文件
<join> 以欄位連接文件
<grep> 查詢文字
<uniq> 過濾重復部分顯示文件內容
<tr> 替換文字
<sed> 替換文字
七. 壓縮/解壓縮相關命令
<ar> 壓縮/解壓縮文件
<tar> 壓縮/解壓縮文件
<compress> 壓縮/解壓縮文件
<uncompress> 解壓縮
<gzip> 壓縮/解壓縮文件
<gunzip> 解壓縮
<zcat> 顯示壓縮文件的內容
<lha> 壓縮/解壓縮文件
<uuencode> 把二進制文件編碼為文本文件
<uudecode> 把經過編碼的文本文件還原為二進制文件
八. MS-DOS工具集[mtools]命令
<mdir> 顯示文件列表
<mcd> 改變當前目錄
<mmd> 新建目錄
<mrd> 刪除目錄
<mdeltree> 刪除目錄樹
<m> 復制文件
<mdel> 刪除文件
<mmove> 移動文件
<mren> 更改文件或目錄名
<mattrib> 修改文件屬性
<mtype> 顯示文件內容
<m> 查詢文件或目錄大小
<minfo> 顯示磁碟信息
<mformat> 以MS-DOS方式格式化磁碟
<mlabel> 設置磁碟標簽
九. 控制外部設備相關命令
<mount> mount上設備
<umount> 解除已經mount上的設備
<eject> 彈出(CD/DVD等)
<fdformat> 格式化軟盤
<fdisk> 配置/顯示硬碟分區
<mkfs> 格式化磁碟分區
<fsck> 檢查/修復磁碟錯誤
<lpr> 列印到列印機
<lprm> 中斷列印任務
<lpq> 顯示列印任務的狀態
<lpc> 管理/控制列印任務
<ifconfig> 顯示/設定NIC配置
十. 進程及任務管理相關命令
<ps> 顯示正在運行的進程
<jobs> 顯示後台運行任務
<fg> 把任務切換到前台
<bg> 把任務切換到後台
<kill> 中止進程或任務
<killall> 中止進程或任務
<wait> 等待進程或任務的結束
<at> 設置定時執行任務
<atq> 顯示尚未執行的任務
<atrm> 刪除定時執行任務
<batch> 在系統負荷減輕的時候執行任務
<nice> 改變優先度並執行任務
<nohup> 在後台執行任務,Logout之後也不退出
<sleep> 休眠一定的時間
十一. 網路管理相關命令
<netstat> 顯示當前網路連接狀況
<route> 顯示/設置路由
<host> 顯示網路主機情況
<hostname> 顯示/設置當前主機的名字
<ping> 確認和遠程機器的連接情況
<traceroute> 顯示路由信息
<rwho> 查詢網上機器的登陸用戶
<ruptime> 查詢網上機器的系統運行時間
<rlogin> 登陸到遠程機器
<telnet> 用telnet登陸到遠程機器
<rsh> 給遠程機器發送命令
<rcp> 在遠程機器之間復制文件
<mail> 收取郵件
<sendmail> 發送郵件
<mailq> 確認郵件隊列
<ftp> 用ftp傳輸文件
十二. 其他命令
<cal> 顯示日歷
<clear> 清屏
<gcc> 編譯C語言代碼
<as> 匯編
<bc> 計算
<rpm> Redhat的包管理
<dpkg> Debian的包管理
<installpkg> Slackware的包安裝(刪除命令則是removepkg)
<XF86Setup,turboxfg,Xconfigurator> 配置 X 伺服器
<startx> 啟動 X-Window 系統
附:組合命令
重定向,如
$ ls -l /bin > ls-output
$ more ls-output
管道命令,如
$ cat file1 file2 | sort | uniq
經常被用於管道的命令
awk, fold, grep, head, nnkf, pr, sed, sort, tail, tee, tr, uniq, wc
很多了
㈧ arm-linux-gcc怎麼編譯自己寫的頭文件
linux gcc編譯c文件頭文件
linux gcc編譯c文件頭文件,使用GCC編譯器編譯C語言
凶豬下山
轉載
關注
0點贊·1047人閱讀
GCC編譯C源代碼有四個步驟:預處理—->編譯—->匯編—->鏈接。
可以利用GCC的參數來控制執行的過程,這樣就可以更深入的了解編譯C程序的褲晌過程。
下面將通過對一個程序的編譯來演示整個過程。
#include
int main()
{
printf("happy new year!\n");
return 0;
}
1:預處理:編譯前純李器將C程序的頭文件編譯進來,還有宏的替換,可以用gcc的參數-E來參看。
預處理 命令:gcc -E hello.c -o hello.i
作用:將hello.c預處理輸出hello.i
2:編譯:這個階段編譯器主要做詞法分析、語法分析、語義分析等,在檢查無錯誤後後,把代碼翻譯成匯編語言。可用gcc的參數-S來參看。
編譯器(ccl)將文本文件hello.i 翻譯成文本文件hello.s, 它包含一個匯編語言程序。匯編語言程序中的每條語句都以一種標準的文本格式描述了一條低級機器語言指令。
編譯命令:gcc -S hello.i -o hello.s
作用:將預處理輸出文件hello.i匯編成hello.s文件
3:匯編:把編譯階段生成的.s 文件轉換為二進制目標代碼。可用gcc的參數-c來參看。匯編器(as)將hello.s翻譯成機器語言指令,把這些指令打包成可重定位目標程序的格式, 並將結果保存在目標文件hello.o中。hello.o文件是一個二進制文件,它的位元組編碼是機器語言。
匯編 命令:gcc -c hello.s -o hello.o
作用:作用:將匯編輸出文件hello.s編譯輸出hello.o文件
4:鏈接:把obj文件鏈接為可執行的文件:鏈接器(ld)負責.o文件的並入。結果就是hello文件,它是一個課執行的目標文件,可以載入到存儲器後由系統調用。
鏈接命令:gcc hello.o -o hello
一步操作的話是: (-o必須在hello之前 )
$gcc hello.c -o hello
$./hello或者:(會默認生成a.out文件)
$gcc hello.c
$./慧遲a.out
㈨ 怎樣通俗地理解Linux(Debian)中軟體包互相之間的依賴
不管是初步跨入Linux殿堂的新手,還是具有多年經驗的專家,在安裝或編譯軟體包的過程中或多或少的都會遇到包的依賴問題,從而導致安裝過程無法繼續,比如管理員在安裝LAMP時,包需要libgd.so文件,而這個文件屬於GD軟體包。但是在安裝GD軟體包時,可能這個軟體包跟其他軟體包又具有依賴關系,又需要安裝其他軟體包才行。這時有的管理員便失去耐心。在遇到這種Linux軟體包依賴關系問題時,該如何解決呢?在談這個具體的措施之前,先跟大家聊聊Linux系統里的軟體依賴性問題。
一、什麼是依賴性耐喚明
程序依賴於程序代碼的共享庫,以便它們可以發出系統調用將輸出發送到設備或打開文件等(共享庫存在於許多方面,而不只局限於系統調用)。沒有共享庫,每次程序員開發一個新的程序,每個程序員都需要從頭開始重寫這些基本的系統操作。當編譯程序時,程序員將他的代碼鏈接到這些庫。如果鏈接是靜態的,編譯後的共享庫對象代碼就添加到程序執行文件中;如果是動態的,編譯後的共享庫對象代碼只在運行時需要它時由程序員載入。動態可執行文件依賴於正確的共享庫或共享對象來進行操作。rpm依賴性嘗試在安裝時強制實施動態可執行文件的共享對象需求,以便在以後當程序運行時不會有與動態鏈接過程有關的任何問題。
注意:還有一種類型的依賴性,它基於顯式的條目,rpm通過程序員將該依賴性強加到rpm配置文件中,但目前我們不關心這種類型的依賴性,這種依賴性比較容易解決。這里將重點放在rpm強制實施的更加復雜的共享對象依賴性。
二、動態可執行文件和共享對象
動態可執行文件使用最初編譯和鏈接程序時使用的庫文件的共享對象名稱來查找共享對象。它們在少數的幾個標准位置查找,比如在/lib和/usr/lib目錄及在LD_LIBRARY_PATH環境變數(主要用於指定查找共享庫,比如我們在安裝Oracle時指定路徑,exportLD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib)指定的目錄中。順便提一下,在這些庫目錄中找到的共享對象可能不是真正的文件;它們可能是指向位於其他位置的真實庫文件的符號鏈接(但通常仍舊在標准庫目錄的一個目錄中)。至少從系統管理員的觀點是在用於創建共享庫文件的共享庫軟體包的名稱和共享庫文件的名稱之間通常沒有什麼關系。例如,GLIBC2.3軟體包用於創建libc.so.6共享庫文件。也從本示例中注意到,添加到共享庫文件名結束的版本號(.6)跟用於創建它的版本號(2.3)沒有關系。這是由共享庫軟體包開發人員有意完成的,以便GLIBC的新版本可以重用相同的共享庫文件名libc.so.6。這允許您在系統上載入新版本的GLIBC,而不用中斷動態鏈接到lib.so.6共享庫文件的所有昌告程序,當然假定新版本的GLIBC向後與動態可執行文件最初所鏈接的老版本GLIBC兼容。因此,即使庫文件或共享對象文件有與它們相關的版本號,這些版本號也不能幫助你確定他們來自哪個版本的共享軟體包。
注意:當將whatprovides選項用於rpm查詢命令時,可以獲得有關使用rpm軟體包載入到系統的現有共享對象的信息。這種混亂是由下面的事實造成的:單個共享庫文件可能支持某個范圍的共享庫軟體包版本。例如,要檢查soname庫文件/lib/libc.so.6支持的GLIBC共享庫軟體包,運行下面的鏈叢命令:
#objmp--all-headers/lib/libc.so.6|less
向下滾動此報告,直到到達Versiondefinitions:部分,以便查看libc.so.6共享庫文件支持哪些GLIBC版本:
Versiondefinitions:
10x010x0865f4e6libc.so.6
20x000x0d696910GLIBC_2.0
30x000x0d696911GLIBC_2.1
GLIBC_2.0
40x000x09691f71GLIBC_2.1.1
GLIBC_2.1
50x000x09691f72GLIBC_2.1.2
GLIBC_2.1.1
60x000x09691f73GLIBC_2.1.3
GLIBC_2.1.2
70x000x0d696912GLIBC_2.2
GLIBC_2.1.3
80x000x09691a71GLIBC_2.2.1
GLIBC_2.2
90x000x09691a72GLIBC_2.2.2
GLIBC_2.2.1
100x000x09691a73GLIBC_2.2.3
GLIBC_2.2.2
110x000x09691a74GLIBC_2.2.4
GLIBC_2.2.3
120x000x09691a76GLIBC_2.2.6
GLIBC_2.2.4
130x000x0d696913GLIBC_2.3
GLIBC_2.2.6
140x000x09691972GLIBC_2.3.2
GLIBC_2.3
150x000x09691973GLIBC_2.3.3
GLIBC_2.3.2
160x000x09691974GLIBC_2.3.4
GLIBC_2.3.3
170x000x0d696914GLIBC_2.4
GLIBC_2.3.4
180x000x0d696915GLIBC_2.5
GLIBC_2.4
190x000x0963cf85GLIBC_PRIVATE
GLIBC_2.5
200x000x0b792650GCC_3.0
在本示例中,1ibc.so.6共享庫文件支持原先為GLIBC版本2.0到2.5而開發的所有動態執行文件。注意:也可以使用objmp命令來從共享庫文件中提取soname,命令如下所示:
#objmp--all-headers/lib/libcrypto.so.0.9.8b|grepSONAME
SONAMElibcrypto.so.6
objmp:/lib/libcrypto.so.0.9.8b:
接下來,將討論rpm軟體包是如何生成的,以便在新系統上安裝rpm軟體包時,這些共庫依賴性是己知的。
三、Rpm軟體包和共享庫依賴性
當程序員生成rpm軟體包時,ldd命令用於報告動態可執行文件軟體包中所有動態可執行文件使用的所有共享庫。另一個混亂是由下面的事實帶來的:相同軟體包中的不同動態可執行文件可能與相同的共享庫軟體包的不同版本進行鏈接。例如,Heartbeat軟體包中的不同程序可能已經進行了開發,並動態鏈接到libc.so.6sonmae共享庫文件的不同GLIBC版本。對rpm命令使用-q和--requires參數,可以看到rpm軟體包需要的共享庫的完整清單。例如,要看到Heartbeatrpm軟體包所有的所需依賴性,請使用命令:
#rpm-q--requires-pheartbeat-1.x.x.i386.rpm
這產生了下面的報告:
sysklogd
/bin/sh
/bin/sh
/usr/bin/python
ld-linux.so.2
libapphb.so.0
libc.so.6
libc.so.6(GLIBC_2.0)
libc.so.6(GLIBC_2.1)
libc.so.6(GLIBC_2.1.3)
libc.so.6(GLIBC_2.2)
libc.so.6(GLIBC_2.3)
libccmclient.so.0
libdl.so.2
libglib-1.2.so.0
libhbclient.so.0
libpils.so.0
libplumb.so.0
libpthread.so.0
librt.so.1
libstonith.so.0
注意,在此報告中,libc.so.6soname是所需要的,此共享庫必須支持使用GLIBC共享軟體包版本號2.0、2.1、2.1.3、2.2和2.3進行鏈接的動態可執行文件。這是由下面的事實決定的:Heartbeat軟體包中的不同動態可執行文件是針對不同版本的libc.so.6庫的每個版本進行鏈接的。在了解了動態可執行文件、共享對象、soname和共享庫軟體包彼此是如何相關的後,下面准備來看這樣的一個例子:當嘗試安裝rpm軟體包,並且它由於依賴性錯誤而失敗時,會發生什麼。yum能夠從指定的伺服器自動下載RPM包並且安裝,可以自動處理依賴性關系,並且一次安裝所有依賴的軟體包,無須繁瑣地一次次下載、安裝。
四、手工解決依賴性問題
通常,當嘗試安裝發行版中沒有包括的軟體包(及不能由像up2date、apt-get或Yum一樣的更新工具自動解決其依賴性的軟體包)時,將碰到rpm依賴性錯誤。例如,如果嘗試在老的Linux發行版上使用rpm–ivh*rpm命令,例如所有的Heartbeatrpm包,那麼在安裝過程中就可能碰到下面的錯誤:
error:faileddependencies:
libc.so.6(GLIBC_2.3)isneededbyheartbeat-1.x.x
libc.so.6(GLIBC_2.3)isneededbyheartbeat-pils-1.x.x
libcrypto.so.0.9.6isneededbyheartbeat-stonith-1.x.x
libsnmp-0.4.2.6.soisneededbyheartbeat-stonith-1.x.x
注意,rpm命令沒有干擾報告所需的每個GLIBC共享庫軟體包版本號——它只報告所需的最高編號的版本號(GLIBC_2.3)。(假定原來的軟體包開發人員不會將相同軟體包中的可執行文件鏈接到不兼容版本的共享庫軟體包)所有的這些故障都報告所需的共享庫名稱或soname(而不是文件名稱,soname始終以「lib」開始)。但可以刪除添加到rpm報告的soname結束的版本號,並快速檢查以查看是否在系統中使用locate命令安裝這些共享庫(假設您的locate資料庫是最新的,有關更多信息,請參閱locate或slocate的手冊頁)。例如,要查找libcrypto享庫文件,要輸入:
#locatelibcrypto
[root@localhost~]#locatelibcrypto
/lib/libcrypto.so.0.9.8b
/lib/libcrypto.so.6
/root/.Trash/vmware-tools-distrib/lib/lib32/libcrypto.so.0.9.8
/root/.Trash/vmware-tools-distrib/lib/lib32/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/root/.Trash/vmware-tools-distrib/lib/lib64/libcrypto.so.0.9.8
/root/.Trash/vmware-tools-distrib/lib/lib64/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/usr/lib/libcrypto.a
/usr/lib/libcrypto.so
/usr/lib/pkgconfig/libcrypto.pc
/usr/lib/vmware-tools/lib32/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib32/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib64/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib64/libcrypto.so.0.9.8/libcrypto.so.0.9.8
如果此命令沒有在系統上找到一個libcrypto共享庫文件,將需要轉到Internet並找出哪個共享庫軟體包包含此共享庫文件。完成此項工具的一個快速和簡便方式是只要在http://rpmfind.net上將共享庫的名稱輸入到搜索欄中。如果將文本libcrypto.so輸入到此搜索貞中,將很快知道此共享庫是由openssl軟體包提供的。
如果老版本的共享庫數據包已經安裝在系統上,可以用如下的命令確認此軟體包含您需要的共享庫文件:
#rpm-q--providesopenssl
[root@localhost~]#rpm-q--providesopenssl
config(openssl)=0.9.8b-10.el5
lib4758cca.so
libaep.so
libatalla.so
libchil.so
libcrypto.so.6
libcswift.so
libgmp.so
libnuron.so
libssl.so.6
libsureware.so
libubsec.so
openssl=0.9.8b-10.el5
此命令報告此rpm軟體包中提供的所有內容(這包括軟體包提供的共享庫文件的soname)。注意:如前面指出的,共享庫軟體包版本號沒有並且應該沒有與共享庫文件(soname)版本號的任何對應關系。這里不進行這方面的討論,因為soname符號鏈接可能指向不同版本的共享庫文件,這也是在盡量避免在安裝新版本的共享軟體包時中斷現有動態可執行文件的情況下完成的。
五、自動解決依賴性故障
當您使用rpm軟體包來生成、升級或添加新的特性到系統時,依賴性故障可能很快變成一場惡夢。只要通過使用您的發行版供應商的升級服務或工具,就可以避免這場惡夢。例如,當選擇要安裝的rpm軟體包時,RedHat工具up2date自動從RedHat下載並安裝所有rpm依賴性。下面就點上列出了幾個完成相同事情的支持社區的免費方法:http://www.rpm.org/。下面將只進一步看到這些自動更新工具中的一種:Yum。
1.使用Yum來安裝rpm軟體包
Yum(YellowdogUpdater,Modified)程序可從下面網址下載:http://yum.baseurl.org/download/3.4/yum-3.4.3.tar.gz
在下載了此軟體包後,可以使用下面的命令像任何其他rpm軟體包那樣安裝它:
#rpm-ivhyum*
您可能需要更新想用於下載您的rpm軟體包的存儲庫。有關Fedora的可用Yum存儲庫的清單在http://www.fedoratracker.org要切換到不同的存儲庫,下載這些文件中的一個文件,並將該文件作為/etc/yum.conf文件安裝。現在可以用下面的命令告訴Yum報告存儲在Yum存儲庫中、可用於安裝所有軟體包:
#yumlist
[root@localhost~]#yumlist|more
.
RHNsupportwillbedisabled.
Loading"security"plugin
Loading"rhnplugin"plugin
InstalledPackages
Deployment_Guide-en-US.noarch5.2-9installed
Deployment_Guide-zh-CN.noarch5.2-9installed
Deployment_Guide-zh-TW.noarch5.2-9installed
GConf2.i3862.14.0-9.el5installed
GConf2-devel.i3862.14.0-9.el5installed
ImageMagick.i3866.2.8.0-4.el5_1.1installed
MAKEDEV.i3863.23-1.2installed
MySQL-python.i3861.2.1-1installed
NetworkManager.i3861:0.6.4-8.el5installed
NetworkManager-glib.i3861:0.6.4-8.el5installed
2.用Yum安裝新的rpm軟體包
在本示例中,將安裝新的GLIBC軟體包。用簡單的命令安裝最新的GLIBC及其所有依賴性:
#yumupdateglibc
如果一切正常,Yum程序將自動檢測、下載並安裝最新GLIBC軟體包所需要的所有rpm軟體包(這里的GLIBC軟體包是為您的發行版而構建的,不一定是可用的最新版GLIBC軟體包(使用發行版所批準的GLIBC共享庫軟體包版本號或冒險安裝沒有使用正常系統操作所需要的動態可執行文件的GLIBC軟體包版本)。也可以將list參數用於Yum和grep命令來查找要安裝的軟體包。例如,要查找名稱中有SNMP的軟體包,請輸入:
#yumlist|grepsnmp
此命令返回如下報告:
.
RHNsupportwillbedisabled.
net-snmp.i3861:5.3.1-24.el5installed
net-snmp-libs.i3861:5.3.1-24.el5installed
net-snmp-perl.i3861:5.3.1-24.el5installed
net-snmp-utils.i3861:5.3.1-24.el5installed
現在可以容易地使用YUM下載並安裝所有這些rpm軟體包。
六、關於升級Gilbc的建議
Glibc庫是Linux底層的運行庫,其性能對於整個系統的運行有重要的意義。Glibc庫包含了大量函數,其中的函數可大致分成兩類,一類是與操作系統核心溝通的系統調用介面,它們作為功能型函數被調用,提供對Linux操作系統調用的包裝與預處理。另外一類為一般的函數對象,它們提供了經常使用的功能的實現,作為工具型函數使用。在實踐中,有不少軟體就是依賴與Glibc版本才能安裝並運行,說白了對於Glibc版本要求是版本高了不行,低了還不成。這些編譯環境中的應用程序也和其它程序一樣必須有運行的環境,我常遇到管理員在生產中給伺服器裝了最新的Linux發行版,結果應用軟體裝不上去,原因是Glibc的版本不對,有的是寫在原發行版glibc上升級有的是降級,結果倒是整個系統的崩潰,實踐經驗告訴我,你只有選擇相應Linux發行版里對應的glibc,例如我們單位的一個應用軟體時在rhel3.0下開發的,那麼就得要對應的發行版,換了別的就難說了,任何自己升級或降級Glibc來適應應用軟體的做法都是不可取的,問題最後的解決方法是找到了RHEL3裝上就解決了。在表一中,我把幾個linux發行版原配的Glibc版本列出,供大家參考。
點擊圖片查看大圖
Glibc庫與核心功能組件
上圖一說明:
GCC依賴於glibc
binutils依賴於glibc(binutils提供了一系列用來創建、管理和維護二進制目標文件的工具程序,如匯編(as)、連接(ld)、靜態庫歸檔(ar)、反匯編)
make依賴於glibc
頭文件是在編譯時候gcc所需要的,但本身都是一些文本文件,因此沒有需要的運行環境。
常用工具依賴於glibc和各種需要用到的動態庫。
下表一列出了多個重要Linux發行版的Glibc的情況
Linux發行版Glibc版本
Redhat9glibc-2.3.2-5
Fedora1glibc-2.3.2
RedhatEnterpriseLinuxAs3glibc-2.3.2-95
RedhatEnterpriseLinuxAs4glibc-2.3.4
RedhatEnterpriselinux5glibc-2.5-24
RedhatEnterpriselinux6glibc-2.9
Centos5.xglibc-2.5
-2.3.2-92
-2.4.31.54
-2.9
點擊圖片查看大圖
Linux發行版glibc(32)位
下面介紹幾個查詢glibc版本號的方法:
#ls–al/lib/libc*
或者是用下面的命令也可以實現
#rpm–qp|grepglibc
基於debian的系統通過dpkg–l|greplibc6也可以查到,總之一般都在/usr/share/doc目錄下都能看到glibc的相關信息。
七、小結
大部分情況下,在遇到軟體包依賴關系問題的時候,操作系統提供的文件名字與軟體包名字都會有直接的聯系。有可能文件的名字就是軟體包的名字。但是有些時候文件的名字與軟體包的名字會相差甚遠。此時大部分系統管理員可能光憑文件名字無法找到對應的軟體包。此時可以先在系統安裝光碟里找,如果找到那時最佳選項,然後就需要藉助筆者上面談到的一些專業網站,去查詢軟體包的名字了。當系統管理員安裝了某個軟體之後,如果存在軟體包之間的依賴關系,則最好能夠拿本子或者通過其他手段記錄下來。以便下次方便實用,注意工作中的積累,相信絕大部分的軟體包依賴關系問題都會迎刃而解。
㈩ linux命令行中輸入as,就不能打命令了,也退不出去
不知道as指令是幹嘛用的,剛剛也沒查到。我在輸入as後,出現了你同樣的情況,在linux中碰到了這種問題一般是強制殺死掉該進程,做法就是按下crtl+c.
另一種做法,要求你是超級用戶root登錄,另開一個中斷,輸入ps -le能看到所有進程,找到as進程,它會有個pid,輸入kill as進程的pid,也可以中斷它,這是你在沒有as進程的終端輸入時候使用的辦法,一般用來殺死其它人的死循環進程或者是不友善進程。