青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 298  文章 - 377  trackbacks - 0
<2008年6月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

常用鏈接

留言簿(34)

隨筆分類

隨筆檔案

文章檔案

相冊

收藏夾

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

在發布linux-fpga系列文章 和PowerPC平臺Linux的移植系列文章后,很多朋友發mail來問我一些執行軟件上面的問題,大部分都是和軟件所使用的鏈接庫相關的。Novell的官方網站上有一篇文章 對相關問題介紹得比較詳細,我就參照該文章寫出中文版,希望能對遇到此類問題的朋友有所幫助。

介紹

很多時候,諸如glibc這種基本庫,由于有著不同的版本存在,如果正好你手上只有適用于某個版本的packages,就會遇到各種各樣的問題。所以,如果你打算在不同版本上使用這些軟件包,就需要尋找一個比較好的移植方法。而這篇文章正是介紹相應方法的。在往下看之前,請確保你有能力安裝和配置相應的文件(因為文檔中也會提供一些提示)。下面所有的示例都基于X86硬件平臺,如果你使用的是其他體系,那么可能示例代碼和相應的技巧都需要改變。本文是在實際工程中所使用步驟的總結性描述,歡迎提出意見和指正。

背景


一個Linux程序通常都包含有執行特定功能的機器代碼,而很多功能通常都由庫文件提供。程序員朋友都知道,庫文件又分為靜態版本和動態共享版本,當一個程序被創建時,開發者就會決定是使用動態庫還是靜態庫。在使用靜態庫的程序中,可能出現不同版本或者在靜態庫的基礎架構上產生變化而引起的二進制不兼容。由于C++的成熟但是未通用標準化,經常會出現后者的情況。詳細點說,就是一些具體實現的細節,比如,如果用于創建庫的編譯器版本不同,派生繼承格(derived inheritance lattices)中的虛擬函數進行地址映射的機制,就會使相同庫擁有不同且互不兼容的版本。

共享庫倒是有很多好處,機器代碼只需要加載到內存一次;使用這個庫的不同程序都在共享它,而且只有程序具體所需要的數據才會在內存中分配空間;另外,系統管理員可以很輕松得升級共享庫,而無需接觸那些使用這個庫的程序,這一點對于安全特性來說特別重要。

說了半天,上面沒有一個特點是Linux特性,因為這些都是各種現代操作系統所使用或者支持庫的常規描述,所以就不廢話了,具體的細節建議Google。

劇本

終于進入正題了。你遇沒遇到過這種問題,辛辛苦苦down下來一個新版本程序,正準備在你新版本,最新推出的Linux系統上使用,卻發現不能運行?恩,這種問題通常發生于libc4到libc5的轉換或者libc5到libc6的轉換,后者就是通常所說的glibc (the GNU C library)。

C的庫基本上是所有UNIX/Linux系統中最重要的庫文件,因為它們扮演了所有應用程序和內核之間的接口角色。如果這種核心庫文件被改變,而這種改變又不向后兼容,那么,就可能導致整個系統都無法使用。

當然還有另外一種情況,一個程序已經在一個使用了較新版本的庫的系統中被構建,而你如今想將它安裝到你的當前系統中,當然,這種程序是不可能正常運行的,原因就是程序很可能會使用到只有較新版本的庫文件中才會擁有的新的或者改動過的特性。正如所有人都知道的那樣,包含有舊版本庫所沒有的功能的新版本庫是不會被加載以及執行的。下面以glibc舉例子:


GLIBC 版本 文件名稱
libc5 /lib/libc.so.5
libc6 /lib/libc.so.6

有時版本號還有附加后綴,比如libc.so.6.3.3.

正如在背景中所描述的那樣,由版本號大于3.3的GNU C++所編譯的C++庫的二進制不兼容性,會導致額外的復雜度,就算是在當前包括了一致的API(Application Programming Interface)和ABI(Application Binary Interface)定義的標準化環境中也同樣如此。而且,未來C++ compilers和庫的版本是否會保持完全兼容,也尚未得知。針對這個內容,LSB(Linux Standards Base)推薦所有的軟件開發商用C++開發軟件的時候,C++部分都使用靜態鏈接,不幸的是沒幾個開發商是遵循了這個推薦的。更糟糕的是,Linux的發布廠商通常都會創建自己版本的C++編譯器,卻沒有讓它們的共享庫和標準C++編譯器的一致。

總的來說,如果你想運行一個程序,卻失敗了,錯誤信息和下面這條信息類似,那么這個問題可能能夠通過本文“解決方案”部分的建議來解決。

運行程序時的錯誤信息

./a.out: relocation error: ./a.out: symbol errno, version GLIBC_2.0 not defined in file libc.so.6 with link time reference

