5

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

例:

void some_function() { return; }

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

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

ここでa.fptrは、関数の実際の場所を正しくアドレス指定しますが、だけでなく、a.numberを誤って保持します。0x1000 + offset0x1000

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

4

1 に答える 1

3

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

ここでコードを見つけることができますhttps://github.com/tangrs/ndless-elfloader/blob/master/elf/elf_load.c

--emit-relocs をオンにして ELF ファイルをリンクしただけです。そうすれば、リンカがすべてのリンクを行います。リンカは何を行ったかを通知するだけなので、読み込み時にオフセットを修正できます。

于 2012-03-11T06:55:05.823 に答える