0

简介: 我们将 arm 板的交叉编译工具链从 32 位文件系统主机移至文件系统具有 inode > 2^32 的 64 位主机。使用gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf会导致错误

cc1plus: error: MYPATH: Value too large for defined data type

在哪里

$ stat MYPATH
...
Inode 9264879623
...

这个工具链是为 64 位主机编译的,为什么它不能处理 64 位 inode?

Long: 我们在 32 位主机上使用了gcc-linaro-arm-linux-gnueabihf-4.8-2014.04 。最初在迁移到 64 位文件主机后,我们设置enable_ino64=0并继续使用旧工具链。然而,这只对单台机器有影响,最终我们希望工具链能在公司的所有机器上工作。

当所有源文件(顺便说一句)驻留在 inode <= 32 位的文件服务器上时,我们可以使用gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf成功编译代码。

4

1 回答 1

0

不幸的是,我没有找到这个工具链是为 64 位主机编译的答案,那么为什么它不能处理 64 位 inode?.

我发现了一种使某些系统功能位于 inode 的方法,如此所述。

LD_PRELOAD您可以在没有 root 权限的情况下使该版本正常工作。在 32/64 混合环境中工作时,您将看到的错误是,每当 64 位应用程序尝试加载 32 位包装器库时。这将类似于LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored. 虽然它说错误,但它是一个警告,您的应用程序将继续。

如果您具有 root 访问权限,您还可以为 64 位编译一个空的包装器库,并将 32(实际工作的包装器)和 64(什么都不做)版本放在相应的库路径中。

于 2021-12-15T09:54:04.890 回答