>I am now able to switch "npx_exists" between npx_probe1() and
>npx_attach(), which let me run with the emulator on a Pentium.
>
>But only from serial kgdb, since as you noted in your other message,
>symbols are not available to ddb in ELF kernels started with -d.
>
>I assume you use kdb_init() from db_elf.c, you how do you call it
>given that you neither have the symbol (not loaded yet) nor the
>address (`nm /kernel` output not useful)?

The boot loader passes the relevant addresses.

To use this, replace ddb_kld.c by ddb_elf.c in /sys/conf/files.

Bruce

diff -c2 db_elf.c~ db_elf.c
*** db_elf.c~   Thu Jan 28 22:05:22 1999
--- db_elf.c    Sat May  8 15:58:30 1999
***************
*** 39,55 ****
   */
  
! #if defined(__ELF__) && defined(__alpha__)
  
  #include "opt_ddb.h"
  
- #include <sys/types.h>
  #include <sys/param.h>
  #include <sys/systm.h>  
- #include <sys/proc.h>
  
! #include <machine/db_machdep.h>
  
  #include <ddb/db_sym.h>
- #include <ddb/db_output.h>
  
  #include <machine/elf.h>
--- 39,53 ----
   */
  
! #ifdef __ELF__
  
  #include "opt_ddb.h"
  
  #include <sys/param.h>
  #include <sys/systm.h>  
  
! #include <machine/bootinfo.h>
  
+ #include <ddb/ddb.h>
  #include <ddb/db_sym.h>
  
  #include <machine/elf.h>
***************
*** 81,88 ****
--- 79,88 ----
        int i;
  
+ #if 0
        if (ALIGNED_POINTER(symtab, long) == 0) {
                printf("DDB: bad symbol table start address %p\n", symtab);
                return;
        }
+ #endif
  
        symtab_start = symtab_end = NULL;
***************
*** 162,169 ****
--- 162,171 ----
         * Now, sanity check the symbols against the string table.
         */
+ #if 0
        if (symtab_start == NULL || strtab_start == NULL ||
            ALIGNED_POINTER(symtab_start, long) == 0 ||
            ALIGNED_POINTER(strtab_start, long) == 0)
                goto badheader;
+ #endif
        for (symp = symtab_start; symp < symtab_end; symp++)
                if (symp->st_name + strtab_start > strtab_end)
***************
*** 216,220 ****
   * Lookup the symbol with the given name.
   */
! db_sym_t
  X_db_lookup(stab, symstr)
        db_symtab_t *stab;
--- 218,222 ----
   * Lookup the symbol with the given name.
   */
! c_db_sym_t
  X_db_lookup(stab, symstr)
        db_symtab_t *stab;
***************
*** 228,231 ****
--- 230,234 ----
  
        strtab = db_elf_find_strtab(stab);
+       strtab = (char *)stab->end + 4;
        if (strtab == NULL)
                return ((db_sym_t)0);
***************
*** 244,248 ****
   * provided threshold).
   */
! db_sym_t
  X_db_search_symbol(symtab, off, strategy, diffp)
        db_symtab_t *symtab;
--- 247,251 ----
   * provided threshold).
   */
! c_db_sym_t
  X_db_search_symbol(symtab, off, strategy, diffp)
        db_symtab_t *symtab;
***************
*** 262,268 ****
--- 265,273 ----
                if (symp->st_name == 0)
                        continue;
+ #if 0
                if (ELF_ST_TYPE(symp->st_info) != STT_OBJECT &&
                    ELF_ST_TYPE(symp->st_info) != STT_FUNC)
                        continue;
+ #endif
  
                if (off >= symp->st_value) {
***************
*** 310,322 ****
  X_db_symbol_values(symtab, sym, namep, valuep)
        db_symtab_t *symtab;
!       db_sym_t sym;
        const char **namep;
        db_expr_t *valuep;
  {
!       Elf_Sym *symp = (Elf_Sym *)sym;
        char *strtab;
  
        if (namep) {
                strtab = db_elf_find_strtab(symtab);
                if (strtab == NULL)
                        *namep = NULL;
--- 315,328 ----
  X_db_symbol_values(symtab, sym, namep, valuep)
        db_symtab_t *symtab;
!       c_db_sym_t sym;
        const char **namep;
        db_expr_t *valuep;
  {
!       const Elf_Sym *symp = (const Elf_Sym *)sym;
        char *strtab;
  
        if (namep) {
                strtab = db_elf_find_strtab(symtab);
+               strtab = (char *)symtab->end + 4;
                if (strtab == NULL)
                        *namep = NULL;
***************
*** 336,340 ****
  X_db_line_at_pc(symtab, cursym, filename, linenum, off)
        db_symtab_t *symtab;
!       db_sym_t cursym;
        char **filename;
        int *linenum;
--- 342,346 ----
  X_db_line_at_pc(symtab, cursym, filename, linenum, off)
        db_symtab_t *symtab;
!       c_db_sym_t cursym;
        char **filename;
        int *linenum;
***************
*** 375,381 ****
  {
  
        if (ksym_end > ksym_start)
                X_db_sym_init(ksym_start, ksym_end, "kernel");
  }
  
! #endif
--- 381,395 ----
  {
  
+ #ifdef __i386__
+       if (bootinfo.bi_esymtab != bootinfo.bi_symtab)
+               db_add_symbol_table(
+                   (char *)bootinfo.bi_symtab + 4,
+                   (char *)bootinfo.bi_symtab + 4 + *(int *)bootinfo.bi_symtab,
+                   "kernel", (char *)bootinfo.bi_symtab);
+ #else
        if (ksym_end > ksym_start)
                X_db_sym_init(ksym_start, ksym_end, "kernel");
+ #endif
  }
  
! #endif /* __ELF__ */


To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to