当用户抱怨 e2fsck(8) 编译错误导致数据丢失时,glibc 2.1.3 添加了链接时警告
“该
llseek
功能可能很危险;请改用 `lseek64。”如果需要无警告编译,这会使此功能无法使用。
从 glibc 2.28 开始,这个函数符号不再可用于新链接的应用程序。
这背后有什么故事?
当用户抱怨 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 中修复,并带有以下更改日志条目:
如果代码尝试使用 C 库,也会更改为发出警告
llseek
;讨论可以在邮件列表档案中找到。