我有以下C程序:

#include <sys/stat.h>

int main(int argc, char **argv) {
    struct stat fileStat;
    if(stat(argv[1],&fileStat) < 0)
        return 1;
}

当我使用Clang将其编译为LLVM IR时,可以看到stat声明如下:
declare i32 @stat(i8*, %struct.stat*)

通常,对系统函数的此类外部调用直接映射到C标准库函数。例如,我可以使用以下内容找到malloc:
nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep malloc

但是,stat函数似乎被不同地对待。 grepping stat时,我可以找到相关功能,例如__xstat,但找不到stat函数本身。

当我使用ltrace将调用跟踪到外部库时,看到以下调用:__xstat(1, ".", 0x7fff7928c6f0)。可执行文件中的代码还确认,调用了stat函数,而不是调用__xstat函数。

我没有观察到对C标准库的其他函数调用,它们的名称不同于C程序中声明的名称。为什么标准库中没有直接等效项,我的编译器如何发现它应产生对__xstat而不是stat的调用?

最佳答案

标题sys/stat.hstat定义为在glibc中调用__xstat的宏:

#define stat(fname, buf) __xstat (_STAT_VER, fname, buf)

关于c - 我的编译器如何找到stat(文件状态)功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37276120/

10-13 08:17