>+static __cpuinit void reloc_dyn(Elf32_Ehdr *ehdr, unsigned offset) >+{ >+ Elf32_Dyn *dyn = (void *)ehdr + offset; >+ >+ for(; dyn->d_tag != DT_NULL; dyn++) >+ switch(dyn->d_tag) { >+ case DT_PLTGOT: >+ case DT_HASH: >+ case DT_STRTAB: >+ case DT_SYMTAB: >+ case DT_RELA: >+ case DT_INIT: >+ case DT_FINI: >+ case DT_REL: >+ case DT_JMPREL: >+ case DT_VERSYM: >+ case DT_VERDEF: >+ case DT_VERNEED: >+ dyn->d_un.d_val += VDSO_HIGH_BASE; >+ } >+}
While there's a certain level of control on what DT_* may appear in the vDSO, not even considering other than the above types seems fragile to me. Since future additions to the set are supposedly following a fixed scheme (distinguishing pointers and values via the low bit when below OLD_DT_LOOS, and using sub-ranges when between DT_HIOS and OLD_DT_HIOS), at least also handling those would seem like a good idea, as would warning about unrecognized types. Also, even though it shouldn't matter for the final result, if doing things spec-conforming here you should use d_un.d_ptr. In addition to Roland's remarks about missing symbol table relocation, I would also assume section headers, if present, should be relocated. Jan - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/