咨询一个问题,关于linux下glib2.22中unlinkat函数的定义
我想咨询这样一个问题:
在我的linux Fedors 23上,内核是4.2.3,glic是2.22
[test@localhost glibc-2.22-build]$ uname -a
Linux localhost 4.2.3-300.fc23.x86_64 #1 SMP Mon Oct 5 15:42:54 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[test@localhost glibc-2.22-build]$ rpm -qa | grep -i glibc
glibc-devel-2.22-18.fc23.x86_64
glibc-2.22-18.fc23.x86_64
glibc-common-2.22-18.fc23.x86_64
glibc-2.22-18.fc23.i686
glibc-headers-2.22-18.fc23.x86_64
glibc-static-2.22-18.fc23.x86_64
如果man unlinkat,返回的内容如下:
UNLINK(2) Linux Programmer's Manual UNLINK(2)
NAME
unlink, unlinkat - delete a name and possibly the file it refers to
SYNOPSIS
#include <unistd.h>
int unlink(const char *pathname);
#include <fcntl.h> /* Definition of AT_* constants */
#include <unistd.h>
int unlinkat(int dirfd, const char *pathname, int flags);
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
unlinkat():
Since glibc 2.10:
_XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
Before glibc 2.10:
_ATFILE_SOURCE
unlinkat()
The unlinkat() system call operates in exactly the same way as either unlink() or rmdir(2) (depending on
whether or not flags includes the AT_REMOVEDIR flag) except for the differences described here.
VERSIONS
unlinkat() was added to Linux in kernel 2.6.16; library support was added to glibc in version 2.4.
可以看到,按照man说明,在glib2.4中才有了unlinkat的库函数,那么,为什么我的fedora 23上man unlinkat在开头就可以看到unlinkat的说明了呢?
继续写一个简单的c程序测试一下能否用,
[test@localhost 1707]$ cat 4.c
#include <unistd.h>
main(){
unlinkat(10,"test",1);
}
[test@localhost 1707]$ gcc -o 4 4.c
4.c:2:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
main(){
^
[songkun@localhost 1707]$
可以看到,是编译成功的。 下载了fedora 23对应的glibc srpm包,解压以后,手动./configure,make,
结果如下:
[test@localhost glibc-2.22-build]$ pwd
/home/test/OS/A.7/glibc-2.22-18/glibc-2.22-build
用find找了一下,发现其实是编译出了unlinkat的目标文件的,
[songkun@localhost glibc-2.22-build]$ find . -name unlinkat*
./io/unlinkat.os.d
./io/unlinkat.os
./io/unlinkat.o.d
./io/unlinkat.o
用objdump看一下编译出来的目标文件,发现内容如下,
[songkun@localhost glibc-2.22-build]$ objdump -d ./io/unlinkat.o
./io/unlinkat.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <unlinkat>:
0: b8 07 01 00 00 mov $0x107,%eax
5: 0f 05 syscall
7: 48 3d 01 f0 ff ff cmp $0xfffffffffffff001,%rax
d: 0f 83 00 00 00 00 jae 13 <unlinkat+0x13>
13: c3 retq
这不是与man中“ library support was added to glibc in version 2.4”矛盾了么。
其实,我想问的是,如果在glibc-2.22中没有unlinkat这个库函数,那么coreutils中的rm实现对unlinkat的调用,不是就没法真正调用了么? 想的糊涂了,请大大们帮忙清晰一下,多谢