Ubuntu 9.04、2.6.28-11サーバー、32ビットx86。
$ cat test.c
main() { int *dt = (int *)0x08049f18; *dt = 1; }
$ readelf -S ./test
...
[18] .dtors PROGBITS 08049f14 000f14 000008 00 WA 0 0 4
...
$ ./test
Segmentation fault
$
初心者の場合:gccは.dtors
終了後に呼び出されるelf実行可能ファイルにデストラクタセクションを作成しますmain()
。テーブルは長い間書き込み可能で、私の場合はそうする必要があるようです(readelf
出力を参照)。ただし、テーブルに書き込もうとするとセグフォルトが発生します。
私は最近読み取り専用の.dtors、pltsの傾向があることを知っていますが、私が理解していないのはreadelf
segfaultとの矛盾です。
ベストアンサー1
これらのセクションはGNU_RELRO(読み取り専用の再配置)として表示されます。つまり、動的ローダーがすべての再配置を変更すると(ロード時に遅延再配置がない場合)、そのセクションを読み取り専用としてマークします。ほとんどのコンテンツは.got.plt
別のページにあるため処理されません。
を使用してリンクスクリプトを表示し、ld --verbose
RELROを検索すると次のようなものが見つかります。
.got : { *(.got) }
. = DATA_SEGMENT_RELRO_END (12, .);
.got.plt : { *(.got.plt) }
これは、RELROセクションが12バイトで終わることを意味します.got.plt
(ダイナミックリンカー関数へのポインタが確認されたため、読み取り専用として表示できます)。
強化されたGentooプロジェクトにはRELROに関する文書があります。http://www.gentoo.at/proj/en/hardened/hardened-toolchain.xml#RELRO。