使用 edk2 (UEFI) 时,memcpy 和 memset 等功能不可用,但它们具有 CopyMem 和 SetMem 功能。通常这不是什么大问题,但有时编译器会进行优化,用 memcpy/memset 替换我的代码,我得到链接器错误,说我对它们有未解决的引用。据我所知,它们的使用基本相同(相同的参数和诸如此类的东西)。
我想知道有什么方法可以解决这个问题,而不是在实例发生时单独处理它们。我尝试使用谷歌搜索编译器宏,但我找不到一个很好的例子来看看它是否是一个很好的方法。
使用 edk2 (UEFI) 时,memcpy 和 memset 等功能不可用,但它们具有 CopyMem 和 SetMem 功能。通常这不是什么大问题,但有时编译器会进行优化,用 memcpy/memset 替换我的代码,我得到链接器错误,说我对它们有未解决的引用。据我所知,它们的使用基本相同(相同的参数和诸如此类的东西)。
我想知道有什么方法可以解决这个问题,而不是在实例发生时单独处理它们。我尝试使用谷歌搜索编译器宏,但我找不到一个很好的例子来看看它是否是一个很好的方法。
如果编译器插入memcpy()
并memset()
作为优化过程的一部分,那么使用宏无法实现任何目标。你的机会是:
I. 在每种情况下逐渐降低优化级别,直到链接器错误消失。
二、切换到符合标准的库
三、实施memcpy()
和memset()
手动。
如果你使用 GCC,
memcpy()
您可以使用标志禁用引入-fno-builtin
。
使用__REDIRECT
宏也可以工作(在sys/cdefs.h
):
__REDIRECT (memcpy, (void *dest, const void *src, size_t n), CopyMem);
作为一种解决方法,创建转发包装器:
void* memcpy(void *dest, const void *src, size_t n) {
return CopyMem(dest, src, n);
}