149 lines
5.2 KiB
Bash
Executable file
149 lines
5.2 KiB
Bash
Executable file
#!/bin/bash
|
||
|
||
# Сравнение ELF-файлов побайтно
|
||
# Сохраняет отчёт в файл
|
||
# Нужен для проверки совместимости нового компилятора с 8й версией
|
||
|
||
if [ $# -ne 2 ]; then
|
||
echo "Использование: $0 <файл1.elf> <файл2.elf>"
|
||
exit 1
|
||
fi
|
||
|
||
FILE1="$1"
|
||
FILE2="$2"
|
||
OUTPUT="compare_$(basename "$1")_$(basename "$2").txt"
|
||
|
||
echo "Сравнение: $FILE1 vs $FILE2"
|
||
echo "Отчёт: $OUTPUT"
|
||
|
||
# Заголовок отчёта
|
||
{
|
||
echo "========================================"
|
||
echo "ПОБАЙТНОЕ СРАВНЕНИЕ ELF-ФАЙЛОВ"
|
||
echo "========================================"
|
||
echo "Файл 1: $FILE1"
|
||
echo "Файл 2: $FILE2"
|
||
echo "Время: $(date)"
|
||
echo "========================================"
|
||
echo ""
|
||
|
||
# Размеры файлов
|
||
SIZE1=$(stat -c %s "$FILE1")
|
||
SIZE2=$(stat -c %s "$FILE2")
|
||
echo "Размер файла 1: $SIZE1 байт"
|
||
echo "Размер файла 2: $SIZE2 байт"
|
||
echo ""
|
||
|
||
if [ "$SIZE1" -ne "$SIZE2" ]; then
|
||
echo "ВНИМАНИЕ: Размеры файлов отличаются!"
|
||
echo ""
|
||
fi
|
||
|
||
# Побайтное сравнение
|
||
echo "ПОБАЙТНОЕ СРАВНЕНИЕ:"
|
||
echo "--------------"
|
||
|
||
# Используем cmp для побайтного сравнения
|
||
cmp -l "$FILE1" "$FILE2" 2>/dev/null | while read offset byte1 byte2; do
|
||
echo "Смещение 0x$(printf "%08x" $((offset-1))): байт1=0x$byte1, байт2=0x$byte2"
|
||
done
|
||
|
||
DIFF_COUNT=$(cmp -l "$FILE1" "$FILE2" 2>/dev/null | wc -l)
|
||
|
||
if [ "$DIFF_COUNT" -eq 0 ]; then
|
||
echo "Файлы идентичны!"
|
||
else
|
||
echo ""
|
||
echo "Всего различий: $DIFF_COUNT"
|
||
fi
|
||
|
||
echo ""
|
||
echo "========================================"
|
||
echo "СРАВНЕНИЕ ELF-ЗАГОЛОВКОВ"
|
||
echo "========================================"
|
||
|
||
# Сравнение ELF-заголовков
|
||
echo ""
|
||
echo "--- readelf -h ---"
|
||
echo "=== $FILE1 ===" >> /tmp/elf1_header.txt
|
||
readelf -h "$FILE1" 2>/dev/null >> /tmp/elf1_header.txt
|
||
echo "=== $FILE2 ===" >> /tmp/elf2_header.txt
|
||
readelf -h "$FILE2" 2>/dev/null >> /tmp/elf2_header.txt
|
||
diff /tmp/elf1_header.txt /tmp/elf2_header.txt 2>/dev/null || echo "ELF-заголовки отличаются"
|
||
rm -f /tmp/elf1_header.txt /tmp/elf2_header.txt
|
||
|
||
echo ""
|
||
echo "--- readelf -l (программные заголовки) ---"
|
||
echo "=== $FILE1 ===" >> /tmp/elf1_ph.txt
|
||
readelf -l "$FILE1" 2>/dev/null >> /tmp/elf1_ph.txt
|
||
echo "=== $FILE2 ===" >> /tmp/elf2_ph.txt
|
||
readelf -l "$FILE2" 2>/dev/null >> /tmp/elf2_ph.txt
|
||
diff /tmp/elf1_ph.txt /tmp/elf2_ph.txt 2>/dev/null || echo "Программные заголовки отличаются"
|
||
rm -f /tmp/elf1_ph.txt /tmp/elf2_ph.txt
|
||
|
||
echo ""
|
||
echo "--- readelf -S (секции) ---"
|
||
echo "=== $FILE1 ===" >> /tmp/elf1_sec.txt
|
||
readelf -S "$FILE1" 2>/dev/null >> /tmp/elf1_sec.txt
|
||
echo "=== $FILE2 ===" >> /tmp/elf2_sec.txt
|
||
readelf -S "$FILE2" 2>/dev/null >> /tmp/elf2_sec.txt
|
||
diff /tmp/elf1_sec.txt /tmp/elf2_sec.txt 2>/dev/null || echo "Секции отличаются"
|
||
rm -f /tmp/elf1_sec.txt /tmp/elf2_sec.txt
|
||
|
||
echo ""
|
||
echo "========================================"
|
||
echo "HEX-ДАМП ПЕРВЫХ 256 БАЙТ"
|
||
echo "========================================"
|
||
echo ""
|
||
echo "=== $FILE1 ==="
|
||
hexdump -C "$FILE1" -n 256
|
||
echo ""
|
||
echo "=== $FILE2 ==="
|
||
hexdump -C "$FILE2" -n 256
|
||
|
||
echo ""
|
||
echo "========================================"
|
||
echo "HEX-ДАМП ОБЛАСТИ ПРОГРАММНЫХ ЗАГОЛОВКОВ (0x40-0xe8)"
|
||
echo "========================================"
|
||
echo ""
|
||
echo "=== $FILE1 ==="
|
||
hexdump -C "$FILE1" -s 0x40 -n 168
|
||
echo ""
|
||
echo "=== $FILE2 ==="
|
||
hexdump -C "$FILE2" -s 0x40 -n 168
|
||
|
||
echo ""
|
||
echo "========================================"
|
||
echo "HEX-ДАМП ОБЛАСТИ ТАБЛИЦЫ СЕКЦИЙ (0x2040-0x2140)"
|
||
echo "========================================"
|
||
echo ""
|
||
echo "=== $FILE1 ==="
|
||
hexdump -C "$FILE1" -s 0x2040 -n 256 2>/dev/null || echo "Нет данных по адресу 0x2040"
|
||
echo ""
|
||
echo "=== $FILE2 ==="
|
||
hexdump -C "$FILE2" -s 0x2040 -n 256 2>/dev/null || echo "Нет данных по адресу 0x2040"
|
||
|
||
echo ""
|
||
echo "========================================"
|
||
echo "СРАВНЕНИЕ ВЫПОЛНЕНИЯ"
|
||
echo "========================================"
|
||
|
||
echo "=== Выполнение $FILE1 ==="
|
||
./"$FILE1"
|
||
echo "Код возврата: $?"
|
||
|
||
echo "=== Выполнение $FILE2 ==="
|
||
./"$FILE2"
|
||
echo "Код возврата: $?"
|
||
|
||
} > "$OUTPUT"
|
||
|
||
echo "Отчёт сохранён в: $OUTPUT"
|
||
|
||
# Показать количество различий
|
||
DIFF_COUNT=$(cmp -l "$FILE1" "$FILE2" 2>/dev/null | wc -l)
|
||
if [ "$DIFF_COUNT" -eq 0 ]; then
|
||
echo "✅ Файлы идентичны!"
|
||
else
|
||
echo "❌ Найдено $DIFF_COUNT различий"
|
||
fi |