none
異なるPCのVC++2010から作成されるモジュールが異なる理由 RRS feed

  • 質問

  • 二つのPCにインストールされているVC++2010で作成したEXEをバイナリ比較してみたのですが、
    異なる箇所が多いので調査してみました。

    ちなみに、バイト数は同じでした。

    調べてみててわかったことは、

    MS-DOSヘッダの、e_lfanewメンバの値が異なっており、
    そのため、以降の値は、バイト位置がずれて異なる結果となっていたみたいです。
    値は、0x108と0x110です。

    また、.textセクション以降のバイナリ値は、まったく同じでした。

    つまり、MS-DOS Real-Mode Stub Programの内容が異なっていることになるみたいなのですが、
    どちらのEXEも問題ないと考えてもいいのでしょうか?
    どう判断すべきなのか・・・気にすべきなのか・・・など。

    教えてください。

    2018年12月14日 0:26

すべての返信

  • 情報
    https://faq.jp.fujitsu.com/app/answers/detail/a_id/2634/~/同じソースから作成したはずの2つの実行ファイル(exe、dll)を比較すると、異なる部分があるのはなぜですか?
    COBOLですが、同じ。

    Jitta@わんくま同盟

    2018年12月14日 0:36
  • 最低でもビルドするたびに作成日付、チェックサム値?が変わるのは理解しているのですが、
    でも、MS-DOSヘッダの、e_lfanewメンバの値が変わるものなのかという疑問があります。

    異なるPCでのVC++2008ビルドでも、e_lfanewメンバの値は、0x108となっており、ビルド単位に変わるものだと思われません。MS-DOS Real-Mode Stub Programの埋め込まれる内容が異なっていると思われるのですが。

    2018年12月14日 1:27
  • 非公開オプションを使って2台のPCそれぞれで cl.exe /Bv を実行してみてください。もしくはlink.exeのファイルのプロパティからバージョン番号を確認してみてください。

    両者に違いがあるかもしれません。

    2018年12月14日 4:04
  • 確認してみました。次のモジュールのバージョンのみ異なっていました。

    mspdb100.dll

    ・10.00.30319
    ・10.00.40219.1

    mspdb100.dllを差し替えてみたのですが、コンパイルに失敗したので原因なのかまではわかりませんでした。

    2018年12月17日 0:38
  • mspdb100.dllでググるとトラブルらしき記述がいくつか見つかりますね。どうやらmspdb100.dllはVisual C++ 2010ではなく、Visual Studio 2010 IDE側に含まれるコンポーネントのようです。

    ですので、Visual C++のマイナーバージョンだけでなく、Visual Studioのマイナーバージョンにも影響するのかもしれません。

    LINK.EXEが実行ファイルを生成することは明らかですが、質問のReal Mode Stubをどこで生成するのかは明確になっていませんが、今回の現象からそのような可能性もありそうです。

    # すみません、私自身はVisual Studio 2010環境を用意せずにコメントしています。

    2018年12月17日 3:27
  • 長さについては、おおよそ同じ環境で異なってくるものなのか知りませんが、

    少なくとも内容については、少し環境が変われば異なるはずのものなのでは?

    https://bytepointer.com/articles/the_microsoft_rich_header.htm

    2018年12月17日 5:58
  • 挙げられたページの「DOS STUB」、つまり「This program cannot be run in DOS mode.\r\r\n」と出力するだけのプログラムの長さがも変化がある(同じバージョンのコンパイラーであっても!)、というのが本スレッドの議論なわけですが。

    もしかすると \r\n だった部分がバグって \r\r\n となり、8バイトアラインのために 0x108 → 0x110 と広がってしまった、とかですかねぇ…。

    # 手元のVS2017でも \r\r\n ですねぇ…。

    リンクオプション /STUB でバイナリを指定することで環境による影響を排除できます。

    2018年12月17日 6:12
  • e_lfanew までの間には、"DOS STUB" だけでなく、可変の Rich signature も入ってるのでは。

    2018年12月17日 6:19
  • 失礼しました。質問者さんがDOS STUBとおっしゃっているのでDOS STUBなのだと考えていました。そうではなくRich Signatureの可能性もあるんですね。
    2018年12月17日 6:32
  • Rich signature (?)を下記を下記のページを参照して位置と個所の内容を確認したところ、異なっていました。
    https://www.ntcore.com/files/richsign.htm

    ”DOS Stub”については内容は同じでした。すみません。Rich signature (?)なるものを知りませんでした。
    ちなみに下記は、
    Rich signature (?)の始まりです。

    ・23 B3 4B 81 ・・
    ・0D 4E 26 FB ・・

      

    2018年12月17日 9:29