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

Tad*_*ski 63 libraries conventions

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

那么,设置这个有x什么意义呢?所有的库打包者都必须这样做吗?如果我dlopen()是一个有0644权限的共享库会发生什么?

小智 33

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

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

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


Use*_*ess 24

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

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

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

所有的库打包者都必须这样做吗?

如果我 dlopen() 一个具有 0644 权限的共享库会发生什么?

你会得到一个新的共享对象句柄(只要文件可读等)...... 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/>.
Run Code Online (Sandbox Code Playgroud)

  • 大多数 .so 库只是段错误,因为它们没有任何类似于正常 `main()` 入口点的东西。Libc 是一个异常值。它的开发人员将此注释作为额外功能。任何其他库的简单 `chmod a+x` 都不会给你这个功能`我仍然没有看到为所有库设置 `+x` 的意义。 (11认同)
  • “ldd”命令通常是一个调用动态链接器、ld-linux-x86-64.so.2 或 /lib/ld-linux.so.2 或类似的 sh 脚本。动态链接器始终是共享对象。 (5认同)