如果你恰好遇到像上面這樣的關于symbol errno的錯誤信息,就說明你的程序被鏈接到了某個版本號低于2.3的glibc上。為了保證其線程安全的特性(每個線程盡量只訪問別的線程不訪問的變量或內存,如果硬是要訪問同一變量或內存的話,就要采用適當的互斥機制來避免由于線程切換而導致的不確定性),更新版本的glibc不再將errno作為全局變量來提供。在這種情況下,可能你不得不安裝擁有較老版本(比如2.2.5版本)的兼容環境。

但是,如果你并沒有看見上述信息,而程序還是沒有按照你所想象那樣的正常運行,那你可能就是遇到了上述介紹的C++相關問題。我們知道,運行時鏈接器(runtime linker)用于將你的程序加載到內存中,并負責解決任何和共享庫相關的依賴,它還能夠在你的系統中定位所需要的共享庫,并將它們加載到內存中,但是,這個共享庫不一定適合目前你希望運行的程序。這就是問題所在。

解決方案

等你確定了問題的源頭后,就可以創建一個兼容環境,來提供正常執行程序所需要的功能特性。在這里強烈推薦一種方法,就是在標準系統文件路徑,例如/lib和 /usr/lib外安裝附加的庫文件,如下所示 :


想移植的程序名 zoo
用于安裝兼容文件的目錄地址的前綴 /opt/compat-env/zoo
需要的庫 glibc-2.3.2-95.27
libgcc-3.2.3-42 libstdc++-3.2.3-42
所需要文件最初的源目錄 /root/zoo-src

第一步

在自行規定的目錄下創建路徑/bin和/lib:

% prefix=/opt/compat-env/zoo
% mkdir -p $prefix/bin $prefix/lib

第二步
將所需要的文件拷貝到相應的位置:

% srcdir=/root/zoo-src
% cd $prefix/bin
% cp -p $srcdir/zoo .
% cd $prefix/lib
% rpm2cpio $srcdir/glibc-2.3.2-95.27*.rpm | cpio -idvm ‘*libc*.so*’
% find . -name ‘*libc*.so*’ -exec mv -v ‘{}’ . \;
% rpm2cpio $srcdir/glibc-2.3.2-95.27*.rpm | cpio -idvm ‘*ld*.so*’
% find . -name ‘*ld*.so*’ -exec mv -v ‘{}’ . \;
% rpm2cpio $srcdir/libgcc-3.2.3-42*.rpm | cpio -idvm ‘*libgcc_so*.so*’
% find . -name ‘*libgcc_so*.so*’ -exec mv -v ‘{}’ . \;
% rpm2cpio $srcdir/libstdc++-3.2.3-42*.rpm | cpio -idvm ‘*libstdc*.so*’
% find . -name ‘*libstdc*.so*’ -exec mv -v ‘{}’ . \;
% rm -rf lib usr

第三步
創建一個腳本,用于建立合適的環境變量和啟動程序:

