覆盖C库函数,调用原始函数

海德

我对此代码的工作方式和原因感到困惑。在我从事的任何项目中,我实际上都没有遇到过,甚至我自己也没有想到过。

overlay_getline.c:

#include <stdio.h>

#define OVERRIDE_GETLINE

#ifdef OVERRIDE_GETLINE
ssize_t getline(char **lineptr, size_t *n, FILE *stream)
{
    printf("getline &lineptr=%p &n=%p &stream=%p\n", lineptr, n, stream);
    return -1; // note: errno has undefined value
}
#endif

main.c:

#include <stdio.h>

int main()
{
    char *buf = NULL;
    size_t len = 0;
    printf("Hello World! %zd\n", getline(&buf, &len, stdin));
    return 0;
}

最后,示例编译并运行命令:

gcc main.c override_getline.c && ./a.out

使用OVERRIDE_GETLINEdefine时,将调用自定义函数,如果将其注释掉,则将调用普通库函数,并且两者均按预期工作。

问题

  1. 正确的术语是什么?“覆盖”,“阴影”,还有其他东西吗?

  2. 这是特定于gcc的,还是POSIX或ANSI C,甚至是完全未定义的?

  3. 如果函数是ANSI C函数或POSIX函数(如此处),有什么区别吗?

  4. 覆盖函数在哪里调用?.o至少由同一链接中的其他文件,并且我也假定.a文件也添加到链接命令中。如何-l通过链接器的命令行选项添加静态或动态库

  5. 如果可能,如何从覆盖的getline调用getline的库版本?

一些程序员哥们

链接器在库中搜索之前,将首先在命令行上搜索您提供的文件中的符号。这意味着,一旦看到getline已定义的内容,它将不再寻找其他getline符号。这就是链接器在所有平台上的工作方式。

当然,这对您的第五点有影响getline,因为从链接器的角度来看,您的功能原始功能,因此无法调用“原始”功能

对于第五点,您可能想看看例如这个旧答案

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从视图调用库函数(MVC C#)

来自分类Dev

从Visual Studio中的asm调用C标准库函数

来自分类Dev

获取对C库函数调用的LLVM IR的访问权限

来自分类Dev

使用C#调用按钮的自定义库函数

来自分类Dev

es6中的覆盖库函数

来自分类Dev

在C中模拟库函数

来自分类Dev

C库函数的实际实现

来自分类Dev

系统调用和库函数之间的区别

来自分类Dev

如何覆盖对模块函数的调用,然后在覆盖中引用该原始函数?

来自分类Dev

在C语言中,如何调用我的函数而不是系统库函数

来自分类Dev

C ++从基类派生调用覆盖的函数

来自分类Dev

如何使用原始名称为库函数创建包装器?

来自分类Dev

VBA - 调用覆盖函数

来自分类Dev

调用覆盖函数中覆盖的函数

来自分类Dev

从Qt C ++调用已编译的C库函数会产生意外行为

来自分类Dev

如何查看c库函数列表?

来自分类Dev

如何查看c库函数列表?

来自分类Dev

是否有返回 bool 的 C 库函数?

来自分类Dev

char concat C++ 无库函数

来自分类Dev

网页推送C#库函数

来自分类Dev

Linux AMD64从复制的程序集调用C库函数

来自分类Dev

如何在不使用C的库函数(使用read()系统调用)的文件中找到单词?

来自分类Dev

从浑浊的函数中调用原始函数

来自分类Dev

捕获库函数的输出

来自分类Dev

Python 库函数问题

来自分类Dev

使用实体框架6调用数据库函数

来自分类Dev

调用javascript库函数时出现JavaScript错误

来自分类Dev

如何在Go中调用linux共享库函数?

来自分类Dev

来自库函数的扭曲的客户端调用