为什么几乎所有共享库都/usr/lib/
设置了可执行权限位?我没有看到任何执行它们的用例。有些确实设法连接某种形式的main
函数来打印简短的版权和版本说明,但许多人甚至不这样做,并且在执行时出现段错误。
那么,设置这个有什么意义呢x
?所有库打包者都必须这样做吗?如果我的dlopen()
共享库具有权限会发生什么0644
?
答案1
在HP-UX下,共享库使用mmap()映射到内存,系统中的所有内存页面都有保护位,这些保护位与内核和处理器硬件的内存页面保护机制相结合。为了执行系统上任何内存页面的内容,该页面必须设置 PROT_EXEC - 这是防止数据执行漏洞的有用功能。
mmap() 调用使用要映射的文件上的权限位来定义要包含该文件的映射内存页的保护位:rwx -> PROT_READ|PROT_WRITE|PROT_EXEC(来自 sys/mman.h)。因此,为了使共享库可以在 HP-UX 上使用,包含共享库的文件必须具有执行权限,以确保映射库也具有执行权限。
HP-UX 系统上模式 644 的共享库将导致核心转储。
答案2
不可执行的共享对象工作正常,但标记为可执行的库可能会还可作为独立程序运行。
那么,设置这个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/>.