llseek 和 e2fsck 發生了什麼?
當使用者抱怨 e2fsck(8) 編譯錯誤導致數據失去時,glibc 2.1.3 添加了連結時警告
> > “該
llseek
功能可能很危險;請改用 `lseek64。” > > >如果需要無警告編譯,這會使此功能無法使用。
從 glibc 2.28 開始,這個函式符號不再可用於新連結的應用程序。
這背後有什麼故事?
問題是 glibc 包含一個
llseek
符號,在其標頭檔中沒有相應的聲明。e2fsck
的配置腳本檢測到該符號,並假設這意味著該功能可用。但是,隱式函式聲明與函式預期的不匹配,函式呼叫最終被錯誤編譯。特別是,llseek
需要 64 位偏移量,但隱式聲明會導致int
參數 - 這是導致數據失去的原因,因為e2fsck
在與預期不同的偏移量處進行了更改。
e2fsck
使用的原因llseek
是 glibc 在 Linux 上的前身 libc5 聲明了它並使其可用(它在unistd.h
. 因此e2fsck
,當針對 libc5 建構時,正確使用llseek
;但是當針對 glibc 建構時,建構成功但無法正常工作。這已在 e2fsprogs 1.12 中修復,並帶有以下更改日誌條目:
E2fsprogs 現在可以與 glibc 一起使用(至少與 RedHat 5.0 附帶的版本一起使用)。ext2fs_llseek() 函式現在應該可以使用 i386 ELF 共享庫並且如果 llseek() 不存在。我們還顯式地進行了配置測試,以查看 (a) llseek 是否在 libc 中,以及 (b) llseek 是否在系統標頭檔中聲明。(請參閱關於 libc 開發人員不了解與以前版本的 libc 兼容的概念的標準投訴。)
如果程式碼嘗試使用 C 庫,也會更改為發出警告
llseek
;討論可以在郵件列表檔案中找到。