为什么共享库可执行?


59

为什么几乎所有共享库/usr/lib/都设置了可执行权限?我看不到有执行它们的用例。有些人确实设法连接了某种形式的main功能以打印简短的版权和版本说明,但许多人甚至没有这样做,并且在执行时出现段错误。

那么,设置这个有x什么意义呢?所有图书馆包装商都必须这样做吗?如果我dlopen()拥有共享库,将会怎样0644


3
在什么操作系统(如果是Linux,什么发行版)上?在Debian挤压,中唯一可执行的共享库/lib,并/usr/lib在libc和的libpthread,并且在执行时都打印版权声明。
Gilles

如果发生段错误,则可能是较小的错误。如果您遇到它们,我会报告给他们。分布是什么?
Faheem Mitha 2012年

@Faheem:没有main()符号作为入口点不是一个小错误,而是一个基本的设计选择。你错过了我的观点。
Tadeusz A.Kadłubowski2012年

2
@吉尔斯:我已经将755作为RedHat系列Linux系统(Fedora和Centos)以及Solaris上的默认权限选择。
Tadeusz A.Kadłubowski2012年

这个问题的前提并非普遍正确。如上所述,实际上对于Debian Linux是错误的。对于FreeBSD和OpenBSD也为false。
JdeBP

Answers:


32

在HP-UX下,共享库使用mmap()映射到内存中,并且系统中的所有内存页面都有保护位,这些保护位与内核和处理器硬件的内存页面保护机制结合在一起。为了执行系统上任何内存页面的内容,该页面必须设置PROT_EXEC-防止数据执行漏洞的有用功能。

mmap()调用使用将要映射的文件上的权限位来定义包含该权限的映射内存页的保护位:rwx-> PROT_READ | PROT_WRITE | PROT_EXEC(来自sys / mman.h)。因此,为了使共享库在HP-UX上可用,包含共享库的文件必须具有执行许可权,以确保映射的库也具有执行许可权。

在HP-UX系统上,模式为644的共享库将导致核心转储。


可能其他Unix实现也使用此功能。
Tadeusz A.Kadłubowski2012年

> HP-UX(来自“ Hewlett Packard Unix”)是Hewlett Packard Enterprise专有的Unix操作系统的实现,基于UNIX System V
David天宇Wong

另一个示例是,使用单独的debuginfo软件包创建rpm软件包需要共享库的执行权限,否则find-debuginfo.sh会跳过对它们的处理。
Domen Vrankar '17

20

不可执行的共享库工作正常,但是标记为可执行的库可以作为独立程序运行。

那么,设置这个x有什么意义呢?

无,除非您希望他们发出版本或其他信息

所有图书馆包装商都必须这样做吗?

没有

如果我对具有0644权限的共享库进行dlopen(),会发生什么情况?

您将获得一个新的共享库句柄(只要文件可读即可,等等)... exec位不影响此操作


关于为什么不能用作独立可执行文件的库仍然设置了exec位:这可能只是所使用的构建系统或链接脚本的伪像。


示例输出,仅供参考:

$ /lib/i386-linux-gnu/libc.so.6
GNU C Library (Ubuntu EGLIBC 2.15-0ubuntu10) stable release version 2.15, by Roland McGrath et al.
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.6.3.
Compiled on a Linux 3.2.14 system on 2012-04-19.
Available extensions:
    crypt add-on version 2.1 by Michael Glad and others
    GNU Libidn by Simon Josefsson
    Native POSIX Threads Library by Ulrich Drepper et al
    BIND-8.2.3-T5B
libc ABIs: UNIQUE IFUNC
For bug reporting instructions, please see:
<http://www.debian.org/Bugs/>.

11
大多数.so库只是简单地存在段错误,因为它们没有类似于正常main()入口点的内容。Libc是一个异常值。它的开发人员将此注释作为一项附加功能。chmod a+x任何其他库中的简单库都不会为您提供此功能`我仍然看不到+x所有库的设置要点。
Tadeusz A.Kadłubowski2012年

同意,并且可能只有那些.so可以执行的标记为这样。我将修改答案,以避免暗示具有exec位设置的所有内容实际上都是独立的可执行文件。
没用的2012年

5
“ ldd”命令通常是一个sh脚本,用于调用动态链接程序ld-linux-x86-64.so.2或/lib/ld-linux.so.2或类似的文件。动态链接器始终是共享对象。
Bruce Ediger 2012年
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.