その6の続き

今までずっと x86 を試していましたが、 x64 ではどうでしょうか。


処理系は以下のようになります。

  • Windows 7 64bit
  • Visual Studio 2015 / MS-C for x64
  • Cygwin 64bit + gcc-core 5.4.0-1

32bit の Cygwin にも x64 向けのバイナリを出力するクロスビルド環境はありますが、ここでは 64bit 版を使っています。

x64 では呼び出し規約は1つしかないっぽいので、以前の検証で使った callee.c を以下のように修正します。

umezawa@selene ~$ cat callee.c
int func(int x, int y, int z)
{
        return x * y + z;
}

umezawa@selene ~$ cat main.c
#include <stdio.h>

int func(int x, int y, int z);

int main(void)
{
        printf("%d\n", func(2, 3, 4));
        return 0;
}

umezawa@selene ~$ gcc -o callee_gcc.obj -c callee.c
C:\cygwin64\home\umezawa>cl /Fea.exe main.c callee_gcc.obj
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

main.c
Microsoft (R) Incremental Linker Version 14.00.24215.1
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:a.exe
main.obj
callee_gcc.obj

C:\cygwin64\home\umezawa>a.exe
10
umezawa@selene ~$ gcc -o callee2_a_gcc.o -c callee2_a.c

umezawa@selene ~$ gcc -o callee2_b_gcc.o -c callee2_b.c

umezawa@selene ~$ gcc -o callee2_c_gcc.o -c callee2_c.c

umezawa@selene ~$ ar cru callee2.lib callee2_*_gcc.o
C:\cygwin64\home\umezawa>cl /Fea2.exe main2.c callee2.lib
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

main2.c
Microsoft (R) Incremental Linker Version 14.00.24215.1
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:a2.exe
main2.obj
callee2.lib

C:\cygwin64\home\umezawa>a2
20
13
6
c:\cygwin64\home\umezawa>cl /Focallee_vc_2.o /Zl /c callee.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

callee.c
umezawa@selene ~$ gcc -o a3 main.c callee_vc_2.o

umezawa@selene ~$ ./a3
10
14
C:\cygwin64\home\umezawa>cl /Focallee2_a_vc.o /Zl /c callee2_a.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

callee2_a.c

C:\cygwin64\home\umezawa>cl /Focallee2_b_vc.o /Zl /c callee2_b.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

callee2_b.c

C:\cygwin64\home\umezawa>cl /Focallee2_c_vc.o /Zl /c callee2_c.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

callee2_c.c

c:\cygwin64\home\umezawa>lib /OUT:callee2_vc.a callee2_a_vc.o callee2_b_vc.o callee2_c_vc.o
Microsoft (R) Library Manager Version 14.00.24215.1
Copyright (C) Microsoft Corporation.  All rights reserved.

umezawa@selene ~$ gcc -o a4 main2.c callee2_vc.a

umezawa@selene ~$ ./a4
20
13
6

というわけで大丈夫なようです。

その8に続く。

Trackback

no comment untill now

Add your comment now