その2の続き

細かいことは置いといて、とりあえず一番簡単な条件を試してみましょう。処理系は以下の通り。

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

Cygwin 側(Cygwin Terminal)で、

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

int __stdcall func_stdcall(int x, int y, int z)
{
        return x + y * z;
}

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

int __cdecl func_cdecl(int x, int y, int z);
int __stdcall func_stdcall(int x, int y, int z);

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

umezawa@selene ~$ gcc -o callee_gcc.obj -c callee.c

Visual C++ 側(VS2015 x86 Native Tools コマンドプロンプト)で、

C:\cygwin\home\umezawa>cl /Fea.exe main.c callee_gcc.obj
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86
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:\cygwin\home\umezawa>a.exe
10
14

これで以下のことが分かります。

  • 32bit で cdecl/stdcall の場合、呼び出し規約に互換性がある(正確なことを言うと、上記の例では CPU レジスタを使い尽くしていないため、どのレジスタを破壊しても良いかに関する互換性を確認できていない)
  • 32bit で C の場合、名前修飾に互換性がある
  • 32bit の場合、GCC が出力したオブジェクトファイルは Visual C++ (に含まれるリンカ)が読むことができる

せっかくだからスタティックライブラリも作ってみましょう。

umezawa@selene ~$ cat callee2_a.c
int foo(int x)
{
        return x * 2;
}

umezawa@selene ~$ cat callee2_b.c
int bar(int x)
{
        return x + 3;
}

umezawa@selene ~$ cat callee2_c.c
int baz(int x)
{
        return x - 4;
}

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

int foo(int x);
int bar(int x);
int baz(int x);

int main(void)
{
        printf("%d\n", foo(10));
        printf("%d\n", bar(10));
        printf("%d\n", baz(10));
        return 0;
}

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:\cygwin\home\umezawa>cl /Fea2.exe main2.c callee2.lib
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86
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:\cygwin\home\umezawa>a2
20
13
6
  • 32bit の場合、GCC が出力したオブジェクトファイルを ar コマンドに食わせて作ったスタティックライブラリは Visual C++ (に含まれるリンカ)が読むことができる

構造体のメンバの配置についてはめんどくさい(真面目にやると調べなければいけないケースが多すぎる上に自分はその情報を必要としていない)ので省略。

その4に続く。

Trackback

only 1 comment untill now

  1. Windows 上での Visual C++ と GCC/Clang の相互運用(その4)

    その3の続き その3ではリンクを Visual C++ 側で行いましたが、GCC 側でも行ってみます。 C:\cygwin\home\umezawa>cl /Focallee_vc.o /c callee.c Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86 Copyrig…

Add your comment now