- 1 名前:名無しさん@お腹いっぱい。 [03/02/18 03:49.net]
- いますか?
- 837 名前:名無しさん@お腹いっぱい。 [2025/09/20(土) 19:26:58.91 ID:EDd7Pddis]
- >>809
sys_errlist[]がその例だよね。 動的リンクしてるはずなのに、コンパイルするとsys_errlist[]の文字列一式が 実行バイナリ本体に静的に埋め込まれてしまって何コレ?って思ったことある。 だからsys_errlist[]は使わずにstrerror()関数使え、ってなった。
今は直接は埋め込まずに、実行バイナリ本体に外部参照してるデータのサイズ分の bss領域を確保しておいて、実行時に動的リンカーが共有ライブラリから そのbss領域にデータ一式コピーするみたいな方法になってるけど コピーが無駄なことに変わりはない。
- 838 名前:名無しさん@お腹いっぱい。 [2025/11/08(土) 19:37:23.40 ID:0cFUylTxV]
- >>837
-fpicでコンパイルすると copyrelocにはならず、sys_errlistもGOTを使った間接参照になるよ。 -fpicじゃなくて-fpieの方だと依然として copyrelocになるので注意。
もっと身近に、stdoutとかstderrも、この外部変数を直接プログラム中に記述すると copyrelocになる。-fpicにするとGOT経由になる。
(暗黙にstdoutが使われるprintf()とかはstdoutを直接記述してないので copyrelocにならない)
|

|