読者です 読者をやめる 読者になる 読者になる

C言語でテキストセグメントやデータセグメントの配置,サイズを知る方法

調べたので書く.2つの方法を見つけた.他に何かいい方法はないかね.

end, etext, edataを使う

end, etext, edataはそれぞれリンカスクリプトで定義されていて,それぞれ,BSSセグメントの最後の次のアドレス,テキストセグメント最後の次のアドレス,データセグメント最後の次のアドレスに置かれている.
デメリットとしては,コンパイル時に決まってしまう.共有ライブラリ側からは本体プログラムのを知ることがでいない,サイズは分からないなどが挙げられる.

/proc/PID/mapsを使う

procfsがメモリのマッピング情報を提供してくれるのでそれを使う.PIDを知らなくても/proc/self/mapsが自分自身を指しているので,これをプログラムの中で開いてパースすれば良い.
デメリットとしては,rwxなどでテキストセグメントか,データセグメントかなどを判断するしかない(テキストセグメントならr-xなはず・・・など).