ベアボーン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