Найти, какой файл использовался директивой включения - PullRequest
0 голосов
/ 20 февраля 2019

Есть ли способ получить абсолютный путь к файлу, читаемому директивой #include <hdr.h>?А для директивы #include "hdr.h"?Я работаю под Win 10 / Msys2.

Я хочу найти, какой stdint.h найден при компиляции src/sha1-git.c, так как:

  1. Он должен объявить uint32_t и, видимо, он этого не делает, в соответствии с тем, что я получаю с

    $ make -V=1
    
    /bin/sh ../../libtool  --tag=CC   --mode=compile gcc -DPACKAGE_NAME=\"aircrack-ng\" -DPACKAGE_TARNAME=\"aircrack-ng\" -DPACKAGE_VERSION=\"1.5.2\" -DPACKAGE_STRING=\"aircrack-ng\ 1.5.2\" -DPACKAGE_BUGREPORT=\"https://forum.aircrack-ng.org\" -DPACKAGE_URL=\"\" -DPACKAGE=\"aircrack-ng\" -DVERSION=\"1.5.2\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DLT_OBJDIR=\".libs/\" -D_REVISION=\"1.5.2\" -DHAVE_OPENSSL_CRYPTO_H=1 -DHAVE_OPENSSL_CMAC_H=1 -DHAVE_OPENSSL_CMAC_H=1 -DHAVE_SQLITE3_H=1 -DHAVE_SQLITE3=1 -DHAVE_SQLITE=1 -D_FILE_OFFSET_BITS=64 -DHAVE_PTHREAD_PRIO_INHERIT=1 -D_REENTRANT=1 -DHAVE___MINGW_ALIGNED_MALLOC=1 -DCACHELINE_SIZE=64 -DINTEL_ASM=1 -DCACHELINE_SIZE=64 -I.  -I../.. -I../../src/include -I../../src   -DCYGWIN -DMSYS2 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -D_FORTIFY_SOURCE=2 -pthread   -Wall -O3 -std=gnu99 -fno-strict-aliasing -Wpointer-arith -Wstrict-overflow=2 -Wstrict-prototypes -fvisibility=hidden -Wno-unused-but-set-variable -Wno-array-bounds  -mconsole -mwindows -DMSYS2 -MT libaircrack_crypto_la-sha1-git.lo -MD -MP -MF .deps/libaircrack_crypto_la-sha1-git.Tpo -c -o libaircrack_crypto_la-sha1-git.lo `test -f 'sha1-git.c' || echo './'`sha1-git.c
    libtool: compile:  gcc -DPACKAGE_NAME=\"aircrack-ng\" -DPACKAGE_TARNAME=\"aircrack-ng\" -DPACKAGE_VERSION=\"1.5.2\" "-DPACKAGE_STRING=\"aircrack-ng 1.5.2\"" -DPACKAGE_BUGREPORT=\"https://forum.aircrack-ng.org\" -DPACKAGE_URL=\"\" -DPACKAGE=\"aircrack-ng\" -DVERSION=\"1.5.2\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DLT_OBJDIR=\".libs/\" -D_REVISION=\"1.5.2\" -DHAVE_OPENSSL_CRYPTO_H=1 -DHAVE_OPENSSL_CMAC_H=1 -DHAVE_OPENSSL_CMAC_H=1 -DHAVE_SQLITE3_H=1 -DHAVE_SQLITE3=1 -DHAVE_SQLITE=1 -D_FILE_OFFSET_BITS=64 -DHAVE_PTHREAD_PRIO_INHERIT=1 -D_REENTRANT=1 -DHAVE___MINGW_ALIGNED_MALLOC=1 -DCACHELINE_SIZE=64 -DINTEL_ASM=1 -DCACHELINE_SIZE=64 -I. -I../.. -I../../src/include -I../../src -DCYGWIN -DMSYS2 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -D_FORTIFY_SOURCE=2 -pthread -Wall -O3 -std=gnu99 -fno-strict-aliasing -Wpointer-arith -Wstrict-overflow=2 -Wstrict-prototypes -fvisibility=hidden -Wno-unused-but-set-variable -Wno-array-bounds -mconsole -mwindows -DMSYS2 -MT libaircrack_crypto_la-sha1-git.lo -MD -MP -MF .deps/libaircrack_crypto_la-sha1-git.Tpo -c sha1-git.c  -DDLL_EXPORT -DPIC -o .libs/libaircrack_crypto_la-sha1-git.o
    sha1-git.c: In function 'blk_SHA1_Final':
    sha1-git.c:328:21: error: 'uint32_t' undeclared (first use in this function); did you mean 'wint_t'?
      padlen[0] = htonl((uint32_t)(ctx->size >> 29));
    

