Module Name: src Committed By: matt Date: Fri Aug 9 05:10:14 UTC 2013
Modified Files: src/sys/kern: subr_kobj.c Log Message: Ignore REL/RELA if they aren't against a PROGBIT section. (this causes EXIDX sections to be ignored for ARM). To generate a diff of this commit: cvs rdiff -u -r1.45 -r1.46 src/sys/kern/subr_kobj.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/subr_kobj.c diff -u src/sys/kern/subr_kobj.c:1.45 src/sys/kern/subr_kobj.c:1.46 --- src/sys/kern/subr_kobj.c:1.45 Sun Dec 30 20:52:20 2012 +++ src/sys/kern/subr_kobj.c Fri Aug 9 05:10:14 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_kobj.c,v 1.45 2012/12/30 20:52:20 pooka Exp $ */ +/* $NetBSD: subr_kobj.c,v 1.46 2013/08/09 05:10:14 matt Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -63,7 +63,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_kobj.c,v 1.45 2012/12/30 20:52:20 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_kobj.c,v 1.46 2013/08/09 05:10:14 matt Exp $"); #include "opt_modular.h" @@ -257,9 +257,13 @@ kobj_load(kobj_t ko) symstrindex = shdr[i].sh_link; break; case SHT_REL: + if (shdr[shdr[i].sh_info].sh_type != SHT_PROGBITS) + continue; ko->ko_nrel++; break; case SHT_RELA: + if (shdr[shdr[i].sh_info].sh_type != SHT_PROGBITS) + continue; ko->ko_nrela++; break; case SHT_STRTAB: @@ -488,6 +492,8 @@ kobj_load(kobj_t ko) pb++; break; case SHT_REL: + if (shdr[shdr[i].sh_info].sh_type != SHT_PROGBITS) + break; ko->ko_reltab[rl].size = shdr[i].sh_size; ko->ko_reltab[rl].size -= shdr[i].sh_size % sizeof(Elf_Rel); @@ -508,6 +514,8 @@ kobj_load(kobj_t ko) rl++; break; case SHT_RELA: + if (shdr[shdr[i].sh_info].sh_type != SHT_PROGBITS) + break; ko->ko_relatab[ra].size = shdr[i].sh_size; ko->ko_relatab[ra].size -= shdr[i].sh_size % sizeof(Elf_Rela); @@ -532,16 +540,21 @@ kobj_load(kobj_t ko) } } if (pb != ko->ko_nprogtab) { - panic("lost progbits"); + panic("%s:%d: %s: lost progbits", __func__, __LINE__, + ko->ko_name); } if (rl != ko->ko_nrel) { - panic("lost rel"); + panic("%s:%d: %s: lost rel", __func__, __LINE__, + ko->ko_name); } if (ra != ko->ko_nrela) { - panic("lost rela"); + panic("%s:%d: %s: lost rela", __func__, __LINE__, + ko->ko_name); } if (ko->ko_type != KT_MEMORY && mapbase != ko->ko_address + mapsize) { - panic("mapbase 0x%lx != address %lx + mapsize %ld (0x%lx)\n", + panic("%s:%d: %s: " + "mapbase 0x%lx != address %lx + mapsize %ld (0x%lx)\n", + __func__, __LINE__, ko->ko_name, (long)mapbase, (long)ko->ko_address, (long)mapsize, (long)ko->ko_address + mapsize); } @@ -929,7 +942,9 @@ kobj_relocate(kobj_t ko, bool local) rellim = rel + ko->ko_reltab[i].nrel; base = kobj_findbase(ko, ko->ko_reltab[i].sec); if (base == 0) { - panic("lost base for e_reltab"); + panic("%s:%d: %s: lost base for e_reltab[%d] sec %d", + __func__, __LINE__, ko->ko_name, i, + ko->ko_reltab[i].sec); } for (; rel < rellim; rel++) { symidx = ELF_R_SYM(rel->r_info); @@ -958,7 +973,9 @@ kobj_relocate(kobj_t ko, bool local) relalim = rela + ko->ko_relatab[i].nrela; base = kobj_findbase(ko, ko->ko_relatab[i].sec); if (base == 0) { - panic("lost base for e_relatab"); + panic("%s:%d: %s: lost base for e_relatab[%d] sec %d", + __func__, __LINE__, ko->ko_name, i, + ko->ko_relatab[i].sec); } for (; rela < relalim; rela++) { symidx = ELF_R_SYM(rela->r_info);