ベアボーン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
は間違ってだけではなく0x1000
、0x1000 + offset
を開催します。
どのように2つを区別する必要がありますか? .symtab
セクションを確認して、そこに見つかったアドレスの再配置だけで十分ですか?しかし、シンボルが実際に場所0x1000
にある場合はどうなりますか?または、リンカーがこの問題に対処しています(したがって、アドレス0x1000
に機能を追加しません)。 .symtabs
は、.got
と.data.rel
の中にあるすべてのシンボルを含んでいますか?
私は基本的なELFローダーを書きましたが、 "R_ARM_ABS32"とマークされた再配置エントリにのみオフセットを追加することを思い出しています。このコードはhttps://github.com/tangrs/ndless-elfloader/blob/master/elf/elf_load.c – tangrs
にあります。また、elfファイルに再配置エントリを追加する方法はありますか? readelfはそこにはないと言っていますが、私は-r -fpicを使ってコンパイル/リンクします。 (btw。これを答えとして追加してupvoteすることができます) – SztupY