2013-03-18 65 views
1

當我試圖編譯用手魷魚RHEL 5.5的服務器上,運行configure找來鏈接器如何知道與系統調用鏈接的內容?

configure: WARNING: Eep! Cannot find epoll, kqueue, /dev/poll, poll or select! 
configure: WARNING: Will try select and hope for the best. 
configure: Using select for the IO loop. 

貌似內核沒有與CONFIG_EPOLL配置。所以我試圖編譯this example epoll program來檢查它是否有效。

在我的gentoo盒子上(啓用了CONFIG_EPOLL),它的編譯沒有任何問題。

在服務器上,我得到了

/tmp/cc8PhJh0.o: In function 'main': 
epoll-exmaple.c:(.text+0x262): undefined reference to 'epoll_create1' 
collect2: ld returned 1 exit status 

我們都知道C程序編譯器會在* .h文件的定義和鏈接進行鏈接與* .so文件。

我的問題是,epoll_create1是一個系統調用內核。鏈接器搜索的準確位置是哪個文件來定位到系統調用的實現?

謝謝。

回答

2

它看起來在系統C庫(通常;一小撮系統調用是在像librt其他特殊庫)。 C庫爲用戶空間程序提供了一個C API,用於處理爲您的系統調用。有時候,這可能是系統調用的一個非常簡單的包裝,它只負責設置和返回參數,但更常見的是它有各種不需要擔心的粘合劑,例如數據大小之間的差異用戶空間和內核,不同體系結構的實現差異,內核系統調用API變化的向後或向前兼容性等等。

% readelf -s /lib/i386-linux-gnu/libc.so.6 | grep epoll_create1 
    1837: 000d5280 52 FUNC GLOBAL DEFAULT 12 [email protected]@GLIBC_2.9 

如果你看看上面的C庫,你可以看到鏈接器鏈接代碼的C函數。

+0

這就解釋了鏈接器搜索哪個文件。我可以在服務器上grep出'epoll_create1'符號。但是,如果沒有啓用epoll的內核,爲什麼不能鏈接它呢? – AleiPhoenix 2013-03-18 08:24:42

+0

更新:對不起,我錯過了_create1時,greping。所以這是一個與glibc相關的問題。謝謝。 – AleiPhoenix 2013-03-18 08:58:26