此错误通常出现在32位二进制可执行程序的执行结果

此问题在BD后通常会有以下几种解释

1、挂载mount问题

2、 FILE_OFFSET_BITS 编译参数问题

3、存储问题

通常来讲,32位二进制可执行文件出现这个错误都是inode问题。

所谓inode就是文件索引,包含文件大小,权限,时间戳等信息。 通常32位的二进制可执行程序在自身或者调用其他文件前需要先进行inode信息查询。

32位应用程序使用的 inode32最多能表达数字是4294967295 ,也就是10位数

而当你使用stat命令来查看文件详情时,如果出现inode值大于这个数。那么恭喜你,你的存储太大了。。

Value too large for defined date type-LMLPHP

解决方法有一下几种

1、修改挂载(几乎可以忽略,除非是外部初始为空的NFS共享)

mount |grep -E /home
/dev/mapper/centos-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

可以看到挂载的为inode64的方式,可以修改为32位的方式。但是似乎这种本地的磁盘无法修改,毕竟里面有文件,系统也要读取的。

2、重新编译或修改源代码

添加参数

#define _FILE_OFFSET_BITS 64

可以将这行定义在/usr/include/feature.h中

或者

将程序的32位寻址参数修改为64位,例如stat修改为stat64

3、更换编辑器

据说gcc4.4.5以上修复了这个问题,可以尝试使用新版本的gcc进行编译(未测试)

06-24 23:18