РЕДАКТИРОВАТЬ

В дереве подкаталогов моего Msys2 довольно много stdint.h в качестве кандидатов.Я должен быть в состоянии отследить "от руки", что stdint.h включено, проверяя командную строку компиляции, перечислены каталоги порядка и т. Д., И я делал это несколько раз раньше.Но я хочу сделать это автоматически, чтобы избежать ошибок.

PS: Поскольку я нахожусь под Msys2, я изменил (рекурсивно) все вхождения #include <arpa/inet.h> на #include <winsock.h> в src/*.h и src/*.c.В файле src/sha1-git.c я добавил #include <stdint.h> сразу после этого (вставив строку 43), чтобы получить uint32_t.

PS2: Был еще один файл src/aircrack-crypto/sha1-git.c, в котором не было #include <stdint.h>.Компиляция этого файла была проблемой.Я добавил #include ... в этот другой файл, и компиляция продолжилась .

PS3: я хочу сделать эту работу, так что, возможно, ответ на этот конкретный ОП - только один шаг вперед к цели, нонедостаточно ... РЕДАКТИРОВАТЬ 2 Подтверждено.После выполнения make V=1 CFLAGS="-I/usr/include" LDFLAGS="-L/usr/lib" (в противном случае sys/wait.h не было обнаружено при компиляции common.c), я получил

.../MSYS2Portable/App/msys32/mingw64/x86_64-w64-mingw32/include/winsock.h:309:34: error: conflicting types for 'gethostname'                                                                                                                                                                       
   WINSOCK_API_LINKAGE int WSAAPI gethostname(char *name,int namelen);                                                                                                    
                                  ^~~~~~~~~~~                                                                                                                             
In file included from .../MSYS2Portable/App/msys32/usr/include/unistd.h:4,                                               
                 from common.c:42:                                                                                                                                        
.../MSYS2Portable/App/msys32/usr/include/sys/unistd.h:300:6: note: previous declaration of 'gethostname' was here        
  int gethostname (char *__name, size_t __len);                                                                                                                           
      ^~~~~~~~~~~                                                                                                                                                         
make[2]: *** [Makefile:713: libaircrack_util_la-common.lo] Error 1                                                                                                        

Кажется, файлы в mingw64/x86_64-w64-mingw32/include не соответствуют файлам в usr/include.И нет sys/wait.h в mingw64/x86_64-w64-mingw32/include, поэтому я должен также добавить usr/include в путь поиска, что вызывает у меня проблемы.

Я бы скорее всего отказался от компиляции под Msys2, и я бы получилVBox.

1 Ответ

0 голосов
/ 20 февраля 2019

Перенос материала из комментариев в ответ и его расширение.

При использовании GCC опция -H отображает включенные заголовки, с указанием уровня вложенности.,Вам нужно указать, какой компилятор вы используете;то, что работает для GCC, вероятно, будет работать для Clang, но, вероятно, не будет работать для других компиляторов.

Поскольку вы используете автоконфискованный проект и GCC, у вас есть как минимум два варианта получения информации дляопределенный файл.

  1. Широкое - не определено:

    ./configure CC='gcc -H'
    

    Это устанавливает компилятор C на gcc -H, что будет шумно.В любом случае это может быть целесообразно, но, возможно, только в том случае, если проблема возникнет на этапе настройки (если только не будут применены предостережения в следующей опции).

  2. Узкопрофильный файл:

    make …normal options…   CC='gcc -H' problemchild.o
    

    Устанавливает для компилятора C значение gcc -H во время компиляции дочернего исходного файла конкретной проблемы.Это может быть труднее достичь, чем вы ожидаете, если вы имеете дело с проектом с исходным кодом в нескольких каталогах, или если источник находится в одном каталоге, а объектный код в другом, или некоторые другие варианты, которые создаютсистемы используют.

В любом случае, или используя любой вариант, ключевая часть идеи заключается в том, что вы сообщаете системе, что имя вашего компилятора gcc -H, а не gcc.Обычно это можно заставить работать.Иногда система будет использовать имя макроса Make, отличное от CC, для компилятора C (и имя макроса, используемое для компилятора C ++, также может отличаться).В этом случае вам нужно найти имя, которое оно использует (например, обычно работает ./configure CC=/opt/gcc/bin/gcc, но вам, возможно, потребуется найти, где используется /opt/gcc/bin/gcc, и, соответственно, подойти к make-файлу (файлам).

Прекратите использовать опцию -H, как только сможете. Она выдает обильный вывод на больших системах. Это может быть несколько сотен строк заголовка в сборках, которые я делаю, например. Однако использование может быть весьма информативным.

...