这是我浏览的源码:glibc source。我的特殊问题源于这组特殊的函数:socket library。
例如(大多数函数都是这样设置的)socket/bind.c的源代码是:
19 #include <errno.h>
20 #include <sys/socket.h>
21
22 /* Give the socket FD the local address ADDR (which is LEN bytes long). */
23 int
24 __bind (fd, addr, len)
25 int fd;
26 __CONST_SOCKADDR_ARG addr;
27 socklen_t len;
28 {
29 __set_errno (ENOSYS);
30 return -1;
31 }
32
33 weak_alias (__bind, bind)
34
35 stub_warning (bind)
36 #include <stub-tag.h>我承认我没有花很多时间,但是实际函数的代码到底在哪里,发生了什么?这是一个使用得很好的范例吗?
发布于 2013-02-15 03:36:40
__bind函数是一个stub:它的外观看起来像真实的东西(相同的原型),但不执行必需的函数。
weak_alias宏告诉链接器bind将成为__bind的弱别名。也就是说,bind的这个定义是一个weak symbol。如果没有名为bind的符号的其他定义,则此定义成立;如果存在bind的另一个(非弱)定义,则非弱定义成立,弱定义将被忽略。弱别名是一种弱符号,它是另一个符号的别名(与其本身具有定义相反)。如果使用该弱别名,则stub_warning宏会使链接器发出警告。
bind的真正实现取决于编译时所针对的操作系统。在Hurd上,它在sysdeps/mach/hurd/bind.c中定义。在Linux上,bind是一个系统调用: Glibc源代码中没有对应的C代码,只有汇编代码。bind是在sysdeps/unix/sysv/linux/bind.S中提供的,它在sysdeps/unix/sysv/linux/**/socket.S或ports/sysdeps/unix/sysv/linux/*/socket.S中重用了依赖于体系结构的socket定义。这些定义都是对底层系统调用的简单包装,小心地将参数和返回值复制到适当的寄存器中。
发布于 2013-02-15 03:19:22
您看到的是一般的bind()实现,它...只是告诉您bind()没有实现(它只是返回一个错误,并将errno设置为ENOSYS - syscall not implemented。)。
glibc中的许多与平台相关的系统调用都是这样工作的--有一个默认的实现只返回一个错误,并且每个平台/架构器都必须提供系统调用的实现。
例如,在/sysdeps/unix/sysv/ linux /i386/socket.s中查找linux x86实现。
当然,socket()只是一个系统调用,所以实际的实现在内核中。Glibc只是提供了一个C包装器来调用它。
https://stackoverflow.com/questions/14882289
复制相似问题