2012-03-09 7 views
4

ベアボーンARMアプリケーション用の単純なリンカを作成しようとしています。現在、モジュールをロードするローダーは、単に.gotセクションと.data.relセクションのすべてのレコードにオフセットを追加します。これは.gotでうまく動作し、.data.relの内部で再配置が必要なすべてのシンボルに対して機能します。これは、このオフセットを取得するので、すべての非リロケータブルデータについても破損します。.data.relセクション内で再配置可能なシンボルと再配置不可能なシンボルを区別する方法

例:ここでは

void some_function() { return; } 

struct a { 
    void* fptr; 
    int number; 
}; 

static struct a = { 
    .fptr = some_function, 
    .number = 0x1000, 
}; 

a.fptrが正しく機能の実際の位置に対応しますが、a.numberは間違ってだけではなく0x10000x1000 + offsetを開催します。

どのように2つを区別する必要がありますか? .symtabセクションを確認して、そこに見つかったアドレスの再配置だけで十分ですか?しかし、シンボルが実際に場所0x1000にある場合はどうなりますか?または、リンカーがこの問題に対処しています(したがって、アドレス0x1000に機能を追加しません)。 .symtabsは、.got.data.relの中にあるすべてのシンボルを含んでいますか?

+1

私は基本的なELFローダーを書きましたが、 "R_ARM_ABS32"とマークされた再配置エントリにのみオフセットを追加することを思い出しています。このコードはhttps://github.com/tangrs/ndless-elfloader/blob/master/elf/elf_load.c – tangrs

+0

にあります。また、elfファイルに再配置エントリを追加する方法はありますか? readelfはそこにはないと言っていますが、私は-r -fpicを使ってコンパイル/リンクします。 (btw。これを答えとして追加してupvoteすることができます) – SztupY

答えて

2

以前は基本的なELFローダーを書きましたが、「R_ARM_ABS32」とマークされた再配置エントリにのみオフセットを追加することを思い出しました。

あなたは、私は単に--emit-再配置情報と私のELFファイルがオンにリンクされ、ここでhttps://github.com/tangrs/ndless-elfloader/blob/master/elf/elf_load.c

を、コードを見つけることができます。そうすれば、リンカーはすべてのリンクを行います。ロード時にオフセットを修正できるように、リンカが何をしたかを教えてくれます。

+0

実際の問題はgccを使用していたため、コマンドラインで "-Xlinker --emit-relocs"を使用しなければならなくなりました。 relocを有効にすると、タスクが簡単になりました。 – SztupY

関連する問題