为什么 Linux 上的共享库是可执行的?

为什么 Linux 上的共享库是可执行的?

我只是好奇。

bash-3.00$  ldd libmylibrary.so
ldd: warning: you do not have execution permission for `libmylibrary.so'

似乎只要使用 +r,一切就都运行正常。我注意到 /usr/lib 中的大多数 .so 都设置了 +x...

为什么共享库应该设置可执行位?如果我不设置它会发生什么?

答案1

实际上这取决于ldd实施情况。ldd通常是一个脚本,您可以编辑它来查看在哪里以及为什么会出现该错误。

在 Ubuntu 10.04 上,仅ldd检查read权限。可能会出现错误不是动态可执行文件如果文件不是 ELF(可执行和可链接格式)这里的库都是-rw-r--r--,例如

$ find /usr/lib -type f -name "libm*.so*" -ls
(...)
-rw-r--r--   1 root     root       216800 Feb 26 22:20 /usr/lib/libmp.so.3.1.16
-rw-r--r--   1 root     root        76728 Mar 14 04:23 /usr/lib/libmjpegutils-1.9.so.0.0.0
-rw-r--r--   1 root     root       134464 Jan 29  2010 /usr/lib/libm17n-core.so.0.3.0
-rw-r--r--   1 root     root       290480 Feb 17  2010 /usr/lib/libmtp.so.8.3.2

x想要访问共享库并不奇怪。该executable模式是一种惯例,它为操作系统提供了另一层访问权限控制。可执行文件加载程序控制该访问权限,以确保用户可以执行它,同时也防止出现错误(某些脚本或程序不应由某些人执行)。

出于同样的原因,这可以扩展到共享库 - 但共享库不能跑步本身就不容易出错,意外地)。因此,这种需要就不那么明显了(访问r就足够了)。

答案2

您实际上可以执行很多库,例如看看/lib/libc.so.6在最近的 GNU/Linux 系统上的 shell 上打字时会发生什么。

答案3

想象一下,有一个带有 -x 的可执行文件。您将无法执行它。将这些库视为由另一个程序(假设为 myProgra)调用的通用函数的集合。如果您无法执行库/函数……那么您将一无所有

一个例子

function1() {} 
function2() {} 
int main() { 
printf("Let's call func1"); 
function1(); 
printf("Let's call func2"); 
function2(); 
} 

现在,如果你将 function1 和 function2 放在另一个文件中并将其包含,那么你就是一个库。(当然,这更复杂。这只是一个例子)

但无论如何,正如你所见,你必须执行库中包含的代码

答案4

关键是文件格式,可执行文件和可链接文件格式。由于使用完全相同的文件格式来标识可执行文件和共享库,因此两者都必须具有操作系统加载程序的适当可执行权限。这允许单个加载程序和可执行文件用作 DSO(如果它们包含符号表)。

相关内容