10

I have several unistd.h files in my Ubuntu Linux. I've one on /usr/include/asm/unistd.h. This file has this directives:

# ifdef __i386__
#  include "unistd_32.h"
# else
#  include "unistd_64.h"
# endif

In that folder, I can find those files (unistd_32.h and unistd_64.h).

But in /usr/src/linux-headers-2.6.31-22/include/asm-generic/ there's another unistd.h that starts with this directives:

#if !defined(_ASM_GENERIC_UNISTD_H) || defined(__SYSCALL)
#define _ASM_GENERIC_UNISTD_H

So, the question is: How can I know which one is loaded? Is there any way to check it in runtime with Java?

  • 1
    I don't understand the second half of your question: unistd.h is a C header file; what has it got to do with Java? – Riccardo Murri Sep 7 '10 at 9:34
  • @Riccardo I would like to make some System Calls, that are defined in that file. – santiago.basulto Sep 7 '10 at 11:48
  • @user1531 Header files are included as the very first step of compilation, so they are not needed at runtime (you can run code on a system that has no compiler or development environment installed). Calling C functions from Java is a topic for an entirely different question - that you seem to have already asked :-) – Riccardo Murri Sep 7 '10 at 12:28
11

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++.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.