Author: hailfinger Date: 2008-02-08 13:15:46 +0100 (Fri, 08 Feb 2008) New Revision: 580
Modified: coreboot-v3/util/lar/stream.c Log: Fix lar so that it parses .bss section headers. This is not terribly clean but it works.
Signed-off-by: Ronald G. Minnich rminnich@gmail.com
Tested with a qemu boot to work correctly. Acked-by: Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net
Modified: coreboot-v3/util/lar/stream.c =================================================================== --- coreboot-v3/util/lar/stream.c 2008-02-08 11:57:07 UTC (rev 579) +++ coreboot-v3/util/lar/stream.c 2008-02-08 12:15:46 UTC (rev 580) @@ -74,8 +74,9 @@ int filelen, enum compalgo algo) { int ret; - Elf32_Phdr *phdr; + Elf32_Phdr *phdr; Elf32_Ehdr *ehdr; + Elf32_Shdr *shdr; u32 entry; int i; int size; @@ -121,11 +122,53 @@ ehdr->e_phnum, ehdr->e_shentsize, ehdr->e_shnum); - phdr = (Elf32_Phdr *)&(header[ehdr->e_phoff]); + phdr = (Elf32_Phdr *)&(header[ehdr->e_phoff]); + shdr = (Elf32_Shdr *)&(header[ehdr->e_shoff]);
if (verbose()) fprintf(stderr, "%s: header %p #headers %d\n", __FUNCTION__, ehdr, headers); + entry = ehdr->e_entry; + /* bss segments are special. They are in the section headers, + * not program headers. So, sadly, we have to look at section headers. + */ + + for(i = 0; i < ehdr->e_shnum; i++) { + char *p, *q; + /* Ignore data that I don't need to handle */ + if (shdr[i].sh_type != SHT_NOBITS) { + if (verbose()) + fprintf(stderr, "Dropping non SHT_NOBITS section\n"); + continue; + } + /* might need to test flags with SHF_ALLOC */ + if (shdr[i].sh_size == 0) { + if (verbose()) + fprintf(stderr, "Dropping empty section\n"); + continue; + } + thisalgo = algo; + if (verbose()) + fprintf(stderr, "New section addr %#x size %#x\n", + (u32)shdr[i].sh_addr, (u32)shdr[i].sh_size); + /* Clean up the values */ + size = shdr[i].sh_size; + if (verbose()) { + fprintf(stderr, "(cleaned up) New section addr %p size 0x%#x\n", + (void *)shdr[i].sh_addr, (u32)shdr[i].sh_size); + } + /* ok, copy it out */ + sprintf(ename, "%s/segment%d", name, segment++); + /* just allocate a bunch of zeros */ + p = calloc(sizeof(*p), size); + q = calloc(sizeof(*q), size); + complen = lar_compress(p, size, q, &thisalgo); + ret = lar_add_entry(lar, ename, q, complen, size, + shdr[i].sh_addr, entry, thisalgo); + free(p); + free(q); + } + for(i = 0; i < headers; i++) { /* Ignore data that I don't need to handle */ if (phdr[i].p_type != PT_LOAD) {