我有一个包含三个子文件夹的目录,其中我构建了一个跨 gcc。所以有目录binutils
,gcc
这glibc
只是构建目录,相应的源位于不同的目录中。一切都很顺利,我编译了所有内容并将其安装到某个自定义路径。
当我现在尝试进入(我的构建树的)子目录时,glibc
我无法列出内容,我收到一些错误消息,该消息本身不可读:
$ ls
ls: �����: ��dJ: Error 1673445588re
如果我再次执行此操作,则会出现另一个错误号:
$ ls
ls: �vP��: ��u: Error 3137748
或者一个具体的文件:
$ ls config.status
ls: : ���s: Error 123785428
如果我列出上面一个层次结构的内容,它会起作用:
$ ls glibc
Makefile catgets ctype gnu
ld.map libc.so.6 libmvec.map
...
如果我成为 root 并进入该目录,我也可以列出它:
# ls
Makefile catgets ctype gnu
ld.map libc.so.6 libmvec.map
...
文件夹本身:
$ ls -lh glibc -d
drwxr-xr-x 63 david david 4.0K 17. Aug 16:30 glibc
正确的所有者,正确的权限。
我已经跑了
# e2fsck -pfc /dev/sdb4
不用找了。
任何日志文件都没有错误,dmesg
没有显示任何错误,文件系统检查也没有报告错误,这到底是什么?
更新
我正在构建跨 gcc 的事实导致我的环境受到这些库或二进制文件的影响。在交叉编译或构建交叉 gcc 期间,我确实调整了构建环境所用的 shell 的路径,并将其指向交叉 gcc 的安装路径。但是gcc没有提供/bin/ls
之类的,我的LD_LIBRARY_PATH
之类也没有设置。该ls
命令来自我的系统:
$ where ls
ls: aliased to ls --color=always
/bin/ls
$ ldd /bin/ls
linux-vdso.so.1 (0x00007ffea1362000)
libc.so.6 => /lib64/libc.so.6 (0x00007fc18b429000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc18b7c2000)
其他一切(似乎)工作正常,我的系统或此 SSD(三星 SSD 840 EVO 500GB,EXT0DB6Q)没有任何其他问题。多次重启后,问题依然存在。
到目前为止我还没有意识到 - 如果我站在这个目录中,每个ls
命令都会失败,我什至无法再列出我的主目录:
$ ls ~
ls: ���e�: �i"�5: Error 18446744071861719252
每次都有不同的输出:
$ ls ~
ls: Pg��: ��{
: Error 2070020308
~/cross-build/inc100/glibc # this is the path to this directory
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/opt/bin:/usr/x86_64-pc-linux-gnu/gcc-
bin/5.4.0:/usr/x86_64-pc-linux-gnu/i686-pc-linux-gnu/gcc-
bin/6.4.0:/home/david/usr/bin
嗯:
~/cross-build/inc100/
$ ls glibc
.... libc.so libc.so.6
如果我将文件移动libc.so
到libc.so.backup
上面的某个目录,然后进入该目录,它就可以工作了!
看来链接器在这个目录中找到了这个libc.so并简单地使用它?但为什么 echo 有效而 ls 不行呢?find
也有错误的行为。我怎样才能避免这种行为?
更新
echo
之所以有效,是因为它是一个 shell 内置函数,ls
等find
是链接到 的二进制文件libc.so
,这就是不同行为的原因。
我仍然不知道为什么会发生这种情况以及如何避免它,我真的不想要这种“窗口式”行为。
答案1
也许你的ls
命令不是/bin/ls
?尝试使用命令检查是否ls
确实/bin/ls
在每个目录中:
which ls
ls
我假设这些目录中有一个名为的可执行文件,并且您的$PATH
环境变量执行该命令而不是/bin/ls
.