无法从内部列出目录,只能从外部列出目录

无法从内部列出目录,只能从外部列出目录

我有一个包含三个子文件夹的目录,其中我构建了一个跨 gcc。所以有目录binutilsgccglibc只是构建目录,相应的源位于不同的目录中。一切都很顺利,我编译了所有内容并将其安装到某个自定义路径。

当我现在尝试进入(我的构建树的)子目录时,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.solibc.so.backup上面的某个目录,然后进入该目录,它就可以工作了!

看来链接器在这个目录中找到了这个libc.so并简单地使用它?但为什么 echo 有效而 ls 不行呢?find也有错误的行为。我怎样才能避免这种行为?

更新 echo之所以有效,是因为它是一个 shell 内置函数,lsfind是链接到 的二进制文件libc.so,这就是不同行为的原因。

我仍然不知道为什么会发生这种情况以及如何避免它,我真的不想要这种“窗口式”行为。

答案1

也许你的ls命令不是/bin/ls?尝试使用命令检查是否ls确实/bin/ls在每个目录中:

which ls

ls我假设这些目录中有一个名为的可执行文件,并且您的$PATH环境变量执行该命令而不是/bin/ls.

相关内容