gpt4 book ai didi

c - glibc 的 write 是如何工作的?

转载 作者:行者123 更新时间:2023-12-01 13:59:23 24 4
gpt4 key购买 nike

我试图编译一个名为 write 的简单程序与 -nostdlib ,但我得到了错误:

/path/to/file:3: undefined reference to `write'

我以为 write是一个 Unix 的东西并且总是在那里,但显然不是,结果 libc 有 write功能。我找到了源代码:
/* Write NBYTES of BUF to FD.  Return the number written, or -1.  */
ssize_t
__libc_write (int fd, const void *buf, size_t nbytes)
{
if (nbytes == 0)
return 0;
if (fd < 0)
{
__set_errno (EBADF);
return -1;
}
if (buf == NULL)
{
__set_errno (EINVAL);
return -1;
}

__set_errno (ENOSYS);
return -1;
}
libc_hidden_def (__libc_write)
stub_warning (write)

weak_alias (__libc_write, __write)
libc_hidden_weak (__write)
weak_alias (__libc_write, write)

所有这一切似乎都在设置 errno .怎么样 __libc_write写入文件描述符?

最佳答案

您对C有一些误解和 unix .

I thought write was a Unix thing



当然, writesyscall这是 POSIX 的一部分标准。 POSIX是与 unix 兼容的标准(一个非常古老的操作系统)。

这意味着系统调用名为 write存在于任何兼容 Unix 或 POSIX(如 Linux)的操作系统中。但是,如果您没有 C 标准库的实现(如 Linux 中的 glibc 或 Android 中的仿生) - 您将如何进行系统调用(即要求操作系统的内核做某事)?系统调用依赖于架构(SPARC、Intel、ARM、PowerPC 等将有不同的实现) - 并且由 C 标准库实现。如果您没有(例如,当您遵守 -nostdlib 时,您明确要求不要拥有 C 标准库)-您不能调用 write ,该函数不存在。但是,您可以使用程序集自己实现它。

您提供的代码适用于 __libc_write ,这与 write 不同.在 glibc 之间发生了一些巫术和 gcc在这里,与 stub 有关的东西我并不完全理解。

简单的实现是这样的:
ssize_t write(int fd, const void *buf, size_t count)
{
return __set_errno(syscall(__NR_write, fd, buf, count));
}

(在 bionic 中,Android 的 libc 实现,你可以在这里看到源代码 https://searchcode.com/codesearch/view/34924443/ - 看到它是在汇编中实现的)
syscall函数在 glibc 的汇编中实现(和其他任何地方): http://code.metager.de/source/xref/gnu/glibc/sysdeps/unix/sysv/linux/x86_64/syscall.S (适用于 x86_64)

但是,如果您真的必须知道 glibc 中发生了什么|当您调用 write - 有点复杂。据我了解,它叫 _IO_new_file_write (已实现 here )。 _IO_new_file_write使用 write_not_cancel宏定义 here这是 a macro for INLINE_SYSCALL (write, 3, fd, buf, len) , 即 the implementation用于调用系统调用并设置 errno。

关于c - glibc 的 write 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42633927/

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