
Ich versuche mich gerade an der Erstellung einer sehr minimalen, benutzerdefinierten Busybox/Linux-Distribution, eine Aufgabe, die zugegebenermaßen über meinen Horizont geht, aber ich dachte, ich würde es versuchen. Mein Problem ist, dass Ash jedes Mal, wenn ich versuche, ein C-Programm auszuführen, das nicht Busybox oder ein Busybox-Dienstprogramm ist, sich beschwert und mir mitteilt, dass die Datei nicht gefunden wurde. Ich habe die Partition von meinem Arch-System gemountet, GNU Binutils und uClibc installiert; nichts zu machen. Ich habe auch das einfachste C-Programm geschrieben, das mir eingefallen ist, ohne Abhängigkeiten von irgendwelchen Bibliotheken:
int main(int argc, char *argv[])
{
return 0;
}
Ich habe es kompiliert, auf Arch ausgeführt und trotzdem die Meldung „Datei nicht gefunden“ auf meinem Busybox-System erhalten, obwohl es angezeigt wird, wenn ich ls ausführe. Um das Offensichtliche anzusprechen: Ja, ich habe es aus demselben Verzeichnis wie das Programm ausgeführt und ./
vor dem Dateinamen eingegeben.
Antwort1
Ich vermute, dass Sie nicht über den richtigen dynamischen Linker auf dem Busybox-System verfügen.
Führen Sie auf Ihrem Arch-System Folgendes aus: ldd ./simplestprogram
Ich stelle mir vor, ldd
dass die Ausgabe ungefähr so aussehen wird:
linux-vdso.so.1 => (0x00007fff9b34f000)
libc.so.6 => /lib64/libc.so.6 (0x0000003b19e00000
/lib64/ld-linux-x86-64.so.2 (0x0000003b19a00000)
Die letzte Zeile /lib64/ld-linux-x86-64.so.2
ist der dynamische Linker. Ich wette, der ist auf Ihrem Busybox-System nicht vorhanden.
Ich habe auf meinem Arch-Laptop ein „Hallo Welt“-Programm kompiliert, vim
im Binärmodus zu gewechselt /lib64/ld-linux-x86-64.so.2
, /lib65/ld-linux-x86-64.so.2
es gespeichert und versucht, es auszuführen. Ich habe dieselbe „Datei nicht gefunden“-Meldung erhalten wie Sie.
Möglicherweise haben Sie die libc.so
Datei nicht einmal auf Ihrem Busybox-System. Es ist möglich, dass das bloße Kopieren der libc.so
dynamischen Linkerdateien von Arch auf Busybox-Systeme (unter Beibehaltung der Verzeichnisse!) funktioniert, aber möglicherweise auch nicht. Ich bin mir einfach nicht sicher.
Eines können Sie versuchen: Installieren Sie es musl
auf Ihrem Arch-Rechner. Kompilieren Sie Ihr einfaches Programm mit musl-gcc -static -o simple simple.c
, verschieben Sie die ausführbare Datei, die nichts dynamisch verknüpft hat, und probieren Sie es auf dem Busybox-System aus.
Antwort2
Sie müssen eine uClibc-Toolchain erstellen oder installieren und Ihre Programme damit kompilieren/verknüpfen. Sie kompilieren sie nicht mit dem Standard-gcc/make/...