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

tqsheng

go.....
隨筆 - 366, 文章 - 18, 評論 - 101, 引用 - 0
數據加載中……

linux下so動態庫一些不為人知的秘密2

 上一篇(linuxso動態庫一些不為人知的秘密(上))介紹了linuxso一些依賴問題,本篇將介紹linuxso路徑搜索問題。

我們知道linux鏈接so有兩種途徑:顯示和隱式。所謂顯示就是程序主動調用dlopen打開相關so;這里需要補充的是,如果使用顯示鏈接,上篇文章討論的那些問題都不存在。首先,dlopenso使用ldd是查看不到的。其次,使用dlopen打開的so并不是在進程啟動時候加載映射的,而是當進程運行到調用dlopen代碼地方才加載該so,也就是說,如果每個進程顯示鏈接a.so;但是如果發布該程序時候忘記附帶發布該a.so,程序仍然能夠正常啟動,甚至如果運行邏輯沒有觸發運行到調用dlopen函數代碼地方。該程序還能正常運行,即使沒有a.so.

既然顯示加載這么多優點,那么為什么實際生產中很少碼農使用它呢, 主要原因還是起使用不是很方便,需要開發人員多寫不少代碼。所以不被大多數碼農使用,還有一個重要原因應該是能提前發現錯誤,在部署的時候就能發現缺少哪些so,而不是等到實際上限運行的時候才發現缺東少西。

下面舉個工作中最常碰到的問題,來引申出本篇內容吧。

寫一個最簡單的so tmp.cpp

1. int test()

2. {

3. return 20;

4. }

編譯=>鏈接=》運行, 下面main.cpp 內容請參見上一篇文章。

[stevenrao]$ g++ -fPIC -c tmp.cpp

[stevenrao]$ g++ -shared -o libtmp.so tmp.o

[stevenrao]$ mv libtmp.so /tmp/

[stevenrao]$ g++ -o demo -L/tmp -ltmp main.cpp

[stevenrao]$ ./demo

./demo: error while loading shared libraries: libtmp.so: cannot open shared object file: No such file or directory

[stevenrao]$ ldd demo

linux-vdso.so.1 => (0x00007fff7fdc1000)

libtmp.so => not found

這個錯誤是最常見的錯誤了。運行程序的時候找不到依賴的so。一般人使用方法是修改LD_LIBRARY_PATH這個環境變量

export LD_LIBRARY_PATH=/tmp

[stevenrao]$ ./demo

test

這樣就OK, 不過這樣export 只對當前shell有效,當另開一個shell時候,又要重新設置。可以把export LD_LIBRARY_PATH=/tmp 語句寫到 ~/.bashrc中,這樣就對當前用戶有效了,寫到/etc/bashrc中就對所有用戶有效了。

前面鏈接時候使用 -L/tmp/ -ltmp 是一種設置相對路徑方法,還有一種絕對路徑鏈接方法

[stevenrao]$ g++ -o demo /tmp/libtmp.so main.cpp

[stevenrao]$ ./demo

test

[stevenrao]$ ldd demo

linux-vdso.so.1 => (0x00007fff083ff000)

/tmp/libtmp.so (0x00007f53ed30f000)

絕對路徑雖然申請設置環境變量步驟,但是缺陷也是致命的,這個so必須放在絕對路徑下,不能放到其他地方,這樣給部署帶來很大麻煩。所以應該禁止使用絕對路徑鏈接so

搜索路徑分兩種,一種是鏈接時候的搜索路徑,一種是運行時期的搜索路徑。像前面提到的 -L/tmp/ 是屬于鏈接時期的搜索路徑,即給ld程序提供的編譯鏈接時候尋找動態庫路徑;而 LD_LIBRARY_PATH則既屬于鏈接期搜索路徑,又屬于運行時期的搜索路徑。

這里需要介紹鏈-rpath鏈接選項,它是指定運行時候都使用的搜索路徑。聰明的同學馬上就想到,運行時搜索路徑,那它記錄在哪兒呢。也像. LD_LIBRARY_PATH那樣,每部署一臺機器就需要配一下嗎。呵呵,不需要..,因為它已經被硬編碼到可執行文件內部了。看看下面演示

  1. [stevenrao] $ g++ -o demo -L /tmp/ -ltmp main.cpp
  2. [stevenrao] $ ./demo
  3. ./demo: error while loading shared libraries: libtmp.so: cannot open shared object file: No such file or directory
  4. [stevenrao] $ g++ -o demo -Wl,-rpath /tmp/ -L/tmp/ -ltmp main.cpp
  5. [stevenrao] $ ./demo
  6. test
  7. [stevenrao] $ readelf -d demo
  8. Dynamic section at offset 0xc58 contains 26 entries:
  9. Tag Type Name/Value
  10. 0x0000000000000001 (NEEDED) Shared library: [libtmp.so]
  11. 0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
  12. 0x0000000000000001 (NEEDED) Shared library: [libm.so.6]
  13. 0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1]
  14. 0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
  15. 0x000000000000000f (RPATH) Library rpath: [/tmp/]
  16. 0x000000000000001d (RUNPATH) Library runpath: [/tmp/]
看看是吧,編譯到elf文件內部了,路徑和程序深深的耦合到一起

