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

隨筆 - 298  文章 - 377  trackbacks - 0
<2008年3月>
2425262728291
2345678
9101112131415
16171819202122
23242526272829
303112345

常用鏈接

留言簿(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>
            亚洲一级在线| 亚洲第一二三四五区| 老妇喷水一区二区三区| 99国产一区| 久久久人成影片一区二区三区观看| 亚洲国产欧美精品| 国产日本亚洲高清| 国产精品日韩欧美一区二区| 国产精品一区二区视频| 国产一级揄自揄精品视频| 国产在线欧美日韩| 亚洲第一页自拍| 中国成人在线视频| 久久久精品国产免大香伊 | 国产欧美日韩免费看aⅴ视频| 国产精品香蕉在线观看| 18成人免费观看视频| 亚洲午夜国产成人av电影男同| 久久久噜噜噜久久| 美日韩精品免费观看视频| 久久经典综合| 亚洲精品女人| 国产精品一二三视频| 亚洲少妇诱惑| 久久国产一区| 精久久久久久久久久久| 欧美一级视频精品观看| 欧美在线一级视频| 亚洲二区精品| 欧美在线资源| 亚洲综合国产| 亚洲国产精品小视频| 欧美精品在线观看播放| 国产日本欧洲亚洲| 亚洲一区二区三区色| 亚洲成色777777女色窝| 欧美中文字幕精品| 国产日韩在线视频| 久久av一区二区| 亚洲欧美另类国产| 国产精品丝袜白浆摸在线| 一区二区精品在线| 亚洲另类自拍| 国产精品草草| 久久精品视频免费播放| 欧美怡红院视频| 激情视频一区二区三区| 欧美a级片一区| 欧美jizz19性欧美| 一本一本久久a久久精品综合妖精| 欧美激情第三页| 欧美劲爆第一页| 午夜免费电影一区在线观看| 亚洲欧美日韩综合| 亚洲精品1234| 亚洲一区二区免费| 136国产福利精品导航网址| 欧美寡妇偷汉性猛交| 欧美日韩亚洲一区二区三区在线观看 | 亚洲午夜女主播在线直播| 欧美性大战xxxxx久久久| 久久精品一区四区| 欧美日韩在线播放一区| 久久久精品国产免大香伊 | 欧美一区二区三区在线视频| 精品999日本| 亚洲午夜激情| av72成人在线| 久久蜜桃资源一区二区老牛| 亚洲一区不卡| 男女精品网站| 麻豆精品精华液| 欧美11—12娇小xxxx| 亚洲一区二区三区四区五区黄| av成人免费观看| 欧美在线欧美在线| 亚洲一区二区三区影院| 中文国产成人精品久久一| 国产亚洲精品久久久久婷婷瑜伽| 久久人人爽人人| 亚洲一区二区三| 亚洲国产精品久久久久秋霞不卡| 国产精品久久久一区二区三区 | 欧美激情国产精品| 99视频有精品| 亚洲网站啪啪| 亚洲伦理在线免费看| 欧美一区二区视频在线| 亚洲乱码一区二区| 欧美在线免费一级片| 免费在线观看精品| 欧美韩国在线| 欧美电影电视剧在线观看| 国产精品入口麻豆原神| 亚洲精品在线视频| 99re这里只有精品6| 久久野战av| 久久久久国产成人精品亚洲午夜| 欧美日韩在线一区二区| 亚洲免费在线视频| 国产精品福利在线观看| 亚洲欧美日韩精品综合在线观看| 欧美日韩精品福利| 久久精品国产欧美亚洲人人爽| 亚洲精品国产欧美| 久久精品一区中文字幕| 亚洲经典在线| 免费的成人av| 亚洲高清网站| 午夜视频一区| 在线观看中文字幕亚洲| 性感少妇一区| 久久综合九色九九| 国产在线国偷精品产拍免费yy| 久久精品首页| 欧美日韩亚洲视频一区| 乱人伦精品视频在线观看| 亚洲美女av黄| 亚洲片区在线| 国内成人精品一区| 亚洲网站在线看| 亚洲精品中文字幕有码专区| 销魂美女一区二区三区视频在线| 一级日韩一区在线观看| 美腿丝袜亚洲色图| 久久久精品国产免费观看同学| 欧美日韩一区二区三区视频| 欧美成人在线免费视频| 国产一级一区二区| 亚洲欧美在线网| 午夜精品美女久久久久av福利| 欧美激情在线免费观看| 亚洲国产成人不卡| 亚洲高清在线观看| 久久久久亚洲综合| 麻豆精品在线视频| 先锋亚洲精品| 国产精品一区二区久久精品| 亚洲精品久久久蜜桃| 亚洲国产视频一区| 美女在线一区二区| 欧美国产精品v| 亚洲国产成人精品久久久国产成人一区| 午夜国产精品视频免费体验区| 欧美一级视频免费在线观看| 国产精品视频专区| 欧美一区二区免费观在线| 欧美中文字幕在线| 国产精品综合色区在线观看| 午夜精品久久久久久久99水蜜桃| 香蕉久久精品日日躁夜夜躁| 国产无遮挡一区二区三区毛片日本| 午夜久久久久| 你懂的视频一区二区| 最新精品在线| 欧美日韩国产在线看| 亚洲天堂免费观看| 久久久久久久久岛国免费| 影音先锋另类| 欧美精品久久一区| 正在播放日韩| 久久三级视频| 亚洲精品一区二区三区樱花| 欧美另类变人与禽xxxxx| 99国产精品久久久久久久| 午夜视频精品| 亚洲国产精品福利| 欧美视频在线观看免费网址| 欧美一级日韩一级| 亚洲国产99精品国自产| 亚洲一级黄色片| 激情久久久久久久| 欧美精品观看| 亚洲欧美日韩一区二区| 欧美成人综合一区| 亚洲免费视频一区二区| 狠狠爱成人网| 欧美日韩在线免费观看| 欧美专区中文字幕| 亚洲片在线资源| 久久亚洲精品网站| 亚洲夜间福利| 亚洲国产视频直播| 国产午夜精品在线| 欧美激情在线狂野欧美精品| 亚洲欧美精品伊人久久| 亚洲三级免费电影| 老司机67194精品线观看| 亚洲一级片在线观看| 91久久极品少妇xxxxⅹ软件| 国产精品国产三级国产aⅴ9色| 久久婷婷丁香| 亚洲男女毛片无遮挡| 亚洲精品乱码视频| 欧美96在线丨欧| 久久精品一区二区三区中文字幕| 夜夜嗨av一区二区三区四区| 一区精品在线播放| 国产亚洲精品高潮| 国产精品亚洲人在线观看|