链接器如何知道与系统调用链接的内容?

时间:2013-03-18 07:02:53

标签: linux compiler-construction linker epoll

当我尝试在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。所以我尝试编译this example epoll program以检查它是否有效。

在我的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是对内核的系统调用。链接器搜索哪个文件以确定该系统调用的实现?

感谢。

1 个答案:

答案 0 :(得分: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函数。