gpt4 book ai didi

c - glibc - 强制函数调用(无内联扩展)

转载 作者:太空宇宙 更新时间:2023-11-04 01:12:33 25 4
gpt4 key购买 nike

我有一个关于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com