[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 編程技術 > C/C++ > 正文
Unix編程/應用問答中文版 ---16.庫相關問題
本文出自:http://www.nsfocus.com 維護:小四 (2002-11-05 06:02:01)
16.   庫相關問題 
16.1  在Solaris 7下編寫網絡程序需要鏈接哪些庫 
16.2   
16.3  鏈接過程中庫的順序 
16.4   
16.5   
16.6  /usr/lib/ld.so.1損壞或丟失 
16.7   
16.8   
16.9  Solaris 8下如何配置運行時鏈接環境 
-------------------------------------------------------------------------- 

16. 庫相關問題 

16.1 在Solaris 7下編寫網絡程序需要鏈接哪些庫 

Q: inet_pton()是什庫裡的,為什man手冊裡無對應內容 

A: scz <scz@nsfocus.com> 

這個函數比較新,還有另外幾個,比如inet_ntop()。關它們的詳細介紹參看 
<<Unix Network Programming>> 3.7 小節。文件/usr/include/arpa/inet.h中定義 
有: 

extern int inet_pton ( int, const char *, void * ); 

用/usr/ccs/bin/nm工具觀察三個動態鏈接庫libresolv.so、libsocket.so、 
libnsl.so提供的全局函數 

顯然,如果涉及RPC編程,必然需要libnsl.so,而inet_pton()來自libresolv.so。 
總結一下,實在不能確定的時候,編譯時指定鏈接開關如下: 

-lsocket -lnsl -lresolv 

16.2 SUID設置和LD_LIBRARY_PATH環境變量 

Q: RedHat Linux 6.1/6.2,C編程,還有一些腳本 

   execl()以及其他exec...()執行一個SUID程序的時候,出安全考慮,會清除 
   LD_LIBRARY_PATH環境變量,僅僅依靠系統全局設置搜索共享庫。參看如下URL 

   http://spdoc.pdc.kth.se/doc_link/C/a_doc_lib/libs/basetrf1/exec.htm 

   現在有一個程序,需要一個正確的LD_LIBRARY_PATH環境變量設置才能運行,可是 
   由某些原因必須做SUID設置,結果最終運行失敗。我嘗試在程序中putenv()、 
   setenv(),失敗,顯然LD_LIBRARY_PATH環境變量需要在程序加載過程中由動態鏈 
   接器使用,程序中的putenv()、setenv()為時已晚。 

   是我寫了一個腳本,在腳本中設置LD_LIBRARY_PATH環境變量,調用C程序,對 
   腳本做SUID設置。但是腳本的SUID設置並沒有傳遞給子進程(這裡就是那個C程序) 

A: Paul Sack <paul-sackun@jefe.eyep.net> 

到www.google.com用"suid shell scripts race conditions"進行搜索,查看 
BugTraq相關討論。安全的解決辦法是用C寫一個SUID WRAPPER去exec...()你的C程序, 
在SUID WRAPPER中設置LD_LIBRARY_PATH環境變量。 

A: Andrew Gierth <andrew@erlenstar.demon.co.uk> 

如果一個程序是SUID過的,將導致LD_LIBRARY_PATH環境變量被忽略,但是這不是問 
題本質所在,本質原因在ruid不等euid(或者rgid不等egid)。所以wrapper中 
僅僅重置環境變量是不夠的,必須想辦法修改ruid等euid。最好還是重新編譯程序, 
使之不依賴LD_LIBRARY_PATH環境變量。 

16.3 鏈接過程中庫的順序 

Q: 有幾個庫文件A.a、B.a、common.a,前兩者用到了定義在者中的例程,如果把 
   common.a放在前面,鏈接器報告存在無法解析的符號名,放在最則無問題。 

A: Floyd Davidson <floyd@ptialaska.net> 

   鏈接器按照命令行上指定順序搜索庫文件和目標文件(.a .o),二者之間的區別在 
   .o文件被全部鏈接進來,而只從庫文件中析取所需模塊,僅當某個模塊可以解 
   析當前尚未成功解析的符號時,該模塊被析取鏈接進來。如果庫文件無法解析 
   任何當前尚未成功解析的符號,不從中析取也不發生鏈接。 

   Unix編程新手的常見問題是數學函數並不在標準C庫中,而是在libm.a中 

   cc -lm foo.c 

   這裡foo.c用到了數學庫中的符號,但是鏈接器無法正確解析。當搜索到libm.a時, 
   來自foo.c的數學函數符號尚未出現,因此不需要析取libm.a的任何模塊。接下來 
   foo.o鏈接進來,增加了一批尚未成功解析的符號,但已經沒有libm.a可供使用了, 
   因此數學庫必須在foo.o之被搜索到。 

   cc foo.c -lm 

   在你的問題中,如果common.a首先被搜索到,因為不匹配尚未成功解析的符號, 
   而被丟棄。結果A.a和B.a真正鏈接進來的時候,已經沒有庫可以解析符號了。 

16.6 /usr/lib/ld.so.1損壞或丟失 

Q: 意外地覆蓋了ld.so.1,幸運的是有一個原始備份,可我沒有一個靜態鏈接版本的 
   命令去恢復它。 

Q: 我在Solaris 2.6中做了"mv /usr/lib /usr/lib1",本意是想使用自己的庫,但 
   是現在所有程序都報告"找不到/usr/lib/ld.so.1",怎辦 

A: scz <scz@nsfocus.com> 

不要重啟動,立即用/usr/sbin/static/mv、/usr/sbin/static/cp命令恢復 

# ls /usr/sbin/static 
cp*   ln*   mv*   rcp*  tar* 


Q: 那如果此時/usr被改名了,怎辦? 

A: faint,誰這變態。假設/usr改名成了/faint, 

1) /faint/sbin/static/cp /faint/sbin/static/mv /tmp/mv 
2) /tmp/mv /faint /usr 

