1

当我试图在 RHEL 5.5 服务器上手动编译 squid 时,运行configure并得到

configure: WARNING: Eep!  Cannot find epoll, kqueue, /dev/poll, poll or select!
configure: WARNING: Will try select and hope for the best.
configure: Using select for the IO loop.

看起来内核没有配置CONFIG_EPOLL. 所以我尝试编译这个示例 epoll 程序来检查它是否有效。

在我的 gentoo 机器上(CONFIG_EPOLL已启用。),它的编译没有任何问题。

在服务器上,我得到了

/tmp/cc8PhJh0.o: In function 'main':
epoll-exmaple.c:(.text+0x262): undefined reference to 'epoll_create1'
collect2: ld returned 1 exit status

我们都知道 c 程序编译器在 *.h 文件中查找定义,链接器将它们与 *.so 文件链接。

我的问题是,epoll_create1是对内核的系统调用。链接器究竟搜索哪个文件来定位该系统调用的实现?

谢谢。

4

1 回答 1

2

它在系统 C 库中查找(通常;少数系统调用在其他特殊库中,如 librt)。C 库为处理系统调用的用户空间程序提供了一个 C API。有时这可能是系统调用的一个非常薄的包装器,它只负责设置和返回参数,但更常见的是,它具有您不想担心的各种粘合,例如数据大小之间的差异用户空间和内核、不同架构的实现差异、内核系统调用 API 更改的向后或向前兼容性等等。

% readelf -s /lib/i386-linux-gnu/libc.so.6 | grep epoll_create1
  1837: 000d5280    52 FUNC    GLOBAL DEFAULT   12 epoll_create1@@GLIBC_2.9

如果您查看上面的 C 库,您可以看到链接器链接代码所针对的 C 函数。

于 2013-03-18T07:16:53.010 回答