【问题标题】:Compare Signature of Wrapped Functions比较包装函数的签名
【发布时间】:2021-11-04 08:25:30
【问题描述】:

gcc 支持包装函数,因此调用的是包装函数而不是真正的函数。这种替换发生在链接器级别。

/* myfile.c */
int myF(int x);

int __wrap_myF(int x)
{
    return x + 1;
}

int main(int argc, char ** argv)
{
    return myF(5);
}

当我编译这个时

gcc -Wl,--wrap=myF myfile.c -o myfile.exe

并执行二进制,我得到返回值 5。

当我现在更改__wrap_myF() 的签名时,编译器/链接器无法识别。如果我按以下方式更改签名,我预计会出现错误或至少是警告:

int myF(int x);

int __wrap_myF(int x, int y)  /* <-- added a second parameter */
{
    return x + 1;
}

int main(int argc, char ** argv)
{
    return myF(5);
}

如果包装函数签名不等同于包装函数签名,gcc 是否会自动抛出错误?

是否有一些 gcc 扩展,允许比较两个函数的签名?

_Static_assert(__builtin_signature(myF) == __builtin_signature(__wrap_myF), "failure")

如果有 C 标准方式,我会很感激,但我强烈怀疑这一点。

提前致谢。

【问题讨论】:

    标签: gcc c99


    【解决方案1】:

    如果有C标准方式

    没有这样的方法。

    是否有一些 gcc 扩展,允许比较两个函数的签名?

    _Static_assert(
       __builtin_types_compatible_p(
            __typeof__(&myF), __typeof__(&__wrap_myF)
       ), "failure");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      • 2020-03-31
      • 2011-09-01
      • 2020-09-12
      • 1970-01-01
      • 2014-07-17
      相关资源
      最近更新 更多