0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MinGWでコンパイルしたMD5関数をVisual Studio(msvc)にリンクするまでのメモ

Last updated at Posted at 2018-09-17

キッカケ

こちらに掲載されているMD5関数のテストプログラムを実行したところ、gcc on WSLでコンパイルすると頭一つ早い結果となった。(msvc/clangでは580 MB/s程度、gccでは約750 MB/s程度)
Windowsネイティブで同等の速度を出せないか試行錯誤をした。
「手段が目的」なので、単に自己満足だけである。
おそらく、全部MinGW環境を構築してビルドすれば、この投稿に書く内容はやる必要はないと思われる。

  • cl.exe
    Microsoft(R) C/C++ Optimizing Compiler Version 19.15.26729 for x86
  • clang-cl
    Microsoft(R) C/C++ Optimizing Compiler Version 19.15.26729 for x86
  • clang on WSL
    clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)
  • gcc on WSL
    gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609

msvcで試行錯誤してみたが

結論から言うとオプションを変えても、目立った効果はなかった。
/Oy /Ot /Ob2 /Oi /O2

WSL(Ubuntu16.04)でクロスコンパイル

gccでビルドして、Intel記法でアセンブル出力する。

sudo apt install g++-mingw-w64-i686
i686-w64-mingw32-gcc-win32  md5.c -O3 -fomit-frame-pointer -S -masm=intel -fstack-protector

Visual Studio に組み込む

クロスコンパイルで作成された*.SファイルをWindowsに持ってきて、Visual Studioのプロジェクトに組み込む。

アセンブリファイルをビルド出来るようにする。

こちらを参考にした。

  • [ビルドのカスタマイズ]をクリックする。
  • [masm(.targets, .props)]を選択する。
  • ビルドのカスタマイズで 追加した*.sファイルの項目の種類をMicrosoft Macro Assembler に変更する。

これだけだとビルドしたときにエラー(C++ LNK2026 モジュールは SAFESEH イメージには安全ではありません)が発生して、リンクできない。
*.sファイルのプロパティで、[Microsoft Macro Assembler] - [Advanced]の Use Safe Exception Handlersをはい(/safeseh)に変更する。

アセンブリファイルのディレクティブなどを編集する

そのままだとMASMで解釈できないディレクティブがあるので、
関数名のラベルとそれより前と、retの後をMASM用に差し替える。
アセンブラは詳しく無いので、cl.exeの/FAcs の出力結果からほぼコピペしている。
今回対象にした関数は処理しかかなったが、データ割当などがあるとコピペはできないと思われる。

diff U5b md5.s md5_compress.s
--- md5.s	Mon Sep 17 12:29:36 2018
+++ md5_compress.s	Mon Sep 17 12:40:48 2018
@@ -1,15 +1,21 @@
-	.file	"md5.c"
-	.intel_syntax noprefix
-	.section	.text.unlikely,"x"
-LCOLDB0:
-	.text
-LHOTB0:
-	.p2align 4,,15
-	.globl	_md5_compress
-	.def	_md5_compress;	.scl	2;	.type	32;	.endef
-_md5_compress:
+	.686P
+	.XMM
+	include listing.inc
+	.model	flat
+
+INCLUDELIB MSVCRT
+INCLUDELIB OLDNAMES
+
+PUBLIC	_md5_compress
+EXTRN	@__security_check_cookie@4:PROC
+EXTRN	_memcpy:PROC
+EXTRN	_memset:PROC
+EXTRN	___security_cookie:DWORD
+_TEXT	SEGMENT
+
+_md5_compress PROC
 	push	ebp
 	push	edi
 	push	esi
 	push	ebx
 	sub	esp, 64
@@ -622,10 +628,8 @@
 	pop	ebx
 	pop	esi
 	pop	edi
 	pop	ebp
 	ret
-	.section	.text.unlikely,"x"
-LCOLDE0:
-	.text
-LHOTE0:
-	.ident	"GCC: (GNU) 5.3.1 20160211"
+_md5_compress ENDP
+_TEXT	ENDS
+END
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?