/lib64/ld-linux-x86-64.so.2 是什麼,為什麼可以用來執行文件?
最近,我學到了一個技巧,如果一個文件缺少可執行權限,我們可以使用
/lib64/ld-linux-x86-64.so.2
.例如,要恢復 x 權限
-rw-r--r-- 1 root root 59K Mar 1 2017 /bin/chmod
我們可以跑
/lib64/ld-linux-x86-64.so.2 /bin/chmod +x /bin/chmod
我真的不知道它是怎麼做到的,這不是一個正常的東西,有點神秘。
那是動態連結器;如果你自己執行它,它會告訴你它做了什麼:
用法:
ld.so [OPTION]... EXECUTABLE-FILE [ARGS-FOR-PROGRAM...]
您已經呼叫了“ld.so”,它是共享庫執行檔的幫助程序。該程序通常存在於文件
/lib/ld.so
中,並且使用 ELF 共享庫的執行檔中的特殊指令告訴系統的程序載入器從該文件載入幫助程序。該幫助程序載入程序執行檔所需的共享庫,準備程序執行並執行它。您可以直接從命令行呼叫此幫助程序來載入和執行 ELF 執行檔;這就像執行該文件本身,但始終使用您指定的文件中的此幫助程序,而不是您執行的執行檔中指定的幫助程序文件。這主要用於維護人員測試此幫助程序的新版本;您可能不打算執行該程序。連結器用於執行動態連結的程序。當您執行
chmod
時,核心有效地執行相當於/lib64/ld-linux-x86-64.so.2 /bin/chmod
您手動執行的 ;即使chmod
二進製文件不可執行,後者也可以工作,因為執行權限的檢查是由execve()
系統呼叫對它被告知執行的文件完成的,並且在/lib64/ld-linux-x86-64.so.2 /bin/chmod
shell 命令行中,shell 傳遞給的路徑execve()
是/lib64/ld-linux-x86-64.so.2
,而不是/bin/chmod
,並且它是檢查執行權限的那個,/bin/chmod
僅作為參數傳遞給連結器。在不需要可執行的/bin/sh ./some-script
地方也是一樣的。./some-script
您將在出色的程序執行方式:ELF 二進製文件中找到更多詳細資訊。