The exact rules followed by the gcc compiler for finding include files are explained at: http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html
A quick command-line trick to find out where an include file comes from is the following:1
echo '#include <unistd.h>' | gcc -E -x c - > unistd.preprocessed
Then, if you look at the unistd.preprocessed file, you will notice lines like:
# 1 "/usr/include/unistd.h" <some numbers>
These tell you that the following block of lines (until the next # number ... line)
come from file /usr/include/unistd.h.
So, if you want to know the full list of files included, you can grep for the # number lines:
echo '#include <unistd.h>' | gcc -E -x c - | egrep '# [0-9]+ ' | awk '{print $3;}' | sort -u*emphasized text*
On my Ubuntu 10.04 / gcc 4.4.3 system, this produces:
$ echo '#include <unistd.h>' | gcc -E -x c - | egrep '# [0-9]+ ' | awk '{print $3;}' | sort -u
"<built-in>"
"<command-line>"
"<stdin>"
"/usr/include/bits/confname.h"
"/usr/include/bits/posix_opt.h"
"/usr/include/bits/predefs.h"
"/usr/include/bits/types.h"
"/usr/include/bits/typesizes.h"
"/usr/include/bits/wordsize.h"
"/usr/include/features.h"
"/usr/include/getopt.h"
"/usr/include/gnu/stubs-64.h"
"/usr/include/gnu/stubs.h"
"/usr/include/sys/cdefs.h"
"/usr/include/unistd.h"
"/usr/lib/gcc/x86_64-linux-gnu/4.4.3/include/stddef.h"
1 Note: The search path for include files is modified by
the -I command-line option; so, you should add any -I path
arguments to the gcc invocation. Also, if you are compiling a C++
source, you should substitute -x c with -x c++.