% cd $prefix/bin
% mv zoo zoo.exec
% cat > zoo libcwait.c zoo
posted on 2008-06-09 05:18 聶文龍 閱讀(727) 評論(0)  編輯 收藏 引用
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一区二区日韩免费看| 亚洲特色特黄| 亚洲精品乱码| 国产精品日产欧美久久久久| 欧美 日韩 国产一区二区在线视频 | 一区二区三区日韩在线观看| 国产亚洲欧美另类中文| 国产精品分类| 久久先锋资源| 亚洲精品一区久久久久久| 欧美.www| 欧美激情一区二区三区在线| 欧美性视频网站| 欧美黄色片免费观看| 久久九九免费视频| 久久久久中文| 玖玖在线精品| 免费中文日韩| 亚洲观看高清完整版在线观看| 久久久99国产精品免费| 亚洲调教视频在线观看| 在线观看日韩av电影| 亚洲电影av| 亚洲美女av黄| 国产精品久久久久秋霞鲁丝| 欧美日本二区| 国产精品分类| 国产日韩欧美视频在线| 国语自产精品视频在线看一大j8| 国内久久婷婷综合| 亚洲电影天堂av| 亚洲最新色图| 欧美在线精品免播放器视频| 久久久久9999亚洲精品| 久久这里有精品15一区二区三区| 免费在线欧美黄色| 99精品免费| 亚洲欧洲av一区二区| 久久九九精品| 欧美日韩视频在线一区二区| 国产乱码精品一区二区三区五月婷| 国产在线观看一区| 亚洲精品在线电影| 欧美综合激情网| 亚洲第一福利在线观看| 亚洲一区二区三区乱码aⅴ| 久久精品国产精品 | 亚洲丝袜av一区| 久久国产精品久久久久久| 欧美大尺度在线| 一区二区冒白浆视频| 亚洲国产精品第一区二区| 一区二区三区欧美成人| 久久久久88色偷偷免费| 国产精品v欧美精品v日韩| 亚洲黄色性网站| 欧美亚洲视频| 亚洲精品中文字幕在线观看| 一区二区久久久久| 午夜宅男久久久| 欧美日韩国产一中文字不卡| 精品69视频一区二区三区| 亚洲影院色无极综合| 欧美激情综合色| 久久成人免费视频| 国产精品青草综合久久久久99| 亚洲精选在线| 亚洲精品欧美极品| 久久天堂精品| 国产模特精品视频久久久久| 日韩午夜中文字幕| 亚洲国产精品久久精品怡红院| 亚洲欧美日本国产有色| 欧美日韩在线精品| 最新国产の精品合集bt伙计| 在线日韩一区二区| 久久久精品免费视频| 亚洲女人天堂av| 国产精品乱码久久久久久| 日韩亚洲精品在线| 亚洲日韩成人| 欧美精品三级日韩久久| 亚洲人成在线观看一区二区| 亚洲一级在线| 亚洲精品视频一区二区三区| 免费观看亚洲视频大全| 一区二区三区在线观看视频| 久久精品一区二区三区不卡| 午夜电影亚洲| 黄色成人在线| 亚洲尤物精选| 亚洲一区999| 国产精品视频成人| 欧美中在线观看| 欧美影视一区| 亚洲成人直播| 亚洲破处大片| 欧美午夜精品一区| 欧美自拍丝袜亚洲| 模特精品在线| 亚洲视频在线免费观看| 亚洲一区二区成人在线观看| 国产一区二区三区四区在线观看| 久久经典综合| 狂野欧美性猛交xxxx巴西| 亚洲三级性片| 在线视频精品| 国产精品久久久久久模特| 亚洲午夜精品在线| 久久国产精品电影| 一区二区三区**美女毛片| 亚洲在线视频网站| 亚洲国产精品一区二区www| 亚洲福利视频一区| 国产精品日韩一区二区| 欧美本精品男人aⅴ天堂| 欧美日韩dvd在线观看| 一二三四社区欧美黄| 欧美在线免费观看| 国产一区二区三区在线观看网站| 玖玖国产精品视频| 久久一区亚洲| 亚洲一本大道在线| 久久不射中文字幕| 亚洲视频碰碰| 久久午夜电影网| 欧美一级网站| 久久久国产亚洲精品| 亚洲一级免费视频| 久久久久久久一区| 亚洲网站在线观看| 老司机亚洲精品| 亚洲一区国产| 午夜精品久久久久久久男人的天堂| 国产精品国产三级国产aⅴ无密码| 久久躁狠狠躁夜夜爽| 欧美三区视频| 亚洲国产精品视频一区| 国内精品久久国产| 亚洲天堂av综合网| 一本久久精品一区二区| 欧美剧在线观看| 日韩视频永久免费观看| 正在播放欧美视频| 欧美性一二三区| 亚洲免费综合| 久久精品亚洲一区二区| 狠狠爱www人成狠狠爱综合网| 久久九九精品| 亚洲国产成人av在线| 夜夜精品视频一区二区| 欧美视频精品在线观看| 亚洲综合社区| 麻豆久久精品| 99成人免费视频| 国产精品久久久久久久久搜平片 | 韩国女主播一区| 久久视频这里只有精品| 亚洲国产日韩综合一区| 亚洲性av在线| 韩国亚洲精品| 欧美成人精品三级在线观看| 99视频日韩| 久久久久99精品国产片| 亚洲毛片在线| 国产日韩亚洲| 欧美二区在线| 亚洲影院高清在线| 欧美成人a∨高清免费观看| 一本色道久久综合狠狠躁篇的优点 | 亚洲精品久久久久久下一站| 宅男噜噜噜66一区二区| 国产一区二区无遮挡| 欧美高清视频一区二区| 亚洲综合好骚| 欧美freesex交免费视频| 亚洲色图在线视频| 在线观看的日韩av| 国产精品久久一区二区三区| 欧美一区二区三区四区在线观看地址 | 亚洲精品乱码久久久久久| 欧美午夜国产| 久久久噜噜噜久久中文字免| 日韩一级裸体免费视频| 欧美**人妖| 久久久精品动漫| 国产精品99久久久久久久久久久久| 国语自产精品视频在线看8查询8 | 欧美日韩精品免费观看视频完整| 久久精品国产精品亚洲精品| 欧美高清在线一区| 亚洲欧美一区二区原创| 亚洲人成绝费网站色www| 国产精品视频自拍| 欧美日韩在线三区| 欧美1区视频| 久久久精彩视频| 香港久久久电影| 一区二区三区高清视频在线观看| 欧美电影在线观看完整版|