【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

開発

VC++でビルドしたPEバイナリをa.outに変換してMINIXで動作しました。VC++内でバイナリ変換まで行うようにまとめました。

MINIX用バイナリを生成するための設定は以下の通りです。

構成プロパティ

デバッグビルドでは基本ランタイムチェックが組み込まれて参照が解決できないため、リリースビルドだけを対象とします。

プロジェクトの構成プロパティを以下のように変更します。

  • C/C++
  • リンカ
    • 入力
      • すべての既定のライブラリの無視: はい (/NODEFAULTLIB)
    • マニフェスト ファイル
    • デバッグ
      • デバッグ情報の生成: いいえ
      • マップ ファイルの作成: はい
    • システム
      • サブシステム: ネイティブ (/SUBSYSTEM:NATIVE)
    • 詳細
      • エントリ ポイント: start ← プロジェクトに応じて任意に変更
      • ベース アドレス: 0
      • ランダム化されたベース アドレス: イメージのランダム化を無効にする (/DYNAMICBASE:NO)
      • 固定ベース アドレス: イメージを固定アドレスに読み込まなければなりません。 (/FIXED)
    • コマンド ライン
      • 追加のオプション: /ALIGN:512

変更理由

変更の理由を説明します。gccでのオプションと比較します。VC++Windowsに依存しないバイナリを開発する際の参考になると思います。

ライブラリの排除

Windowsのヘッダをインクルードパスから外します。gccの-nostdincに相当します。

  • 標準インクルード パスの無視

デフォルトではWindowsに依存したライブラリがリンクされてしまうため外します。gccの-nostdlibに相当します。

  • すべての既定のライブラリの無視

エントリポイントを設定しないとWindows用のスタートアップルーチンがリンクされてしまうため、設定します。

ランタイム依存コードの排除

言語機能がランタイムを使っているため、デフォルトライブラリを外すと未定義になってしまいます。そのため言語機能を無効にします。

  • バッファ セキュリティ チェック

基本ランタイムチェックもランタイムに依存していますが、最適化をかけると無効になるため、リリースビルドでは特に設定していません。

アドレス

MINIXではtextセクションがゼロ番地から配置されるため、アドレスを変更します。gccの-Wl,--image-base=0に相当します。

  • ベース アドレス: 0
  • 固定ベース アドレス

アドレスを固定化するため、リロケーション情報は無効にします。

  • ランダム化されたベース アドレス

MINIXではセクションが8バイトでアラインメントされていますが、PEでは最小値の512を指定します。gccの-Wl,--section-alignment=512に相当します。

  • 追加のオプション: /ALIGN:512

PEではベースアドレスの先頭にハンドラなどの領域が確保されますが、MINIXでは使わないためgccでは-Ttext=0としてtextセクションをずらしています。VC++でのオプションは見当たらなかったため、先頭から0x400まではパディングとなります。