Possible Duplicate:
Need help with glibc source
I understand how to implement our own system calls in linux kernel. I know we can call this with syscall()
or with _asm()
in a c program.
But I want to understand how to write glibc api for this new system call?.
How the
open()
andread()
glibc function calls mapping into system call in kernel?.char message[ ] = "Hello!\n"; int main( void ) { write( 1, message, 7 ); exit( 0 ); }
When I convert the above program into assembly it is giving
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $20, %esp
movl $7, 8(%esp)
movl $message, 4(%esp)
movl $1, (%esp)
call write
movl $0, (%esp)
call exit
.size main, .-main
.ident "GCC: (Debian 4.3.2-1.1) 4.3.2"
.section .note.GNU-stack,"",@progbits
~
3, In "call write" I think write is glibc call here ?. what happens after that? how it maps the glibc call to system call?
See e.g. this answer and that answer to similar questions. Read also more about syscalls, the linux kernel, an overview of linux syscalls, and the assembly howto
The
write
function from glibc is not the true syscall. It is a wrapper (doing the sycall thru e.g.sysenter
machine instruction, perhaps with the VDSO, and settingerrno
). You can usestrace
to understand the system calls done by some program.For example, the MUSL libc has this write.c implementation for
write
. For GNU libc, look at its write.c.