Генерация PDF-файлов из исходного кода OpenSSL C для анализа

#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 может быть хорошим первым шагом.