
我正在嘗試創建一個非常小的自訂 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/... 來編譯它們。