どのunistd.hファイルがロードされたのか、どうすればわかりますか?

どのunistd.hファイルがロードされたのか、どうすればわかりますか?

unistd.h私のUbuntu Linuxにはいくつかのファイルがあります。/usr/include/asm/unistd.hファイルには次のディレクティブがあります。

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

unistd_32.hそのフォルダにこれらのファイル(および)を見つけることができますunistd_64.h

しかし、このディレクティブで始まる/usr/src/linux-headers-2.6.31-22/include/asm-generic/別のディレクティブがあります。unistd.h

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

だから質問は:どれがロードされたのか、どうすればわかりますか? Javaを使用して実行時にこれを確認する方法はありますか?

答え1

インクルードファイルを見つけるためにコンパイラが従う正確なルールについては、gcc以下に説明します。http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

インクルードファイルのソースを見つけるためのクイックコマンドラインのヒント:1

echo '#include <unistd.h>' | gcc -E -x c - > unistd.preprocessed

その後、ファイルを見ると、次のような行unistd.preprocessedが表示されます。

# 1 "/usr/include/unistd.h" <some numbers>

これは、次の行ブロック(次の# number ...行まで)がファイルから来たことを示します/usr/include/unistd.h

したがって、含まれているファイルの完全なリストを知りたい場合は、次の行# numberをgrepします。

echo '#include <unistd.h>' | gcc -E -x c - | egrep '# [0-9]+ ' | awk '{print $3;}' | sort -u*emphasized text*

私のUbuntu 10.04 / gcc 4.4.3システムでは、次のものが生成されます。

$ 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 メモ:-Iインクルードファイルの検索パスはコマンドラインオプションで変更されるため、呼び出し-I path に引数を追加する必要がありますgcc。また、C ++ソースコードをコンパイルする場合は、に-x c置き換える必要があります-x c++

関連情報