調べたので書く.2つの方法を見つけた.他に何かいい方法はないかね.
end, etext, edataを使う
end, etext, edataはそれぞれリンカスクリプトで定義されていて,それぞれ,BSSセグメントの最後の次のアドレス,テキストセグメント最後の次のアドレス,データセグメント最後の次のアドレスに置かれている.
デメリットとしては,コンパイル時に決まってしまう.共有ライブラリ側からは本体プログラムのを知ることがでいない,サイズは分からないなどが挙げられる.
/proc/PID/mapsを使う
procfsがメモリのマッピング情報を提供してくれるのでそれを使う.PIDを知らなくても/proc/self/mapsが自分自身を指しているので,これをプログラムの中で開いてパースすれば良い.
デメリットとしては,rwxなどでテキストセグメントか,データセグメントかなどを判断するしかない(テキストセグメントならr-xなはず・・・など).