- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道类似的问题在这里被问了十亿次,但与我让我的系统正常工作的问题不同。当我破坏它时,我只是收到了错误的错误消息(我想使用这些调试另一个问题,所以它们的工作至关重要)。
从工作系统开始:
$ tree
.
├── bin
│ └── bash
├── lib
│ ├── libc.so.6
│ ├── libdl.so.2
│ └── libtinfo.so.6
└── lib64
└── ld-linux-x86-64.so.2
$ sudo chroot . /bin/bash
bash-5.0#
正如我们所期望的那样,运行 bash 的一切都在那里并且 bash 运行。
现在,当我删除 lib
文件夹中的任何内容时,我收到一条错误消息,提示我缺少该库:
$ rm -f lib/libdl.so.2
$ sudo chroot . /bin/bash
/bin/bash: error while loading shared libraries: libdl.so.2: cannot open shared object file: No such file or directory
也符合预期。但是,当我删除 lib64
文件夹中的 ld-linux-x86-64.so.2
时:
$ rm -f lib64/ld-linux-x86-64.so.2
$ sudo chroot . /bin/bash
chroot: failed to run command ‘/bin/bash’: No such file or directory
它告诉我 /bin/bash
丢失了。该消息与我实际删除它时的消息相同。
$ rm -f bin/bash
$ sudo chroot . /bin/bash
chroot: failed to run command ‘/bin/bash’: No such file or directory
所以出于某种原因,它认为 bash 丢失了,而实际上,我认为是动态链接器丢失了。我认为这是因为它首先使用此链接器加载小 Sprite ,但这并不能使消息更正确。
我什至通过在 qemu
中运行 bash
来检查 ld-linux-x86-64.so.2
> 在不同的系统上我得到正确的错误信息:
<some arm system>$ qemu-x86_64 -L /tmp/nowhere bin/bash
/lib64/ld-linux-x86-64.so.2: No such file or directory
这是一个错误吗?是否有一些选项可以告诉 chroot
不要这样做并打印实际丢失的文件?这个文件有什么魔力吗?这是怎么回事?
TLDR:为什么 chroot
告诉我可执行文件丢失,而实际上 lib64/ld-linux-x86-64.so.2
是吗?
最佳答案
Why does
chroot
tell me the executable is missing when actuallylib64/ld-linux-x86-64.so.2
is?
假设您正在使用来自 GNU coreutils 的 chroot
程序,我们可以查看代码以了解发生了什么(希望“魔法”会消失)。这里是github mirror of chroot.c .
如果我们在错误消息 failed to run command
中搜索字符串,我们会立即找到打印它的(唯一)代码行:
/* Execute the given command. */
execvp (argv[0], argv);
int exit_status = errno == ENOENT ? EXIT_ENOENT : EXIT_CANNOT_INVOKE;
error (0, errno, _("failed to run command %s"), quote (argv[0]));
return exit_status;
}
如您所见,它是在 execvp()
系统调用之后打印的。 execvp()
是(的一种变体)允许执行程序的系统调用(在您的情况下为 /bin/bash
)。 execvp()
如果程序执行成功,不返回,因为:
The
exec()
family of functions replaces the current process image with a new process image.
它仅在出错的情况下返回并适本地设置errno
。
代码然后检查 errno
来决定退出状态:
int exit_status = errno == ENOENT ? EXIT_ENOENT : EXIT_CANNOT_INVOKE;
最后打印错误:
error (0, errno, _("failed to run command %s"), quote (argv[0]));
如您所见,argv[0]
总是在运行命令失败
后打印(/bin/bash
在你的例子中,即它试图在 chroot 环境中执行
的程序。
errno
是由 execvp()
“返回”的错误编号,并确定在(error()
定义如下)之后打印的内容在我的系统上):
/* Print a message with `fprintf (stderr, FORMAT, ...)';
if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM).
If STATUS is nonzero, terminate the program with `exit (STATUS)'. */
extern void error (int __status, int __errnum, const char *__format, ...)
No such file or directory
是错误编号 ENOENT
并且在以下情况下由 execvp()
和 friend “返回”:
ENOENT The file pathname or a script or ELF interpreter does not exist.
(“ELF 解释器”是动态链接器的同义词 I guess )
chroot
实际上无法知道真正出了什么问题,它只能报告 execvp()
放入 errno< 中的内容
我认为这就是错误含糊不清且有点误导的原因。
关于linux - chroot "no such file or directory"打印错误的丢失文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70056765/
有没有更好的方法用 PHP 将数据输出到 html 页面? 如果我想在 php 中用一些 var 制作一个 div,我会写类似的东西 print (''.$var.''); 或 echo "''.$v
我可以使用 java awt print 来打印文档/文件而不是使用 javax print 吗?我发现在 java awt print 中有一个选项可以使用 AttributedString 将内容
目前我通过以下方式运行 R 脚本: R --slave argument1 argument2 ... 我想知道 R 中关于如何退出脚本并发出警告的最佳实践,q() 会这样做吗? if(!file.
谁能告诉我如何编写一个程序,用 gcc 编译时打印 c ,用 g++ 编译时打印 c++? 最佳答案 #ifdef __cplusplus printf("c++\n"); #else
我需要支持在 KitKat 设备上打印,但我的目标 SDK 是 13(无法更改)。 特别是我需要打印一个 webview。 这是用于打印 webview 的 API: http://developer
我正在尝试创建一个简单的函数,其中 python 将根据您的年份输入计算年龄。我已经尝试了几种方法,但我没有运气 atm。 附:对不起,我是新手。 ame = input(" Enter your n
JavaFX 2.0 是否支持打印?我有一个文本区域,我从中获取文本然后我想打印它,但似乎没有这个功能。 当然,这里我说的是打印到打印机。 :) 最佳答案 尚不支持。作为一种解决方法,您可以使用 Ja
我试图找出printOn的重点。我查看了一些实现它的类,看起来它只是帮助打印不同数据类型的单位。这是准确的吗? 如果是这样,有人能指出我如何为我自己的类(class)实现这一点的正确方向吗?我将在可能
我无法让 IE 打印我的 Canvas (使用 excanvas 生成)...我使用的是最新版本的 excanvas。 http://dl.dropbox.com/u/997831/canvas.ht
我搜索了很多但没有人回答我的问题,我读到在这样的信号处理程序中使用 cout 是不安全的: void ctrlZHandler(int sig_num) { //SIGTSTP-18
我有兴趣打印一系列查询。我有以下代码。 start = datetime.datetime(2012, 2, 2, 6, 35, 6, 764) end = datetime.datetime(201
public class javaClass { public static void main(String [] arg) { String row1 = "A____A"
我需要写入前一行的命令,例如不带\n 的 print()。 下面是一些示例代码: a=0 print("Random string value") if a==0: print_to_prev
我有一个使用 UIKit 和 Objective C 的旧 iOS 应用程序,我目前正在将其移植到 SwiftUI 和 Swift。一切都很顺利,我喜欢 Swift 和 SwiftUI。该应用程序已经
我创建了一个求和函数,它接受一个开始编号和一个结束编号,并返回这两点之间的总和答案 def print_sum_equations(start_number,end_number):
在 Perl 6 中,print 和有什么区别? , put和 say ? 我怎么看 print 5不同,但 put 5和 say 5看起来一样。 最佳答案 put $a就像 print $a.Str
我正在使用 here 中的 getOrgChart 库,我正在尝试打印整个图表,而不仅仅是可见部分。不幸的是,当使用标准库打印功能时,它只会打印出第一部分,而我不知道如何打印整个图表(该图表相当宽,大
我制作了一个非常适合 A4 页面的 View 。现在我想打印它。请注意,我没有使用drawRect或类似的东西,只是一个带有 subview 和文本标签的普通 View 。我的问题是,我对该 View
由于 Cocoa-Java 已弃用,我正在将 Cocoa-Java 代码迁移到 Cocoa + JNI。该代码打印存储在文件中的图像。新的 Cocoa 代码基本上是: NSImage *image =
这个问题已经有答案了: Printing a TDBGrid (4 个回答) 已关闭 6 年前。 如何在不安装或下载组件的情况下打印 DBGrid? 或者 如何将 DBGrid 的数据放入 RichE
我是一名优秀的程序员,十分优秀!