it-swarm-es.tech

¿Cómo puedo saber qué archivo unistd.h está cargado?

Yo tengo varias unistd.h archivos en mi Ubuntu Linux. Tengo uno en /usr/include/asm/unistd.h. Este archivo tiene estas directivas:

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

En esa carpeta, puedo encontrar esos archivos (unistd_32.h y unistd_64.h).

Pero en /usr/src/linux-headers-2.6.31-22/include/asm-generic/ hay otro unistd.h que comienza con estas directivas:

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

Entonces, la pregunta es: ¿Cómo puedo saber cuál está cargado? ¿Hay alguna forma de verificarlo en tiempo de ejecución con Java?

11
santiago.basulto

Las reglas exactas que sigue el compilador gcc para encontrar archivos de inclusión se explican en: http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

Un truco rápido de línea de comandos para averiguar de dónde proviene un archivo de inclusión es el siguiente:1

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

Entonces, si miras el unistd.preprocessed archivo, verá líneas como:

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

Estos te dicen que el siguiente bloque de líneas (hasta el próximo # number ... línea) proceden del archivo /usr/include/unistd.h.

Por lo tanto, si desea conocer la lista completa de archivos incluidos, puede grep para # number líneas:

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

En mi sistema Ubuntu 10.04/gcc 4.4.3, esto produce:

$ 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 Nota: La ruta de búsqueda para los archivos de inclusión es modificada por -I opción de línea de comandos; por lo tanto, debe agregar cualquier -I path argumentos a la invocación gcc. Además, si está compilando una fuente C++, debe sustituir -x c con -x c++.

12
Riccardo Murri