3

かなりあいまいなユースケースの場合、小さな制御コードと大きな静的 (読み取り専用) データで構成される (大きな) 静的にリンクされた Linux 実行可能ファイルが必要です。メモリを節約するために、ローダーに制御コードのセクションのみをロードさせ、必要に応じて RO データのセクションを手動でロードし、処理が完了したら再度アンロードすることは可能ですか?

これは可能ですか?

(これを解決するために(ファイルシステムレベルの)データストリームを使用できると思いますが、それらは私には利用できず(EXT3)、データストリームは簡単に失われるため、配布は難しいでしょう。)

4

4 に答える 4

4

これは (おそらく) 既に処理されています。

もちろん、本当の答えはシステムに依存しますが、一般に、最新のオペレーティング システム (および確かに Linux) は実行可能ファイルにデマンド ページングを使用するため、参照しない ELF ファイルのセクションに実際に RAM が割り当てられることはありません。

于 2009-10-31T04:06:04.450 に答える
1

BLOB をバイナリにリンクする代わりに、追加します。それらはマップされませんが、必要に応じて読み取りまたはマップできます。

于 2009-11-06T01:00:43.000 に答える
1

一部の回答は、バイナリ全体がマップされることを暗示しているため、誤解を招く可能性があります。いいえ、違います。すべてがマッピングされるわけではありません。

証拠:

$ cat /proc/self/maps
**08048000**-08052000 r-xp 00000000 08:03 78433      /bin/cat
**08052000**-08053000 rw-p 0000a000 08:03 78433      /bin/cat
...

マッピングされるのは、 の 2 つの部分だけです。なんで?これらは DT_LOAD 型を持つ唯一のものであるため:

$ readelf -l /bin/cat

Elf file type is EXEC (Executable file)
Entry point 0x8049cf8
There are 8 program headers, starting at offset 52

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  PHDR           0x000034 0x08048034 0x08048034 0x00100 0x00100 R E 0x4
  INTERP         0x000134 0x08048134 0x08048134 0x00013 0x00013 R   0x1
      [Requesting program interpreter: /lib/ld-linux.so.2]
  LOAD           0x000000 **0x08048000** 0x08048000 0x09ba0 0x09ba0 R E 0x1000  <<
  LOAD           0x00a000 **0x08052000** 0x08052000 0x00228 0x00804 RW  0x1000  <<
  DYNAMIC        0x00a014 0x08052014 0x08052014 0x000c8 0x000c8 RW  0x4
  NOTE           0x000148 0x08048148 0x08048148 0x00044 0x00044 R   0x4
  GNU_EH_FRAME   0x008c48 0x08050c48 0x08050c48 0x002a4 0x002a4 R   0x4
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x4

また、仮想アドレスが ELF ファイルで定義されているものと同じであることもわかります。

実際には、ファイルの最初の 40 KiB (0x8052000-0x8048000 = 40960 バイト) にしかアクセスできません。ELF ヘッダーにはこれで十分ですが、文字列テーブル (.strtab) はおろか、DWARF .debug ヘッダーにもアクセスできません。

すべての ELF セクションにアクセスしたい場合は、ファイル全体をマップするのが最も簡単です。

于 2011-05-22T12:38:55.440 に答える
0

いいえ、ELF ファイルの一部である場合はマップされます。ELF の詳細についてはよくわかりませんが、これが PE ファイルの場合は、PE 構造を超えて、追加したデータを PE ファイルの末尾にタグ付けするだけで済みます。PE 構造の一部ではないデータは、ウィンドウのメモリにマップされません。ELFにも同じことがあると思います。

于 2009-10-30T10:46:16.297 に答える