気になるだけです。
bash-3.00$ ldd libmylibrary.so
ldd: warning: you do not have execution permission for `libmylibrary.so'
+ rだけですべてがうまくいくようです。/ usr / libの.soのほとんどに+ xが設定されていることに気づきました...
共有ライブラリに実行可能ビットが設定されているのはなぜですか?設定しないとどうなりますか?
気になるだけです。
bash-3.00$ ldd libmylibrary.so
ldd: warning: you do not have execution permission for `libmylibrary.so'
+ rだけですべてがうまくいくようです。/ usr / libの.soのほとんどに+ xが設定されていることに気づきました...
共有ライブラリに実行可能ビットが設定されているのはなぜですか?設定しないとどうなりますか?
回答:
実際には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
アクセスで十分です)。
-xを指定して実行可能ファイルを作成するように考えてください。実行できなくなります。これらのライブラリを、別のプログラム(myPrograとしましょう)によって呼び出される一般的な関数のコレクションと見なします。ライブラリ/関数を実行できない場合...何もありません
例
function1() {}
function2() {}
int main() {
printf("Let's call func1");
function1();
printf("Let's call func2");
function2();
}
ここで、function1とfunction2を別のファイルに配置してインクルードすると、ライブラリになります。(もちろん、もっと複雑なものです。これは単なる例です)
しかし、いずれにしても、ご覧のとおり、ライブラリに含まれているコードを実行する必要があります
重要なのは、ファイル形式、実行可能およびリンク可能な形式です。実行可能ファイルと共有ライブラリの両方を識別するためにまったく同じファイル形式が使用されるため、どちらもOSローダーに対して適切な実行可能権限を持っている必要があります。これにより、単一のローダーと実行可能ファイルにシンボルテーブルが含まれている場合、DSOとして使用できます。