web-development-kb-pt.site

Como posso saber qual arquivo unistd.h está carregado?

Tenho vários unistd.h arquivos no meu Ubuntu Linux. Eu tenho um em /usr/include/asm/unistd.h. Este arquivo tem estas diretivas:

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

Nessa pasta, posso encontrar esses arquivos (unistd_32.h e unistd_64.h).

Mas em /usr/src/linux-headers-2.6.31-22/include/asm-generic/ há outro unistd.h que começa com estas diretivas:

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

Portanto, a questão é: Como posso saber qual está carregado? Existe alguma maneira de verificar isso em tempo de execução com Java?

11
santiago.basulto

As regras exatas seguidas pelo compilador gcc para localizar arquivos de inclusão são explicadas em: http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

Um truque rápido de linha de comando para descobrir de onde vem um arquivo de inclusão é o seguinte:1

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

Então, se você olhar para o unistd.preprocessed arquivo, você notará linhas como:

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

Eles informam que o seguinte bloco de linhas (até o próximo # number ... linha) vêm do arquivo /usr/include/unistd.h.

Então, se você quiser saber a lista completa de arquivos incluídos, você pode usar o grep para # number linhas:

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

No meu sistema Ubuntu 10.04/gcc 4.4.3, isso produz:

$ 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 Observação: O caminho de pesquisa para incluir arquivos é modificado pelo -I opção de linha de comando; então, você deve adicionar qualquer -I path argumentos para a invocação gcc. Além disso, se você estiver compilando uma fonte C++, você deve substituir -x c com -x c++.

12
Riccardo Murri