web-dev-qa-db-ja.com

共有ライブラリはなぜ実行可能ですか?

なぜ_/usr/lib/_のほとんどすべての共有ライブラリに実行権限ビットが設定されているのですか?それらを実行するためのユースケースは見当たりません。いくつかのmain関数をフックして、短い著作権とバージョンのメモを出力することもできますが、多くの場合、それも実行せず、実行時にsegfaultします。

それで、これをxに設定する意味は何ですか?すべてのライブラリパッケージャーはそれを行う必要がありますか? _0644_権限を持つ共有ライブラリをdlopen()するとどうなりますか?

HP-UXでは、共有ライブラリはmmap()を使用してメモリにマッピングされ、システム内のすべてのメモリページには、カーネルお​​よびプロセッサハードウェアのメモリページ保護メカニズムと連動する保護ビットがあります。システム上のメモリの任意のページのコンテンツを実行するには、そのページにPROT_EXECが設定されている必要があります。これは、データ実行の悪用を防ぐのに役立つ機能です。

Mmap()呼び出しは、マップしようとしているファイルの許可ビットを使用して、それを含むマップされたメモリページの保護ビットを定義します。rwx-> PROT_READ | PROT_WRITE | PROT_EXEC(sys/mman.hから)。したがって、共有ライブラリをHP-UXで使用できるようにするには、共有ライブラリを含むファイルに実行権限が必要です。これにより、マップされたライブラリにも実行権限が付与されます。

HP-UXシステムでモード644の共有ライブラリを使用すると、コアダンプが発生します。

32

非実行可能共有オブジェクトは正常に動作しますが、実行可能とマークされたライブラリはまたはスタンドアロンプ​​ログラムとして実行可能です。

それで、この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/>.
21
Useless