我只是好奇。
bash-3.00$ ldd libmylibrary.so ldd: warning: you do not have execution permission for `libmylibrary.so'
一切似乎只与+ r一起工作。 我注意到大部分.so在/ usr / lib中都有+ x …
为什么共享库应该有可执行的位设置? 如果我没有设置,会发生什么?
其实这取决于ldd实施。 ldd通常是一个脚本,您可以编辑它以查看出现错误的位置和原因。
在Ubuntu 10.04上, ldd检查read权限。 如果文件不是ELF( 可执行和可链接的格式 ),它可能会给错误不是一个dynamic的可执行文件。 例如,这里的库都是-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模式是为操作系统提供另一级别的访问权限控制的惯例。 可执行程序加载器控制该访问,以确保用户可以执行该操作,还可以防止错误(某些脚本或程序不应该由某些人执行)。
这可以扩展到共享库,出于同样的原因 – 但共享库不能自行运行 ,并且不太容易被错误使用)。 因此,需求不太明显(访问足够)。
实际上,你可以执行很多库,例如,在最近的GNU / Linux系统的shell中input/lib/libc.so.6时会发生什么情况。
想像有一个可执行文件与-x。 你将无法执行它。 把这些库看作是一个通用函数的集合,被另一个程序(比如myProgra)调用。 如果你不能执行库/函数…那么你什么也没有
一个例子
function1() {} function2() {} int main() { printf("Let's call func1"); function1(); printf("Let's call func2"); function2(); }
现在,如果将function1和function2放在另一个文件中,并且包含它,那么你就是一个库。 (当然这更复杂一点,这只是一个例子)
但无论如何,正如你所看到的,你必须执行库中包含的代码
关键是文件格式,可执行文件和可链接格式。 由于使用相同的确切文件格式来标识可执行文件和共享库,因此两者必须具有OS加载程序的适当可执行权限。 如果包含符号表,这允许使用单个装载程序并将可执行文件用作DSO。