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

149 lines
5.2 KiB
Bash
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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