lkml.org 
[lkml]   [2011]   [Aug]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
From
Date
SubjectRe: [PATCH v3] scripts: add extract-vmlinux
On Tue, 2011-08-16 at 10:46 +0200, Corentin Chary wrote:
> This script can be used to extract vmlinux from a compressed
> kernel image (bzImage, etc..). It's inspired from (a subset of)
> extract-ikconfig.

FWIW I wrote the attached way back when, it uses the payload_* fields in
the bzImage to find the payload rather than scanning (these are present
in bzImages from somewhere in the mid 2.6.2x range). I'd be happy to
license it under the GPLv2 if that is helpful.

> It's something a lot of people have been looking for (mainly
> people with xen < 4 that doesn't support bzImages at all).

xen 3.4 does, doesn't it (at least the tip of 3.4-testing.hg does)? And
I thought e.g. RHEL5 (which uses an older base version) had it
backported. Possibly what is missing is support for all the various
compression options.

Ian.
--
Ian Campbell


How do I get HOME?
#include <stdio.h>
#include <fcntl.h>
#include <stdint.h>
#include <unistd.h>

#include <inttypes.h>

#include <err.h>

#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>

int main(int argc, char **argv)
{
int fd;
struct stat sb;
void *p;
uint8_t *hdr;
int setup_sectors;
uint32_t compressed_payload_offset;
uint32_t compressed_payload_length;

if (argc != 2)
errx(1, "usage: bzexplode <bzImage>");

fd = open(argv[1], O_RDONLY);
if (fd < 0)
err(1, "open");

if (fstat(fd, &sb) < 0)
err(1, "fstat");

p = mmap(0, sb.st_size, PROT_READ, MAP_SHARED, fd, 0);
if (p == MAP_FAILED)
err(1, "mmap");

hdr = p;
setup_sectors = hdr[0x1f1];
compressed_payload_offset = *(uint32_t*)&hdr[0x248];

fprintf(stderr, "setup sectors %d\n", setup_sectors);

compressed_payload_offset += (setup_sectors+1) * 512;

//compressed_payload_length = *(uint32_t*)(p + compressed_payload_offset - 4);
compressed_payload_length = *(uint32_t*)&hdr[0x24c];

fprintf(stderr, "compressed_payload_offset %"PRIx32" (abs)\n",
compressed_payload_offset);
fprintf(stderr, "compressed_payload_length %"PRIx32"\n",
compressed_payload_length);

write(1,
p + compressed_payload_offset,
compressed_payload_length);
return 0;
}
[unhandled content-type:application/pgp-signature]
\
 
 \ /
  Last update: 2011-08-19 08:59    [W:1.587 / U:0.056 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site