6

ELF ファイルのセクションを並べ替える簡単な方法を探しています。すべてを特定の順序で整列させたい一連のカスタム セクションがあります。

私が見つけた唯一の方法は、リンカー スクリプトを使用することです。ただし、ドキュメントには、カスタム リンカー スクリプトを指定するとデフォルトが上書きされることが示されています。デフォルトのリンカー スクリプトには多くのコンテンツが含まれており、3 つのセクションを常に特定の順序でまとめるためだけに、カスタム スクリプトで複製する必要はありません。そのようなリンカーの動作をハードコーディングするのはあまり柔軟ではないようです。

なぜ私はこれをしたいのですか?実行時のメモリ位置 (先頭と末尾) を知る必要があるデータのセクションがあります。そこで、2 つの追加セクションを作成し、それらにセンチネル変数を配置しました。次に、これらの変数のメモリ位置を使用して、メモリ内の未知のセクションの範囲を知りたいと考えています。

.markerA 
    int markerA;
.targetSection
    ... Lots of variables ...
.markerB
    int markerB;

上記の例では、.targetSection のデータが markerA と markerB のアドレスの間にあることがわかります。

これを達成する別の方法はありますか?現在実行中の ELF イメージを読み込み、セクションの場所とサイズを決定できるライブラリはありますか?

4

4 に答える 4

4

ELF-File フォーマットを解析することで、ロードされたセクションのアドレスを取得できます。詳細は次の場所にあります。

  • ツール インターフェイス標準 (TIS) ポータブル フォーマット仕様、バージョン 1.2 (http://refspecs.freestandards.org/elf/elf.pdf)

どの情報が入手可能かを簡単に知るには、readelf を参照する価値があります

readelf -S <filename> 

に含まれるすべてのセクションのリストを返します。

  1. メモリにマップされたセクションは、PROGBITS と入力されました。
  2. 探しているアドレスが列 Addr に表示されます。
  3. メモリの場所を取得するには、実行可能ファイル/共有オブジェクトのロード アドレスを追加する必要があります

実行可能ファイル/共有オブジェクトのロード アドレスを特定するには、いくつかの方法があります。

  1. /proc/[pid]/maps を解析できます (最初の列にはロード アドレスが含まれます)。[pid] はプロセス ID です
  2. ファイルに含まれる関数が 1 つわかっている場合はdlsym、その関数へのポインターを受け取るように適用できます。そのポインターは、要求されたロード アドレスを含む構造体をdladdr返すための入力パラメーターです。Dl_info

ライブラリから ELF 情報を取得するには

  • 自由

役立つコンパニアンかもしれません(上記のTISを調べた後にそれを検出したので、少し見ただけで詳細はわかりません)

この可能な解決策のスケッチが役立つことを願っています。

于 2011-05-20T19:58:39.290 に答える
1

GCC のイニシャライザを使用して変数を参照することを検討してください。変数は別のセクションに移動し、すべてのポインタを配列に保持します。これはファイルに依存せずに機能するため、初期化子を使用することをお勧めします。

于 2011-05-21T18:34:10.697 に答える
0

残念ながら、デフォルトのリンク スクリプトをオーバーライドするのが簡単な解決策です。

柔軟ではないかもしれないと心配していたので(リンクスクリプトは頻繁に変更されると思いますが)、ホストシステムのデフォルトのldスクリプト(「ld --verbose」)に基づいてリンクスクリプトを生成するスクリプトを作成し、それに特別なセクション。

于 2014-07-27T07:16:20.867 に答える
0

ELFIO ライブラリを参照してください。WriteObj と Writer の例が含まれています。ライブラリを使用することで、ELF バイナリ ファイルをプログラムで作成/変更することができます。

于 2011-06-10T00:25:51.210 に答える