1
0
mirror of https://xff.cz/git/u-boot/ synced 2025-09-01 00:32:04 +02:00

Add dumpimage, a tool to extract data from U-Boot images

Given a multi-file image created through the mkimage's -d option:

  $ mkimage -A x86 -O linux -T multi -n x86 -d vmlinuz:initrd.img:System.map \
  multi.img

  Image Name:   x86
  Created:      Thu Jul 25 10:29:13 2013
  Image Type:   Intel x86 Linux Multi-File Image (gzip compressed)
  Data Size:    13722956 Bytes = 13401.32 kB = 13.09 MB
  Load Address: 00000000
  Entry Point:  00000000
  Contents:
     Image 0: 4040128 Bytes = 3945.44 kB = 3.85 MB
     Image 1: 7991719 Bytes = 7804.41 kB = 7.62 MB
     Image 2: 1691092 Bytes = 1651.46 kB = 1.61 MB

It is possible to perform the innverse operation -- extracting any file from
the image -- by using the dumpimage's -i option:

  $ dumpimage -i multi.img -p 2 System.map

Although it's feasible to retrieve "data files" from image through scripting,
the requirement to embed tools such 'dd', 'awk' and 'sed' for this sole purpose
is cumbersome and unreliable -- once you must keep track of file sizes inside
the image. Furthermore, extracting data files using "dumpimage" tool is faster
than through scripting.

Signed-off-by: Guilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com>
Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Guilherme Maciel Ferreira
2013-12-01 12:43:11 -07:00
committed by Tom Rini
parent f86ed6a8d5
commit a804b5ce2d
8 changed files with 444 additions and 0 deletions

View File

@@ -117,6 +117,62 @@ static void image_set_header(void *ptr, struct stat *sbuf, int ifd,
image_set_hcrc(hdr, checksum);
}
static int image_save_datafile(struct image_tool_params *params,
ulong file_data, ulong file_len)
{
int dfd;
const char *datafile = params->outfile;
dfd = open(datafile, O_RDWR | O_CREAT | O_TRUNC | O_BINARY,
S_IRUSR | S_IWUSR);
if (dfd < 0) {
fprintf(stderr, "%s: Can't open \"%s\": %s\n",
params->cmdname, datafile, strerror(errno));
return -1;
}
if (write(dfd, (void *)file_data, file_len) != (ssize_t)file_len) {
fprintf(stderr, "%s: Write error on \"%s\": %s\n",
params->cmdname, datafile, strerror(errno));
close(dfd);
return -1;
}
close(dfd);
return 0;
}
static int image_extract_datafile(void *ptr, struct image_tool_params *params)
{
const image_header_t *hdr = (const image_header_t *)ptr;
ulong file_data;
ulong file_len;
if (image_check_type(hdr, IH_TYPE_MULTI)) {
ulong idx = params->pflag;
ulong count;
/* get the number of data files present in the image */
count = image_multi_count(hdr);
/* retrieve the "data file" at the idx position */
image_multi_getimg(hdr, idx, &file_data, &file_len);
if ((file_len == 0) || (idx >= count)) {
fprintf(stderr, "%s: No such data file %ld in \"%s\"\n",
params->cmdname, idx, params->imagefile);
return -1;
}
} else {
file_data = image_get_data(hdr);
file_len = image_get_size(hdr);
}
/* save the "data file" into the file system */
return image_save_datafile(params, file_data, file_len);
}
/*
* Default image type parameters definition
*/
@@ -128,6 +184,7 @@ static struct image_type_params defimage_params = {
.verify_header = image_verify_header,
.print_header = image_print_contents,
.set_header = image_set_header,
.extract_datafile = image_extract_datafile,
.check_params = image_check_params,
};