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

标签 c gcc inline glibc

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

相关文章:

c - C Vaxocentrist 中数组的 memcpy 是什么?

c - 在 Mac OS X 上组装和链接 gcc 生成的程序集

c - 使用 uint64_t 32 位和 64 位架构中的结构填充差异

c++ - 一条定义规则 : Can corresponding entities have different names?

c++ - C4711 "function selected for inline expansion"Visual C++ 警告有什么用?

c++ - const 是谎言吗? (因为 const 可以被抛弃)

c - 将 int 转换为 void* 或相反是什么意思?

c# - .NET 3.5 及更低版本中内联的替代方案

c - Makefile - 在不进行任何更改的情况下编译库和可执行文件

gcc - 如何使用 GCC 5.1 和 OpenMP 将工作卸载到 Xeon Phi