Executable
各種 shell 不會執行存在的二進製文件
我下載了同一個程序的幾個預建構二進製文件(nodejs-linux、-x86、-x86_64)。在不同的外殼中,我得到一個類似的錯誤
no such file or directory: node
。是正確的$PATH
並且二進製文件存在並且是可執行的。這是因為我使用的是
musl
基於 linux 的發行版並且二進製文件使用的是 linux 發行版glibc
嗎?我認為在這種情況下程序會崩潰或退出非零。注意:@DepressionDaniel 和@xhienne 在下面給出了正確答案。
如果您的庫與執行檔所需的動態庫不匹配,它甚至不會啟動。要檢查此執行檔連結到的動態庫,請執行以下操作:
ldd /path/to/executable
如果您看到
=> not found
,您就知道缺少什麼。
您的錯誤不是由缺少共享對象引起的,而是由於應用程序沒有使用動態載入器。
如果找不到動態載入程序,
exec()
則返回ENOENT
給 shell,這將轉換為您收到的錯誤消息。如果找到動態載入器,則
exec()
成功,並且動態載入器有機會列印有關失去共享對象的資訊性消息(如果是這種情況)。這可以很容易地嘗試,通過
ls
以不同的方式處理二進製文件:cd /tmp cp $(which ls) . sed -e 's/libc.so.6/BAD!.so.6/' <ls >ls2 sed -e 's/ld-linux/ha-hahah/' <ls >ls3 strace ./ls2 strace ./ls3
所以,我會說你
musl
的基於 Linux 的 Linux 是如此激進,它不僅改變glibc
了其他東西,而且還將動態載入程序放在了非正常的路徑上,或者給了它一個非正常的名稱。