我正在尝试创建一个非常小的自定义 Busybox/Linux 发行版,这无疑是一项超出我能力范围的任务,但我想我应该尝试一下。我的问题是,每当我尝试运行不是 Busybox 或 Busybox 实用程序的 C 程序时,ash 都会抱怨并告诉我找不到该文件。我从 Arch 系统安装了分区,安装了 GNU binutils 和 uClibc;没有骰子。我还编写了我能想到的最简单的 C 程序,不依赖于任何库:
int main(int argc, char *argv[])
{
return 0;
}
我编译并在 Arch 上运行,但在我的 Busybox 系统上仍然给出了“文件未找到”的信息,尽管当我运行 ls 时会显示该信息。为了解决显而易见的问题,是的,我从与程序相同的目录运行它并./
在文件名之前键入。
答案1
我的猜测是您在 Busybox 系统上没有正确的动态链接器。
在你的 Arch 系统上执行以下操作: ldd ./simplestprogram
我想ldd
会给你类似这样的输出:
linux-vdso.so.1 => (0x00007fff9b34f000)
libc.so.6 => /lib64/libc.so.6 (0x0000003b19e00000
/lib64/ld-linux-x86-64.so.2 (0x0000003b19a00000)
最后一行/lib64/ld-linux-x86-64.so.2
是动态链接器。我敢打赌,您的 Busybox 系统上不存在该功能。
我在我的 Arch 笔记本电脑上编译了一个“hello, world”程序,vim
以二进制模式使用,将其更改/lib64/ld-linux-x86-64.so.2
为/lib65/ld-linux-x86-64.so.2
,保存它并尝试执行它。我收到了与您相同的“找不到文件”消息。
libc.so
您的 Busybox 系统上甚至可能没有该文件。仅将libc.so
和动态链接器文件从 Arch 复制到 Busybox 系统(保留目录!)可能会起作用,但也可能不起作用。我只是不确定。
要尝试的一件事是:安装musl
在您的 Arch 机器上。使用 编译您的简单程序musl-gcc -static -o simple simple.c
,移动该可执行文件(没有动态链接的任何内容),然后在 Busybox 系统上尝试它。
答案2
您需要构建或安装 uClibc 工具链,并用它来编译/链接您的程序。您不能使用标准 gcc/make/... 来编译它们。