什么是/lib64/ld-linux-x86-64.so.2,为什么可以用它来执行文件?

Fed*_*rve 38 linux libraries files

最近,我学到了一个技巧,如果文件缺少可执行权限,我们可以使用/lib64/ld-linux-x86-64.so.2.

例如,恢复 x 权限

-rw-r--r-- 1 root root 59K Mar  1  2017 /bin/chmod
Run Code Online (Sandbox Code Playgroud)

我们可以跑

/lib64/ld-linux-x86-64.so.2 /bin/chmod +x /bin/chmod
Run Code Online (Sandbox Code Playgroud)

我真的不知道它是怎么做到的,这不是一个常规的东西,有点神秘。

Ste*_*itt 35

那是动态链接器;如果你自己运行它,它会告诉你它做了什么:

用法: ld.so [OPTION]... EXECUTABLE-FILE [ARGS-FOR-PROGRAM...]

您已经调用了“ld.so”,这是共享库可执行文件的帮助程序。这个程序通常存在于文件中/lib/ld.so,使用 ELF 共享库的可执行文件中的特殊指令告诉系统的程序加载器从这个文件加载帮助程序。这个帮助程序加载程序可执行文件所需的共享库,准备程序运行,然后运行它。你可以直接从命令行调用这个帮助程序来加载和运行一个 ELF 可执行文件;这就像执行该文件本身,但始终使用您指定的文件中的此帮助程序,而不是您运行的可执行文件中指定的帮助程序文件。这主要用于维护人员测试此帮助程序的新版本;您可能不打算运行此程序。

链接器用于运行动态链接的程序。当您运行时chmod,内核有效地运行/lib64/ld-linux-x86-64.so.2 chmod,就像您手动执行的那样;即使chmod二进制文件不可执行,后者也能工作。

您将在优秀的程序如何运行:ELF 二进制文件一文中找到更多详细信息。