So I was looking through the linux glibc source and I don\'t see where it actually does anything. The following is from io/chdir.c
but it is indicative of many
That's a generic stub that is used if another definition doesn't exist; weak_alias
is a cpp
macro which tells the linker that __chdir
should be used when chdir
is requested, but only if no other definition is found. (See weak symbols for more details.)
chdir
is actually a system call; there will be per-OS system call bindings in the gibc
source tree, which will override the stub definition with a real one that calls into the kernel. This allows glibc
to present a stable interface across systems which may not have all of the system calls that glibc
knows about.
What you've found is a stub function for systems it's not implemented on. You need to look under the sysdeps
tree for the actual implementation. The following may be of interest:
sysdeps/unix/sysv/linux
sysdeps/posix
sysdeps/i386
(or x86_64
or whatever your cpu arch is)The actual system call code for chdir()
is auto-generated on most systems supported by glibc
, by the script make-syscalls.sh. That's why you can't find it in the source tree.
Note that the actual system calls aren't defined anywhere in the source tree - they're generated at build time from syscalls.list (linked is the one in sysdeps/unix, there are additional ones further down), a series of macros in sysdep.h (linked linux/i386), and a script that actually generates the source files.