39931f966a
The dumpimage is able to extract components contained in a FIT image: $ ./dumpimage -T flat_dt -i CONTAINER.ITB -p INDEX FILE The CONTAINER.ITB is a regular FIT container file. The INDEX is the poisition of the sub-image to be retrieved, and FILE is the file (path+name) to save the extracted sub-image. For example, given the following kernel.its to build a kernel.itb: /dts-v1/; / { ... images { kernel@1 { description = "Kernel 2.6.32-34"; data = /incbin/("/boot/vmlinuz-2.6.32-34-generic"); type = "kernel"; arch = "ppc"; os = "linux"; compression = "gzip"; load = <00000000>; entry = <00000000>; hash@1 { algo = "md5"; }; }; ... }; ... }; The dumpimage can extract the 'kernel@1' node through the following command: $ ./dumpimage -T flat_dt -i kernel.itb -p 0 kernel Extracted: Image 0 (kernel@1) Description: Kernel 2.6.32-34 Created: Wed Oct 22 15:50:26 2014 Type: Kernel Image Compression: gzip compressed Data Size: 4040128 Bytes = 3945.44 kB = 3.85 MB Architecture: PowerPC OS: Linux Load Address: 0x00000000 Entry Point: 0x00000000 Hash algo: md5 Hash value: 22352ad39bdc03e2e50f9cc28c1c3652 Which results in the file 'kernel' being exactly the same as '/boot/vmlinuz-2.6.32-34-generic'. Signed-off-by: Guilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com>
227 lines
4.9 KiB
Bash
Executable File
227 lines
4.9 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Written by Guilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com>
|
|
#
|
|
# Sanity check for mkimage and dumpimage tools
|
|
#
|
|
# SPDX-License-Identifier: GPL-2.0+
|
|
#
|
|
# To run this:
|
|
#
|
|
# make O=sandbox sandbox_config
|
|
# make O=sandbox
|
|
# ./test/image/test-imagetools.sh
|
|
|
|
BASEDIR=sandbox
|
|
SRCDIR=${BASEDIR}/boot
|
|
IMAGE_NAME="v1.0-test"
|
|
IMAGE_MULTI=linux.img
|
|
IMAGE_FIT_ITS=linux.its
|
|
IMAGE_FIT_ITB=linux.itb
|
|
DATAFILE0=vmlinuz
|
|
DATAFILE1=initrd.img
|
|
DATAFILE2=System.map
|
|
DATAFILES="${DATAFILE0} ${DATAFILE1} ${DATAFILE2}"
|
|
TEST_OUT=test_output
|
|
MKIMAGE=${BASEDIR}/tools/mkimage
|
|
DUMPIMAGE=${BASEDIR}/tools/dumpimage
|
|
MKIMAGE_LIST=mkimage.list
|
|
DUMPIMAGE_LIST=dumpimage.list
|
|
|
|
# Remove all the files we created
|
|
cleanup()
|
|
{
|
|
local file
|
|
|
|
for file in ${DATAFILES}; do
|
|
rm -f ${file} ${SRCDIR}/${file}
|
|
done
|
|
rm -f ${IMAGE_MULTI}
|
|
rm -f ${DUMPIMAGE_LIST}
|
|
rm -f ${MKIMAGE_LIST}
|
|
rm -f ${TEST_OUT}
|
|
rmdir ${SRCDIR}
|
|
}
|
|
|
|
# Check that two files are the same
|
|
assert_equal()
|
|
{
|
|
if ! diff -u $1 $2; then
|
|
echo "Failed."
|
|
cleanup
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Create some test files
|
|
create_files()
|
|
{
|
|
local file
|
|
|
|
mkdir -p ${SRCDIR}
|
|
for file in ${DATAFILES}; do
|
|
head -c $RANDOM /dev/urandom >${SRCDIR}/${file}
|
|
done
|
|
}
|
|
|
|
# Run a command, echoing it first
|
|
do_cmd()
|
|
{
|
|
local cmd="$@"
|
|
|
|
echo "# ${cmd}"
|
|
${cmd} 2>&1
|
|
}
|
|
|
|
# Run a command, redirecting output
|
|
# Args:
|
|
# redirect_file
|
|
# command...
|
|
do_cmd_redir()
|
|
{
|
|
local redir="$1"
|
|
shift
|
|
local cmd="$@"
|
|
|
|
echo "# ${cmd}"
|
|
${cmd} >${redir}
|
|
}
|
|
|
|
# Write files into an multi-file image
|
|
create_multi_image()
|
|
{
|
|
local files="${SRCDIR}/${DATAFILE0}:${SRCDIR}/${DATAFILE1}"
|
|
files+=":${SRCDIR}/${DATAFILE2}"
|
|
|
|
echo -e "\nBuilding multi-file image..."
|
|
do_cmd ${MKIMAGE} -A x86 -O linux -T multi -n \"${IMAGE_NAME}\" \
|
|
-d ${files} ${IMAGE_MULTI}
|
|
echo "done."
|
|
}
|
|
|
|
# Extract files from an multi-file image
|
|
extract_multi_image()
|
|
{
|
|
echo -e "\nExtracting multi-file image contents..."
|
|
do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 0 ${DATAFILE0}
|
|
do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 1 ${DATAFILE1}
|
|
do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 2 ${DATAFILE2}
|
|
do_cmd ${DUMPIMAGE} -T multi -i ${IMAGE_MULTI} -p 2 ${DATAFILE2} -o ${TEST_OUT}
|
|
echo "done."
|
|
}
|
|
|
|
# Write files into a FIT image
|
|
create_fit_image()
|
|
{
|
|
echo " \
|
|
/dts-v1/; \
|
|
/ { \
|
|
description = \"FIT image\"; \
|
|
#address-cells = <1>; \
|
|
\
|
|
images { \
|
|
kernel@1 { \
|
|
description = \"kernel\"; \
|
|
data = /incbin/(\"${DATAFILE0}\"); \
|
|
type = \"kernel\"; \
|
|
arch = \"sandbox\"; \
|
|
os = \"linux\"; \
|
|
compression = \"gzip\"; \
|
|
load = <0x40000>; \
|
|
entry = <0x8>; \
|
|
}; \
|
|
ramdisk@1 { \
|
|
description = \"filesystem\"; \
|
|
data = /incbin/(\"${DATAFILE1}\"); \
|
|
type = \"ramdisk\"; \
|
|
arch = \"sandbox\"; \
|
|
os = \"linux\"; \
|
|
compression = \"none\"; \
|
|
load = <0x80000>; \
|
|
entry = <0x16>; \
|
|
}; \
|
|
fdt@1 { \
|
|
description = \"device tree\"; \
|
|
data = /incbin/(\"${DATAFILE2}\"); \
|
|
type = \"flat_dt\"; \
|
|
arch = \"sandbox\"; \
|
|
compression = \"none\"; \
|
|
}; \
|
|
}; \
|
|
configurations { \
|
|
default = \"conf@1\"; \
|
|
conf@1 { \
|
|
kernel = \"kernel@1\"; \
|
|
fdt = \"fdt@1\"; \
|
|
}; \
|
|
}; \
|
|
}; \
|
|
" > ${IMAGE_FIT_ITS}
|
|
|
|
echo -e "\nBuilding FIT image..."
|
|
do_cmd ${MKIMAGE} -f ${IMAGE_FIT_ITS} ${IMAGE_FIT_ITB}
|
|
echo "done."
|
|
}
|
|
|
|
# Extract files from a FIT image
|
|
extract_fit_image()
|
|
{
|
|
echo -e "\nExtracting FIT image contents..."
|
|
do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 0 ${DATAFILE0}
|
|
do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 1 ${DATAFILE1}
|
|
do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 2 ${DATAFILE2}
|
|
do_cmd ${DUMPIMAGE} -T flat_dt -i ${IMAGE_FIT_ITB} -p 2 ${DATAFILE2} -o ${TEST_OUT}
|
|
echo "done."
|
|
}
|
|
|
|
# List the contents of a file
|
|
# Args:
|
|
# image filename
|
|
list_image()
|
|
{
|
|
local image="$1"
|
|
|
|
echo -e "\nListing image contents..."
|
|
do_cmd_redir ${MKIMAGE_LIST} ${MKIMAGE} -l ${image}
|
|
do_cmd_redir ${DUMPIMAGE_LIST} ${DUMPIMAGE} -l ${image}
|
|
echo "done."
|
|
}
|
|
|
|
main()
|
|
{
|
|
local file
|
|
|
|
create_files
|
|
|
|
# Compress and extract multi-file images, compare the result
|
|
create_multi_image
|
|
extract_multi_image
|
|
for file in ${DATAFILES}; do
|
|
assert_equal ${file} ${SRCDIR}/${file}
|
|
done
|
|
assert_equal ${TEST_OUT} ${DATAFILE2}
|
|
|
|
# List contents of multi-file image and compares output from tools
|
|
list_image ${IMAGE_MULTI}
|
|
assert_equal ${DUMPIMAGE_LIST} ${MKIMAGE_LIST}
|
|
|
|
# Compress and extract FIT images, compare the result
|
|
create_fit_image
|
|
extract_fit_image
|
|
for file in ${DATAFILES}; do
|
|
assert_equal ${file} ${SRCDIR}/${file}
|
|
done
|
|
assert_equal ${TEST_OUT} ${DATAFILE2}
|
|
|
|
# List contents of FIT image and compares output from tools
|
|
list_image ${IMAGE_FIT_ITB}
|
|
assert_equal ${DUMPIMAGE_LIST} ${MKIMAGE_LIST}
|
|
|
|
# Remove files created
|
|
cleanup
|
|
|
|
echo "Tests passed."
|
|
}
|
|
|
|
main
|