我有一个关于 glibc 函数调用的问题。是否有标志告诉 gcc 不要内联某个 glibc 函数,例如内存?
我试过 -fno-builtin-memcpy 和其他标志,但它们没有用。目标是调用实际的 glibc memcpy 函数并且没有内联代码(因为编译时的 glibc 版本与运行时的版本不同)。它仅用于测试目的。通常我不会那样做。
有什么解决办法吗?
更新:
只是为了更清楚:在过去,memcpy 甚至可以处理重叠区域。这同时发生了变化,我可以在使用不同的 glibc 版本进行编译时看到这种变化。所以现在我想测试我的旧代码(在应该使用 memmove 的地方使用 memcpy)在具有更新的 glibc(例如 2.14)的系统上是否正常工作。但为此,我必须确保调用了新的 memcpy 并且没有内联代码。
最好的问候
最佳答案
这可能不是您要查找的内容,但它似乎强制 gcc 生成对 memcpy()
的间接调用:
#include <stdio.h>
#include <string.h>
#include <time.h>
// void *memcpy(void *dest, const void *src, size_t n)
unsigned int x = 0xdeadbeef;
unsigned int y;
int main(void) {
void *(*memcpy_ptr)(void *, const void *, size_t) = memcpy;
if (time(NULL) == 1) {
memcpy_ptr = NULL;
}
memcpy_ptr(&y, &x, sizeof y);
printf("y = 0x%x\n", y);
return 0;
}
生成的程序集(gcc、Ubuntu、x86)包含一个call *%edx
指令。
如果没有 if (time(NULL) == 1)
测试(永远不会成功,但编译器不知道),gcc -O3
是足够聪明地认识到间接调用总是调用 memcpy()
,然后可以将其替换为 movl
指令。
请注意,编译器可以识别如果memcpy_ptr == NULL
则行为未定义,并再次用直接调用替换间接调用,然后用movl
指令。带有 -O3
的 gcc 4.5.2 似乎没有那么聪明。如果是更高版本的 gcc
,您可以将 memcpy_ptr = NULL
替换为一些行为不同于 memcpy()
的实际函数的赋值.
关于c - glibc - 强制函数调用(无内联扩展),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9004185/