我不確定 

1) /faint/sbin/static/mv /faint /usr 

能否成功,你可以自己測試一下效果。或者 

ok boot cdrom -s (放入啟動安裝光盤) 
mount /dev/dsk/c0t0d0s0 /mnt (這裡指定原根區對應的原始設備名) 
mv /mnt/faint /mnt/usr 

D: cirrus@SMTH 

建議把/usr/sbin/static下的東西拷一份到/sbin下或者其它比較可信的跟/在同一個 
fs的目錄下。裝機器的時候,不管什OS,/usr都是單獨一個fs的。 

16.9 Solaris 8下如何配置運行時鏈接環境 

Q: 在Linux下我知道用ldconfig(8)配置運行時鏈接環境,但是在Solaris 8下呢 

A: <cypher@punk.net> 

你總是可以利用 LD_LIBRARY_PATH 環境變量,對Solaris 8,還可以參看crle(1) 
手冊頁。 

A: Logan Shaw <logan@cs.utexas.edu> 

如果在鏈接時使用了"-R"和"-L"選項,則相關動態庫的路徑將保存在ELF文件中, 
是以的運行中不再需要設置環境變量去定位動態庫。比如,有一個 
/usr/local/lib/libfoo.so,而你的bar程序需要這個libfoo.so,編譯、鏈接時最好 
這樣 

gcc -Wall -pipe -O3 -o bar -R/usr/local/lib -L/usr/local/lib bar.c -lfoo 
(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
Unix編程/應用問答中文版 ---14.一些小工具的使用 15.32-bit/64-bit相關問題 (2002-11-04 06:02:00)
Unix編程/應用問答中文版 ---12.日志相關問題 13.進程相關問題 (2002-11-01 06:02:00)
Unix編程/應用問答中文版 ---11. package相關問題 (2002-10-31 06:02:00)
Unix編程/應用問答中文版 ---10.網卡相關問題 (2002-10-30 06:02:01)
Unix編程/應用問答中文版 ---9.圖形界面相關問題 (2002-10-29 06:02:00)
Unix編程/應用問答中文版 ---8.Solaris內核編程相關問題 (2002-10-28 06:02:00)
Unix編程/應用問答中文版 ---7.DNS相關問題 (2002-10-25 06:02:00)
Unix編程/應用問答中文版 ---6./etc/system可調資源限制 (2002-10-24 06:02:00)
Unix編程/應用問答中文版 ---5.塊設備相關問題 (2002-10-23 06:02:00)
Unix編程/應用問答中文版 ---4.系統資源相關問題 (2002-10-22 06:02:00)

===更多相關===
 

★  樊強制作 歡迎分享  ★