From e91b9bcc275f9a7b5297bed7fd0403699123304d Mon Sep 17 00:00:00 2001 From: ad Date: Fri, 5 Dec 2008 21:38:10 +0000 Subject: [PATCH] Make the fake ELF object work with gdb. - Output a .bss section and make all the symbols relative to it, instead of making them absolute. - Output a single load section, no need for two. 'gdb /dev/ksyms' still doesn't work because ksyms doesn't do mmap yet. --- sys/kern/kern_ksyms.c | 29 ++++++++++++++++++----------- sys/sys/ksyms.h | 7 ++++--- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/sys/kern/kern_ksyms.c b/sys/kern/kern_ksyms.c index 38e5fbcd7edd..147c7226be5a 100644 --- a/sys/kern/kern_ksyms.c +++ b/sys/kern/kern_ksyms.c @@ -1,4 +1,4 @@ -/* $NetBSD: kern_ksyms.c,v 1.47 2008/11/30 18:21:36 martin Exp $ */ +/* $NetBSD: kern_ksyms.c,v 1.48 2008/12/05 21:38:10 ad Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -71,7 +71,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: kern_ksyms.c,v 1.47 2008/11/30 18:21:36 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_ksyms.c,v 1.48 2008/12/05 21:38:10 ad Exp $"); #ifdef _KERNEL #include "opt_ddb.h" @@ -90,6 +90,8 @@ __KERNEL_RCSID(0, "$NetBSD: kern_ksyms.c,v 1.47 2008/11/30 18:21:36 martin Exp $ #include #include +#include + #ifdef DDB #include #endif @@ -302,7 +304,7 @@ addsymtab(const char *name, void *symstart, size_t symsize, /* Save symbol. Set it as an absolute offset */ nsym[n] = sym[i]; - nsym[n].st_shndx = SHN_ABS; + nsym[n].st_shndx = SHBSS; j = strlen(nsym[n].st_name + str) + 1; if (j > ksyms_maxlen) ksyms_maxlen = j; @@ -680,17 +682,12 @@ ksyms_hdr_init(void *hdraddr) ksyms_hdr.kh_ehdr.e_shoff = offsetof(struct ksyms_hdr, kh_shdr[0]); ksyms_hdr.kh_ehdr.e_shentsize = sizeof(Elf_Shdr); ksyms_hdr.kh_ehdr.e_shnum = NSECHDR; - ksyms_hdr.kh_ehdr.e_shstrndx = NSECHDR - 1; /* Last section */ + ksyms_hdr.kh_ehdr.e_shstrndx = SHSTRTAB; - /* Text */ + /* Text/data - fake */ ksyms_hdr.kh_phdr[0].p_type = PT_LOAD; ksyms_hdr.kh_phdr[0].p_memsz = (unsigned long)-1L; - ksyms_hdr.kh_phdr[0].p_flags = PF_R | PF_X; - - /* Data */ - ksyms_hdr.kh_phdr[1].p_type = PT_LOAD; - ksyms_hdr.kh_phdr[1].p_memsz = (unsigned long)-1L; - ksyms_hdr.kh_phdr[1].p_flags = PF_R | PF_W | PF_X; + ksyms_hdr.kh_phdr[0].p_flags = PF_R | PF_X | PF_W; /* First section is null */ @@ -718,6 +715,14 @@ ksyms_hdr_init(void *hdraddr) ksyms_hdr.kh_shdr[SHSTRTAB].sh_size = SHSTRSIZ; ksyms_hdr.kh_shdr[SHSTRTAB].sh_addralign = sizeof(char); + /* Fifth section, ".bss". All symbols reside here. */ + ksyms_hdr.kh_shdr[SHBSS].sh_name = 27; /* This section name offset */ + ksyms_hdr.kh_shdr[SHBSS].sh_type = SHT_NOBITS; + ksyms_hdr.kh_shdr[SHBSS].sh_offset = 0; + ksyms_hdr.kh_shdr[SHBSS].sh_size = (unsigned long)-1L; + ksyms_hdr.kh_shdr[SHBSS].sh_addralign = PAGE_SIZE; + ksyms_hdr.kh_shdr[SHBSS].sh_flags = SHF_ALLOC | SHF_EXECINSTR; + /* Set section names */ strlcpy(&ksyms_hdr.kh_strtab[1], ".symtab", sizeof(ksyms_hdr.kh_strtab) - 1); @@ -725,6 +730,8 @@ ksyms_hdr_init(void *hdraddr) sizeof(ksyms_hdr.kh_strtab) - 9); strlcpy(&ksyms_hdr.kh_strtab[17], ".shstrtab", sizeof(ksyms_hdr.kh_strtab) - 17); + strlcpy(&ksyms_hdr.kh_strtab[27], ".bss", + sizeof(ksyms_hdr.kh_strtab) - 27); } static int diff --git a/sys/sys/ksyms.h b/sys/sys/ksyms.h index c240859344ed..d16f4832d205 100644 --- a/sys/sys/ksyms.h +++ b/sys/sys/ksyms.h @@ -1,4 +1,4 @@ -/* $NetBSD: ksyms.h,v 1.21 2008/11/30 18:21:36 martin Exp $ */ +/* $NetBSD: ksyms.h,v 1.22 2008/12/05 21:38:10 ad Exp $ */ /* * Copyright (c) 2001, 2003 Anders Magnusson (ragge@ludd.luth.se). @@ -56,9 +56,10 @@ struct ksyms_symtab { #define SYMTAB 1 #define STRTAB 2 #define SHSTRTAB 3 -#define NSECHDR 4 +#define SHBSS 4 +#define NSECHDR 5 -#define NPRGHDR 2 +#define NPRGHDR 1 #define SHSTRSIZ 32 struct ksyms_hdr {