为什么 Ubuntu 12.04 64 位将符号链接识别为二进制文件?

为什么 Ubuntu 12.04 64 位将符号链接识别为二进制文件?

我有两个文件。一个文件有名称gcc并且是 shell 文件。另一个文件有名称g++并且包含如下数据:

!<symlink>ÿþg c c

我可以运行 shell 文件 gcc,但文件 g++ 无法运行。当我尝试时,我看到此错误:

bash: ./g++: cannot execute binary file

有人能解释为什么我会看到这个错误吗?

ls -l该文件的输出:

-rwxrwxrwx 1 root root 20 May 18 11:43 g++

答案1

ls -l当您在目录中执行时(在您的视频中),您会发现这g++不是符号链接。 以下是我的系统中的符号链接:

lrwxrwxrwx   1 root root    10 May 28 20:20 modules.conf -> ../modules

注意开头的字符串:lrwxrwxrwx- 所有符号链接都有这个。

您还可以判断您的文件g++不是符号链接,因为当您打开它时,您不会看到它指向的文件的内容,而是看到其他一些数据。

如果文件不可读,例如它没有已知的文件头或神奇数字 file name-of-file将返回data,程序可能会判定它是“二进制文件”。输入man file以了解更多信息。

要解决这部分问题,只需通过创建符号链接来替换损坏的文件,例如:

要创建指向目录中gcc命名的文件的符号链接,请执行以下操作:g++

ln -s gcc g++

然后ls -l检查一下。你应该看到类似这样的内容:

lrwxrwxrwx  1 zanna zanna    3 May 31 08:38 g++ -> gcc
-rwxrwxr-x  1 zanna zanna    0 May 31 08:38 gcc

但是您的 envsetup 脚本是否会运行是……另一个问题。

这怎么发生的?

确实超出了问题的范围,但需要进一步调查:

您提到,尝试构建环境会抛出stray \376 and \377。这是 的八进制表示法\255\254它是字节顺序标记显示文件使用 UTF-16 编码。UTF-16(小端)编码也由ÿþ您在非符号链接中看到的字符表示。如果这些代码位出现在文件开头以外的任何地方,则将被报告为“杂散”。Windows(NTFS)和其他文件系统使用 UTF-16 LE 编码作为文件名(以及存储其符号链接版本的 Unicode 字符串),因此发生这种情况可能是因为路径名的一部分位于这样的文件系统中。再次通过创建新的符号链接进行修复。

你不能将普通文件变成符号链接因为一般来说,符号链接是存储在文件系统的 inode 表中的元数据。

然而,由于符号链接实现将路径数据存储在文件内部,如果没有足够的 inode 可用于存储符号链接路径,则可以使用此方法作为后备,这可能是因为分区中没有足够的 inode(请查看df -i .

相关内容