Executable

各種 shell 不會執行存在的二進製文件

  • December 10, 2016

我下載了同一個程序的幾個預建構二進製文件(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了其他東西,而且還將動態載入程序放在了非正常的路徑上,或者給了它一個非正常的名稱。

引用自:https://unix.stackexchange.com/questions/329102