9.3 RVCT v3.1 と RVCT v4.0 の間でのシンボルの可視性の変更点

RVCT v4.0 ではシンボル可視性が変更されています。

シンボルの可視性については、以下の点が変更されています。

__declspec(dllexport) を表すために使用される ELF 可視性の変更点

デフォルトの --hide_all コンパイラコマンドラインオプションを使う場合、RVCT v3.1 以前では、__declspec(dllexport) を表す ELF 可視性は STV_DEFAULT でした。RVCT v4.0 では、STV_PROTECTED です。STV_PROTECTED であるシンボルは、他の DLL から参照できますが、ロード時にそれらをプリエンプティブにすることはできません。

--no_hide_all コマンドラインオプションを使っている場合、インポートまたはエクスポートされたシンボルの可視性は、RVCT v3.1 の場合と同様に、STV_DEFAULT のままです。

__attribute(visibility(…))

GNU 形式の __attribute(visibility(…)) が追加され、--gnu コンパイラコマンドラインオプションが指定されていない場合でも使用できます。これを使用すると、暗黙的な可視性はすべてオーバーライドされます。例えば、次の場合、可視性は STV_HIDDEN ではなく STV_DEFAULT になります。

    __declspec(visibilty("default")) int x = 42;

RVCT v3.1 でのシンボルの可視性の一覧

次の表は、RVCT v3.1 での可視性の規則の一覧です。

表 9-1 RVCT v3.1 でのシンボルの可視性の一覧

コード --hide_all(デフォルト) --no_hide_all --dllexport_all

extern int x;

extern int g(void);

STV_HIDDEN STV_DEFAULT STV_HIDDEN

extern int y = 42;

extern int f() { return g() + x; }

STV_HIDDEN STV_DEFAULT STV_DEFAULT

__declspec(dllimport) extern int imx;

__declspec(dllimport) extern int img(void);

STV_DEFAULT STV_DEFAULT STV_DEFAULT

__declspec(dllexport) extern int exy = 42;

__declspec(dllexport) extern int exf() { return img() + imx; }

STV_DEFAULT STV_DEFAULT STV_DEFAULT

/* 未定義のエクスポート(異常?)*/

__declspec(dllexport) extern int exz;

__declspec(dllexport) extern int exh(void);

STV_HIDDEN STV_HIDDEN STV_HIDDEN

表 9-2 RVCT v3.1 での実行時関数への参照に関するシンボルの可視性の一覧

コード

--no_dllimport_runtime

--hide_all(デフォルト)

--no_hide_all --dllexport_all

/* 実行時関数への参照

例:__aeabi_fmul */

float fn(float a, float b) { return a*b; }

STV_HIDDEN STV_DEFAULT STV_DEFAULT

RVCT v4.0 でのシンボルの可視性の一覧

次の表は、RVCT v4.0 での可視性の規則の一覧です。

表 9-3 RVCT v4.0 でのシンボルの可視性の一覧

コード --hide_all(デフォルト) --no_hide_all --dllexport_all

extern int x;

extern int g(void);

STV_HIDDEN STV_DEFAULT STV_HIDDEN

extern int y = 42;

extern int f() { return g() + x; }

STV_HIDDEN STV_DEFAULT STV_PROTECTED

__declspec(dllimport) extern int imx;

__declspec(dllimport) extern int img(void);

STV_DEFAULT STV_DEFAULT STV_DEFAULT

__declspec(dllexport) extern int exy = 42;

__declspec(dllexport) extern int exf() { return img() + imx; }

STV_PROTECTED STV_PROTECTED STV_PROTECTED

/* 未定義のエクスポート(異常?)*/

__declspec(dllexport) extern int exz;

__declspec(dllexport) extern int exh(void);

STV_PROTECTED STV_PROTECTED STV_PROTECTED

表 9-4 RVCT v4.0 での実行時関数への参照に関するシンボルの可視性の一覧

コード

--no_dllimport_runtime

--hide_all(デフォルト)

--no_hide_all --dllexport_all

/* 実行時関数への参照

例:__aeabi_fmul */

float fn(float a, float b) { return a*b; }

STV_HIDDEN STV_DEFAULT STV_DEFAULT
関連する参考文書
9.2 RVCT v3.1 と RVCT v4.0 の間での全般的な変更点
関連情報
--default_definition_visibility=visibility コンパイラオプション
--dllexport_all, --no_dllexport_all コンパイラオプション
--dllimport_runtime, --no_dllimport_runtime コンパイラオプション
--gnu コンパイラオプション
--hide_all, --no_hide_all コンパイラオプション
非機密扱いPDF file icon PDF 版ARM DUI0530JJ
Copyright © 2010-2013 ARM.All rights reserved.