我只是好奇。
bash-3.00$ ldd libmylibrary.so
ldd: warning: you do not have execution permission for `libmylibrary.so'
仅使用+ r,一切似乎都可以正常工作。我注意到/ usr / lib中的大多数.so确实设置了+ x ...
为什么共享库应该设置可执行位?如果我不设置它会发生什么?
我只是好奇。
bash-3.00$ ldd libmylibrary.so
ldd: warning: you do not have execution permission for `libmylibrary.so'
仅使用+ r,一切似乎都可以正常工作。我注意到/ usr / lib中的大多数.so确实设置了+ x ...
为什么共享库应该设置可执行位?如果我不设置它会发生什么?
Answers:
实际上,这取决于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
模式是一种约定,可为OS提供另一级别的访问权限控制。可执行加载程序控制访问,以确保用户可以执行它,还可以防止错误(某些脚本或程序不应由某些人执行)。
出于相同的原因,这可以扩展到共享库-但是共享库不能自己运行,并且不太容易被偶然使用)。因此,需求就不那么明显了(r
访问就足够了)。
就像拥有-x可执行文件一样。您将无法执行它。将这些库视为一般功能的集合,这些一般功能由另一个程序(例如myProgra)调用。如果您无法执行库/函数...那么您什么都没有
一个例子
function1() {}
function2() {}
int main() {
printf("Let's call func1");
function1();
printf("Let's call func2");
function2();
}
现在,如果将function1和function2放在另一个文件中并包含它,那么您就是一个库。(当然,这要复杂得多。这只是一个例子)
但是无论如何,正如您所看到的,您必须执行库中包含的代码
关键是文件格式,可执行和可链接格式。由于使用相同的确切文件格式来标识可执行文件和共享库,因此两者都必须具有OS加载程序的适当可执行文件权限。如果它们包括符号表,则允许使用单个加载程序,并将可执行文件用作DSO。