実行可能ファイルと共有オブジェクト


13

私はやっている間に何かに気づいたfind /bin -exec file {} \;

fileコマンドは、いくつかのエントリを報告し/binている shared objects他のものながら、executables。例えば、

/ bin / ntfsck:
ELF 64ビットLSB 共有オブジェクト、x86-64、バージョン1(SYSV)、
動的リンク(共有ライブラリを使用)、GNU / Linux 2.6.24、BuildID [sha1] = 312d93fd0d8653e7236a61db2e67b93c63225a00、削除済み

同じレポート gawk

/ usr / bin / gawk:
ELF 64ビットLSB 共有オブジェクト、x86-64、バージョン1(SYSV)、
動的リンク(共有ライブラリを使用)、GNU / Linux 2.6.24、
BuildID [sha1] = 76bb13aac7e212164bd6e0d7b8a5d92db44543c9、ストリップ済み

対照的file/bin/echoは:

/ bin / echo:
ELF 64ビットLSB 実行可能ファイル、x86-64、バージョン1(SYSV)、
動的リンク(共有ライブラリを使用)、GNU / Linux 2.6.24、
BuildID [sha1] = 193e75fc13e9c4599e772b8d79125a5934cf601c、ストリップ済み

基本的に、executableファイルとshared objectファイルの違いを知りたいです。


回答:


14

Tl; dr

コンパイルされた実行可能ファイルは、実行可能ファイルではなく共有オブジェクトに対してリンクされる可能性があるという事実を除いて、違いはありません。


一般的に、コンパイルするには、2つの方法がある1実行可能ファイル:

  • 静的リンクの使用:ソースコードに含まれる外部ライブラリがコンパイルされ、コンパイルされたライブラリ(またはリンカーの観点ではオブジェクト)が実行可能ファイル自体に追加されます。
  • 動的リンクの使用:ソースコードに含まれる外部ライブラリはコンパイルされますが、コンパイルされたライブラリ(またはリンカーの観点からのオブジェクト)へのリンクが実行可能ファイルに追加されます(コンパイルされたライブラリ/オブジェクトは、実行時にリンカーによってロードされます必要);

これらの各方法を使用することには長所/短所がありますが、それは問題のポイントではありません。

  • /bin/ntfsckそして/usr/bin/gawkオブジェクトで共有されています。実行可能ファイルは、その機能を使用するようにコンパイルし、それらに対してリンクされる可能性があります。この手段は、
  • /bin/echo実行可能ファイル:これは、実行可能ファイルがコンパイルされ、その機能を使用するためにリンクされない可能性があることを意味します。

したがって/bin/ntfsck/usr/bin/gawk技術的にコンパイルされたライブラリ(またはリンカーの観点からはオブジェクト)ですが、共有オブジェクトが実行可能ファイルとして実行されることを妨げるものはありません。

副次的な注意事項として、fileレポート(各レポート)にも注意してください。

動的にリンク(共有ライブラリを使用)

これは、それらのそれぞれが他の共有オブジェクトにも動的にリンクされる(そしておそらく使用される)ことを意味します。


1.前処理、コンパイル、リンクを含む、より広範な受け入れを意図した「コンパイル」。


1
OSの他の共有オブジェクトに動的にリンクされていますか?または共有ライブラリ自体?
Dr.jacky

@ Mr.Hyde OS、より具体的には、リンカーで事前に構成する必要がある場所。これにより、必要に応じて実行時にリンカーがロードできるようになります。こちらの 3.2章をご覧ください。
コス

一つは、実際に実行することができる使用のdlopenに対するリンク:Dの
アダムZahran

6

別の違いは、実行可能ファイルにはエントリポイントアドレスオフセットが定義されていることです。つまり、i386の場合は0x08048000、x86の場合は0x00400000、armの場合は0x00010000です。

共有オブジェクトファイルはライブラリだけでなく、実行可能ファイルでもあります。実行可能ファイルである場合、そのようなオフセットはありません。共有オブジェクトの実行は、そう言って、アドレス空間配置のランダム化(ASLR)を使用して、位置独立の実行(PIE)です。したがって、/ proc / pid / mapsファイルを見ると、標準の実行可能ファイルとは対照的に、ロードされたセグメントの場所が実行ごとに異なることがわかります。

この機能の背後にある考え方は、攻撃者がリターン指向のプログラミング攻撃を実行するのを妨げることにより、実行可能ファイルにセキュリティを追加することです。多くのメンテナーは、Fedora 23以降またはUbuntu 17.10以降など、PIEをデフォルトとして有効にしたパッケージをビルドすることにしました。


興味深い答え。いくつかのソースがありません(特にエントリポイントの部分にいくつかのリンクを追加した場合は便利です)が、それに関するstackoverflowの質問をいくつか検索しました。しかし、間違いなく良い答え。
セルギーKolodyazhnyy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.