どのunistd.hファイルがロードされているかを知るにはどうすればよいですか?


11

unistd.hUbuntu Linuxにいくつかのファイルがあります。私は1つにしてい/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
質問の後半がわかりませんunistd.h。Cヘッダーファイルです。それはJavaと何をしているのですか?
Riccardo Murri

@Riccardoそのファイルで定義されているシステムコールをいくつか実行したいと思います。
santiago.basulto 2010

@ user1531ヘッダーファイルはコンパイルの最初のステップとして含まれるため、実行時に必要ありません(コンパイラーや開発環境がインストールされていないシステムでコードを実行できます)。JavaからC関数を呼び出すことは、まったく別の質問のトピックです-あなたはすでに質問したようです:-)
Riccardo Murri

回答:


12

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 ...行まで)がfileからのものであることを示しています/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++ます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.