3

使用 edk2 (UEFI) 时,memcpy 和 memset 等功能不可用,但它们具有 CopyMem 和 SetMem 功能。通常这不是什么大问题,但有时编译器会进行优化,用 memcpy/memset 替换我的代码,我得到链接器错误,说我对它们有未解决的引用。据我所知,它们的使用基本相同(相同的参数和诸如此类的东西)。

我想知道有什么方法可以解决这个问题,而不是在实例发生时单独处理它们。我尝试使用谷歌搜索编译器宏,但我找不到一个很好的例子来看看它是否是一个很好的方法。

4

3 回答 3

1

如果编译器插入memcpy()memset()作为优化过程的一部分,那么使用宏无法实现任何目标。你的机会是:

I. 在每种情况下逐渐降低优化级别,直到链接器错误消失。

二、切换到符合标准的库

三、实施memcpy()memset()手动。

于 2013-04-22T18:06:16.303 回答
1

如果你使用 GCC,

memcpy()您可以使用标志禁用引入-fno-builtin

使用__REDIRECT宏也可以工作(在sys/cdefs.h):

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

作为一种解决方法,创建转发包装器:

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