posted on 2013-01-04 16:58 tqsheng 閱讀(493) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美日韩国产精品| 香港久久久电影| 美女精品网站| 久久精品一区四区| 久久狠狠亚洲综合| 久久久久久香蕉网| 米奇777超碰欧美日韩亚洲| 欧美一区影院| 久久久777| 欧美成人日韩| 国产精品h在线观看| 国产情人节一区| 极品少妇一区二区| 亚洲精品美女在线观看| 亚洲特黄一级片| 久久精品在线视频| 久久精品亚洲| 性久久久久久| 久久精品视频免费观看| 久久美女性网| 欧美成人免费视频| 亚洲精品在线视频观看| aa级大片欧美| 欧美在线视频免费| 女女同性精品视频| 国产精品你懂的在线| 国产日韩精品在线播放| 在线欧美一区| 亚洲欧美日韩电影| 免费欧美在线| 宅男噜噜噜66国产日韩在线观看| 久久国产主播精品| 国产精品国产亚洲精品看不卡15 | 亚洲影院一区| 欧美专区在线播放| 欧美日韩一区二区三区| 有坂深雪在线一区| 欧美一区二区啪啪| 亚洲精品一区二区三区福利| 欧美在线视频免费观看| 国产精品国产精品国产专区不蜜| 亚洲国产日韩欧美| 老司机午夜精品视频| 亚洲一区视频在线| 欧美日韩精品二区第二页| 在线电影院国产精品| 欧美亚洲视频在线看网址| 亚洲国产一区二区三区在线播| 亚洲视频在线一区| 欧美日产在线观看| 亚洲精品久久久一区二区三区| 久久久国产一区二区| 亚洲午夜一区二区三区| 欧美日韩国产在线| 99国内精品| 亚洲第一福利在线观看| 久久久国产亚洲精品| 国模私拍一区二区三区| 欧美一区二区三区免费在线看 | 国产精品swag| 亚洲欧洲综合另类| 欧美激情一区二区三区高清视频 | 欧美一区二区视频在线| 欧美丝袜一区二区| 中日韩午夜理伦电影免费| 亚洲精品一区在线| 欧美美女喷水视频| 久久三级福利| 最新成人av在线| 欧美激情黄色片| 先锋影音国产精品| 欧美午夜大胆人体| 国产精品大片免费观看| 国产精品国产三级欧美二区| 亚洲视频第一页| 亚洲精品在线免费| 欧美日韩一区二区免费视频| 一区二区日韩伦理片| 在线视频精品| 国产一区激情| 亚洲福利专区| 国产精品v欧美精品v日韩精品| 午夜日韩av| 久久夜色精品国产| 一区二区三区四区五区精品| 亚洲在线视频一区| 精品成人国产| 亚洲国产精品黑人久久久| 欧美日韩欧美一区二区| 久久久综合香蕉尹人综合网| 亚洲国产日韩美| 亚洲国产综合在线看不卡| 久久久久久一区二区三区| 欧美在线观看日本一区| 亚洲国产mv| 夜色激情一区二区| 国内综合精品午夜久久资源| 亚洲福利av| 国产精品丝袜xxxxxxx| 美国成人直播| 欧美日韩午夜在线| 久久这里有精品15一区二区三区| 老司机精品视频网站| 亚洲一区二区欧美日韩| 久久精品99国产精品日本| 亚洲精品一区二区三区福利| 亚洲视频一二三| 亚洲东热激情| 西瓜成人精品人成网站| 一区二区三区 在线观看视频| 欧美一区日韩一区| 中文国产亚洲喷潮| 久久一区视频| 亚洲一区欧美| 欧美xxx成人| 久久久免费av| 国产精品三级视频| 99re8这里有精品热视频免费| 在线电影国产精品| 久久国产免费| 久久国产精品久久久久久| 欧美三级在线视频| 亚洲第一区在线| 国内外成人在线| 午夜欧美大尺度福利影院在线看| 亚洲精品一区在线| 久久夜色撩人精品| 99国产精品99久久久久久粉嫩| 亚洲欧美日韩国产精品| 欧美在线影院| 性色av一区二区三区红粉影视| 一本久道久久综合婷婷鲸鱼| 亚洲人成网站777色婷婷| 狠狠干成人综合网| 国产综合久久久久久鬼色| 伊人成人在线| 亚洲免费影院| 久久九九精品| 亚洲日本理论电影| 一区二区三区日韩在线观看| 亚洲直播在线一区| 欧美二区在线播放| 国产精品xxxav免费视频| 精品成人免费| 亚洲一区二区在线看| 久久―日本道色综合久久| 亚洲精品网站在线播放gif| 亚洲一区二区不卡免费| 久久天天综合| 国产精品欧美一区喷水 | 亚洲女人天堂av| 欧美好吊妞视频| 国产伦精品一区二区三区免费| 亚洲黄色在线| 麻豆成人在线播放| 午夜天堂精品久久久久 | 久久亚洲高清| 一本色道久久加勒比88综合| 欧美激情一区二区三区成人| 欧美成人综合| 久久成人精品视频| 国产精品乱看| 亚洲一级在线| 亚洲在线免费观看| 国产日韩欧美三区| 欧美成人嫩草网站| 亚洲精品久久久久久久久久久久| 快射av在线播放一区| 欧美一区二区三区另类| 国产精品社区| 久久尤物电影视频在线观看| 久久久精品国产免大香伊 | 欧美在线高清| 国产女主播一区| 久久久精品午夜少妇| 久久人人爽人人爽爽久久| 日韩视频三区| 亚洲一级黄色片| 18成人免费观看视频| 亚洲精品看片| 狠狠色综合色综合网络| 日韩视频免费在线观看| 国产欧美一二三区| 亚洲第一二三四五区| 国产精品欧美一区二区三区奶水| 久久男女视频| 欧美一级视频| 亚洲国产精品成人| 亚洲天堂av在线免费观看| 精品51国产黑色丝袜高跟鞋| 亚洲美女少妇无套啪啪呻吟| 国外精品视频| 欧美一区二区性| 亚洲欧美视频在线观看视频| 美女网站久久| 亚洲大片精品永久免费| 亚洲高清免费在线| 欧美激情免费在线| 亚洲国产精品成人久久综合一区| 136国产福利精品导航网址应用|