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