私は非常に小さなカスタムBusybox / Linuxディストリビューションを作成しようとしています。これは明らかに私の能力を超えた作業ですが、試してみるべきだと思いました。私の問題は、BusyboxやBusyboxユーティリティではなくCプログラムを実行しようとするたびにAshが文句を言い、ファイルが見つからないと言うことです。私はArchシステムからパーティションをマウントし、GNU binutilsとuClibcをインストールしました。私はまた、どのライブラリにも依存しない最も単純なCプログラムを書いています。
int main(int argc, char *argv[])
{
return 0;
}
Archでコンパイルして実行しましたが、lsを実行すると表示されますが、Busyboxシステムにはまだ「ファイルが見つかりません」というメッセージが表示されます。明らかな問題を解決するために、プログラムと同じディレクトリで実行し、./
ファイル名の前に入力しました。
答え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システムにこのファイルがない可能性があります。 ArchからBusyboxシステムにダイナミックリンカーファイルをコピーすることlibc.so
(ディレクトリを維持します!)が機能するかもしれませんが、うまくいかないかもしれません。よくわかりません。
試してみる1つのこと:musl
Archシステムにインストールしてください。簡単なプログラムコンパイルを使用して実行可能musl-gcc -static -o simple simple.c
ファイル(動的にリンクされた項目なし)を移動し、Busyboxシステムで使用してみてください。
答え2
uClibcツールチェーンをビルドまたはインストールし、それを使用してプログラムをコンパイル/リンクする必要があります。標準 gcc/make/... を使用してコンパイルできません。