私は最近、VOSのお客様からの質問に答えました。そのお客様は、共有している仮想メモリ領域を、レガシーの非POSIXプログラムと新しいPOSIXベースのプログラムの間で一致させる方法を知りたがっていました。
このお客様は create_data_object コマンドを使用して、複数の異なる共有仮想メモリ領域を作成していました。 そして、バインド制御ファイルを使用して、各プログラムが同じ順序で同じ仮想アドレスでリージョンを参照するようにしていました。 問題は、新しい POSIX ベースのプログラムをどのように gcc コマンドを使ってバインドしても、SVM 領域を揃えることができなかったことです。新しいプログラムは SVM リージョンを異なるアドレスに配置していました。 gcc でバインドファイルを使っても何の役にも立ちませんでした。
バインドマップ(または display_program_module コマンドの出力)を見ると、POSIX プログラムは常に "s_start_c_program" と "crti" オブジェクトモジュールで始まることがわかります。 s_start_c_programオブジェクトモジュールはレガシープログラムの後に現れ、crtiオブジェクトモジュールは全く現れません。 これら2つのオブジェクトモジュールが存在すると、後続のすべてのオブジェクトモジュールがファイル内で下に押し下げられ、その結果、位置ずれが発生します。
gccがこの2つのオブジェクトモジュールをプログラムモジュールの中で最初に置くことを防ぐ方法はありません。そこで、解決策は、レガシープログラムのバインド方法を変更することです。 SVM 領域はページ境界で開始しなければならず、s_start_c_program と crti コード領域の合計サイズは 1 ページ未満なので、必要なのはレガシープログラムの開始時に余分な未使用のページを割り当てることです。 create_data_objectコマンドを使用して4096バイトのデータオブジェクトを作成し、最初のオブジェクトモジュールとしてバインド制御ファイルに入れます。
この2つのプログラムのサイズを1ページ(4096)バイト以下にすることで合意したので、この解決策は今後も機能します。
このテクニックについて質問があれば、以下に投稿してください。