aarch64平台stat函数返回st_size异常(恒为4096)求助
aarch64平台下stat/fstat获取文件大小始终返回4096的问题排查
问题现象
在aarch64架构机器上,调用stat或fstat函数获取文件大小时,st_size字段始终返回4096,但实际文件大小仅为2字节:
- 测试代码:
#include <iostream> #include <sys/stat.h> using namespace std; int main() { struct stat st; cout << "stat call "<< stat("a.txt", &st)<< endl; cout << "./a.txt File size " << st.st_size << endl; FILE *fp = fopen("a.txt", "rb"); struct stat finfo; if (fstat(fileno(fp), &finfo)) cout << "fail"<< endl; cout << "./a.txt File ftst size " << finfo.st_size << endl; return 0; }
- 程序输出:
stat call 0 ./a.txt File size 4096 ./a.txt File ftst size 4096
- 系统工具显示文件实际大小:
root@sv3aggr005:/home/akumar/extract# ll a.txt -rw-r--r-- 1 root root 2 Apr 25 09:08 a.txt root@sv3aggr005:/home/akumar/extract# stat a.txt File: a.txt Size: 2 Blocks: 8 IO Block: 4096 regular file Device: fd01h/64769d Inode: 1742602 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
GDB调试确认,调用stat后st_size被设置为4096,与预期的2不符。
可能原因及解决方法
1. 编译模式不匹配(32位vs64位)
aarch64是64位架构,若编译时强制使用32位模式(比如添加-m32参数),会导致struct stat的字段偏移错误,st_size读取到的是IO Block等其他字段的值。
- 解决:检查编译命令,移除
-m32等32位编译选项,确保以64位模式编译:g++ -o stat_test stat_test.cpp
2. 头文件冲突或未正确包含
若代码中自定义了struct stat结构体,或未正确包含系统<sys/stat.h>头文件,会使用错误的结构体定义,进而读取错误字段值。
- 解决:
- 确保代码顶部正确包含
<sys/stat.h>,且无自定义struct stat。 - 编译时添加
-Wall参数,排查头文件相关警告:g++ -Wall -o stat_test stat_test.cpp
- 确保代码顶部正确包含
3. off_t类型输出兼容问题
st_size的类型是off_t,若编译器对off_t的处理与cout输出逻辑不兼容(比如off_t为64位类型,但cout默认按32位输出),可能导致数值显示错误。
- 解决:将
st_size显式转换为64位整数后输出:cout << "./a.txt File size " << static_cast<long long>(st.st_size) << endl;
4. 编译器或系统库bug
旧版本GCC或glibc在aarch64平台上可能存在stat结构体处理bug,导致字段读取错误。
- 解决:
- 更新编译器至最新稳定版本(如GCC 9及以上)。
- 检查并更新系统glibc版本,确保适配aarch64架构。
验证建议
先通过系统stat命令确认文件元数据正常,再逐步排查编译选项、头文件和类型转换问题,前两类原因是此类问题的常见诱因。
内容的提问来源于stack exchange,提问作者user2456835
相关产品推荐
相关产品推荐

