#c #makefile #openssl #frama-c
#c #makefile #openssl #frama-c
Вопрос:
Я работаю над исследовательским проектом, который просит меня сгенерировать графики зависимостей программы точек ввода пользовательских данных OpenSSL (основные файлы с подключенными вызовами функций). Я использую frama-c из-за простоты использования. В идеале я хотел бы в основном запускать, например, frama-c -pdg -pdg-dot graph -pdg-print some_function_with_main.c, но я получаю ошибки из-за отсутствия файлов и функций, созданных при создании во время выполнения «make install». Я загрузил исходный код, и я могу успешно «выполнить установку» OpenSSL в Ubuntu 16.04.1 LTS, но в операции «выполнить установку» происходит много операций. Есть ли способ, которым я могу просто сгенерировать компилируемую версию OpenSSL на языке C без необходимости обратного проектирования файлов make и исходных файлов?
— Дополнительная информация —
Я понял, посмотрев, что «make» повторил утверждения, одобренные.I файлы. Пример показан ниже
gcc -I. -Icrypto/include -Iinclude -DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DPOLY1305_ASM -DOPENSSLDIR=""/usr/local/openssl"" -DENGINESDIR=""/usr/local/openssl/lib/engines-1.1"" -Wall -O3 -pthread -m64 -DL_ENDIAN -Wa,--noexecstack -fPIC -MMD -MF crypto/aes/aes_cfb.d.tmp -MT crypto/aes/aes_cfb.o -c -o crypto/aes/aes_cfb.o crypto/aes/aes_cfb.c
Однако при попытке сгенерировать графики pdg с помощью frama-c для aes_cfb.c я получаю сообщение об ошибке, приведенное ниже.
[kernel] warning: no input file.
[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing)
[kernel] user error: cannot find entry point `main'.
Please use option `-main' for specifying a valid entry point.
[kernel] Frama-C aborted: invalid user input
Конечно, когда я смотрю на некоторые файлы c. Я заметил некоторые из основных функций за некоторыми прекрасными статьями #ifdef, что означает, что когда frama-c компилирует файл c, нет main . С точки зрения исследования, я считаю неэтичным изменять исходный файл C. итак, я попытался запустить command
frama-c -pdg -pdg-dot graph -pdg-print -cpp-command "gcc -c -I. -Icrypto/include -Iinclude -DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DPOLY1305_ASM -DOPENSSLDIR=""/usr/local/openssl"" -DENGINESDIR=""/usr/local/openssl/lib/engines-1.1"" -Wall -O3 -pthread -m64 -DL_ENDIAN -Wa,--noexecstack -fPIC -MMD -MF crypto/asn1/ameth_lib.d.tmp -MT crypto/asn1/ameth_lib.o -c -o crypto/asn1/ameth_lib.o crypto/asn1/ameth_lib.c"
и
frama-c -pdg -pdg-dot graph -pdg-print -cpp-command "gcc -nostartfiles -I. -Icrypto/include -Iinclude -DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DPOLY1305_ASM -DOPENSSLDIR=""/usr/local/openssl"" -DENGINESDIR=""/usr/local/openssl/lib/engines-1.1"" -Wall -O3 -pthread -m64 -DL_ENDIAN -Wa,--noexecstack -fPIC -MMD -MF crypto/asn1/ameth_lib.d.tmp -MT crypto/asn1/ameth_lib.o -c -o crypto/asn1/ameth_lib.o crypto/asn1/ameth_lib.c"
но у меня та же проблема. Ключевыми аргументами, добавленными выше, являются -c и -nostartfiles .
Комментарии:
1. Подходя со стороны OpenSSL, вам, вероятно, потребуется предоставить больше информации. Как вы настроили? Возникали ли у вас ошибки или предупреждения во
make
время? Какова точная ошибка воmake install
время?2. Здесь недостаточно информации, чтобы дать реальный ответ, но, вообще говоря, вы должны использовать Frama-C в исходном каталоге openssl. После того, как программа была скомпилирована один раз, основной проблемой обычно является сбор всех соответствующих
-I
параметров и-D
параметров предварительной обработки для каждого файла C или создание.i
предварительно обработанных файлов сgcc
и передача этих.i
файлов во Frama-C вместо.c
.3. @Virgile Я собираюсь попробовать ваше решение сегодня вечером
4. @Virgile , возможно, я что-то упускаю, но когда я запускаю glob2.glob(‘./openssl/**/*.i’) , он возвращает 0. это означает, что после запуска make в исходном коде разработки нет файлов «.i». Вы имели в виду другое расширение файла?
5. Нет, я имею в виду настройку Makefile, чтобы он создавал эти
.i
файлы вместо обычного процесса компиляции. Для этого не существует пуленепробиваемого метода, хотя добавление команды в соответствии$(CC) -C -E $(CFLAGS) -o $*.i $<
с существующим%.o: %.c
может быть хорошим первым шагом.