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


8

我只是好奇。

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

仅使用+ r,一切似乎都可以正常工作。我注意到/ usr / lib中的大多数.so确实设置了+ x ...

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


2
库绝对不需要+ x即可正常运行。也许它们是链接?链接需要跟随+ x。
克里斯·S

是的,他们不需要+ x,但是大多数库都已设置。
Tomo,2010年

这个问题也被要求在Unix和Linux:unix.stackexchange.com/questions/40587/...(并得到了正确的答案有)
米哈尔戈尔诺-

Answers:


3

实际上,这取决于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访问就足够了)。


3

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


0

就像拥有-x可执行文件一样。您将无法执行它。将这些库视为一般功能的集合,这些一般功能由另一个程序(例如myProgra)调用。如果您无法执行库/函数...那么您什么都没有

一个例子

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

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

但是无论如何,正如您所看到的,您必须执行库中包含的代码


但是您执行的是可执行文件,而不是库。
伊格纳西奥·巴斯克斯

参见上面的编辑版本
Nikolaidis Fotis,2010年

0

关键是文件格式,可执行和可链接格式。由于使用相同的确切文件格式来标识可执行文件和共享库,因此两者都必须具有OS加载程序的适当可执行文件权限。如果它们包括符号表,则允许使用单个加载程序,并将可执行文件用作DSO。


那么,加载程序使用权限位而不是文件头来标识要加载的内容吗?
Tomo,2010年

加载程序使用文件头将内容标识为DYN或EXEC并执行适当的操作。执行位用于操作系统,而不是加载器。ELF是一种可执行格式,没有执行位,操作系统将不允许加载程序执行文件以读取标头。查阅Wikipedia,以获取有关ELF的更多信息en.wikipedia.org/wiki/Executable_and_Linkable_Format
nzwulfin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.