Linux

llseek 和 e2fsck 發生了什麼?

  • September 18, 2022

lseek 手冊頁:

當使用者抱怨 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討論可以在郵件列表檔案中找到

引用自:https://unix.stackexchange.com/questions/717632