3

edk2 (UEFI) を使用する場合、memcpy や memset などの機能は使用できませんが、CopyMem および SetMem の機能があります。通常、これはそれほど問題ではありませんが、コンパイラがコードを memcpy/memset に置き換える最適化を行う場合があり、それらへの未解決の参照があるというリンカ エラーが発生します。私が知る限り、それらは本質的に同じように使用されます(同じ引数など)。

インスタンスが発生したときに個別に処理するのではなく、これを修正するにはどうすればよいか考えていました。コンパイラ マクロをグーグルで検索してみましたが、それが適切な方法であるかどうかを確認するための良い例が見つかりませんでした。

4

3 に答える 3

1

回避策として、転送ラッパーを作成します。

void* memcpy(void *dest, const void *src, size_t n) {
    return CopyMem(dest, src, n);
}
于 2013-04-22T19:31:21.270 に答える
1

コンパイラが最適化プロセスの一部としてmemcpy()andを挿入する場合、マクロを使用して達成できることは何もありません。あなたの可能性は次のとおりです。memset()

I. リンカ エラーがなくなるまで、個別のケースごとに最適化レベルを徐々に下げます。

Ⅱ.準拠する標準ライブラリに切り替える

III. 手動で実装memcpy()memset()ます。

于 2013-04-22T18:06:16.303 に答える
1

GCC を使用している場合は、

memcpy()フラグを使用して、の導入を無効にすることができます-fno-builtin

__REDIRECTマクロの使用も機能する場合があります (in sys/cdefs.h) :

__REDIRECT (memcpy, (void *dest, const void *src, size_t n), CopyMem);
于 2013-04-22T19:09:45.700 に答える