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)
|
===更多相關=== |
|
|
 |
★ 樊強制作 歡迎分享 ★ |