kvs/тесты/_сравнитель/compare_elf.sh

149 lines
5.2 KiB
Bash
Raw Normal View History

#!/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