We haven't built gnumach using a.out for a very long time. --- Makefrag.am | 2 - ddb/db_aout.c | 505 ---------------------------------------- ddb/db_aout.h | 52 ----- ddb/db_sym.c | 8 +- ddb/db_sym.h | 8 +- i386/i386at/model_dep.c | 27 --- 6 files changed, 2 insertions(+), 600 deletions(-) delete mode 100644 ddb/db_aout.c delete mode 100644 ddb/db_aout.h
diff --git a/Makefrag.am b/Makefrag.am index 128f7911..9ad3c27a 100644 --- a/Makefrag.am +++ b/Makefrag.am @@ -23,8 +23,6 @@ if enable_kdb libkernel_a_SOURCES += \ ddb/db_access.c \ ddb/db_access.h \ - ddb/db_aout.c \ - ddb/db_aout.h \ ddb/db_elf.c \ ddb/db_elf.h \ ddb/db_break.c \ diff --git a/ddb/db_aout.c b/ddb/db_aout.c deleted file mode 100644 index 7b769c1c..00000000 --- a/ddb/db_aout.c +++ /dev/null @@ -1,505 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or software.distribut...@cs.cmu.edu - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ -/* - * Author: David B. Golub, Carnegie Mellon University - * Date: 7/90 - */ - -#if MACH_KDB - -/* - * Symbol table routines for a.out format files. - */ - -#include <string.h> -#include <mach/std_types.h> -#include <machine/db_machdep.h> /* data types */ -#include <ddb/db_output.h> -#include <ddb/db_sym.h> -#include <ddb/db_aout.h> - -#ifndef DB_NO_AOUT - -#include <ddb/nlist.h> /* a.out symbol table */ -#include <ddb/stab.h> - -#define private static - -/* - * An a.out symbol table as loaded into the kernel debugger: - * - * symtab -> size of symbol entries, in bytes - * sp -> first symbol entry - * ... - * ep -> last symbol entry + 1 - * strtab == start of string table - * size of string table in bytes, - * including this word - * -> strings - */ - -/* - * Find pointers to the start and end of the symbol entries, - * given a pointer to the start of the symbol table. - */ -#define db_get_aout_symtab(symtab, sp, ep) \ - (sp = (struct nlist *)((vm_offset_t *)(symtab) + 1), \ - ep = (struct nlist *)((char *)sp + *((int*)symtab))) - -boolean_t -aout_db_sym_init( - char * symtab, /* pointer to start of symbol table */ - char * esymtab, /* pointer to end of string table, - for checking - may be rounded up to - integer boundary */ - const char * name, - char * task_addr) /* use for this task only */ -{ - struct nlist *sym_start, *sym_end; - struct nlist *sp; - char * strtab; - int strlen; - char * estrtab; - - db_get_aout_symtab(symtab, sym_start, sym_end); - - strtab = (char *)sym_end; - strlen = *(int *)strtab; - estrtab = strtab + strlen; - -#define round_to_size(x) \ - (((vm_offset_t)(x) + sizeof(vm_size_t) - 1) & ~(sizeof(vm_size_t) - 1)) - - if (round_to_size(estrtab) != round_to_size(esymtab)) { - db_printf("[ %s symbol table not valid ]\n", name); - return (FALSE); - } - -#undef round_to_size - - for (sp = sym_start; sp < sym_end; sp++) { - long strx; - strx = sp->n_un.n_strx; - if (strx != 0) { - if (strx > strlen) { - db_printf("Bad string table index (%#x)\n", strx); - sp->n_un.n_name = 0; - continue; - } - sp->n_un.n_name = strtab + strx; - } - } - - if (db_add_symbol_table(SYMTAB_AOUT, - (char *)sym_start, - (char *)sym_end, - name, - symtab, - task_addr)) - { - /* Successfully added symbol table */ - db_printf("[ preserving %d bytes of %s symbol table ]\n", - esymtab - (char *)symtab, name); - return TRUE; - } - else - return FALSE; -} - -/* - * check file name or not (check xxxx.x pattern) - */ -private boolean_t __attribute__ ((pure)) -aout_db_is_filename(const char *name) -{ - while (*name) { - if (*name == '.') { - if (name[1]) - return(TRUE); - } - name++; - } - return(FALSE); -} - -/* - * special name comparison routine with a name in the symbol table entry - */ -private boolean_t __attribute__ ((pure)) -aout_db_eq_name(const struct nlist *sp, const char * name) -{ - const char *s1, *s2; - - s1 = sp->n_un.n_name; - s2 = name; - if (*s1 == '_' && *s2 && *s2 != '_') - s1++; - while (*s2) { - if (*s1++ != *s2++) { - /* - * check .c .o file name comparison case - */ - if (*s2 == 0 && sp->n_un.n_name <= s1 - 2 - && s1[-2] == '.' && s1[-1] == 'o') - return(TRUE); - return(FALSE); - } - } - /* - * do special check for - * xxx:yyy for N_FUN - * xxx.ttt for N_DATA and N_BSS - */ - return(*s1 == 0 || (*s1 == ':' && sp->n_type == N_FUN) || - (*s1 == '.' && (sp->n_type == N_DATA || sp->n_type == N_BSS))); -} - -/* - * search a symbol table with name and type - * fp(in,out): last found text file name symbol entry - */ -private struct nlist * -aout_db_search_name( - struct nlist *sp, - const struct nlist *ep, - const char *name, - int type, - struct nlist **fp) -{ - struct nlist *file_sp = *fp; - struct nlist *found_sp = 0; - - for ( ; sp < ep; sp++) { - if (sp->n_type == N_TEXT && aout_db_is_filename(sp->n_un.n_name)) - *fp = sp; - if (type) { - if (sp->n_type == type) { - if (aout_db_eq_name(sp, name)) - return(sp); - } - if (sp->n_type == N_SO) - *fp = sp; - continue; - } - if (sp->n_type & N_STAB) - continue; - if (sp->n_un.n_name && aout_db_eq_name(sp, name)) { - /* - * In case of qaulified search by a file, - * return it immediately with some check. - * Otherwise, search external one - */ - if (file_sp) { - if ((file_sp == *fp) || (sp->n_type & N_EXT)) - return(sp); - } else if (sp->n_type & N_EXT) - return(sp); - else - found_sp = sp; - } - } - return(found_sp); -} - -/* - * search a symbol with file, func and line qualification - */ -private db_sym_t -aout_db_qualified_search( - db_symtab_t *stab, - const char *file, - const char *sym, - int line) -{ - struct nlist *sp = (struct nlist *)stab->start; - struct nlist *ep = (struct nlist *)stab->end; - struct nlist *fp = 0; - struct nlist *found_sp; - unsigned long func_top; - boolean_t in_file; - - if (file == 0 && sym == 0) - return(DB_SYM_NULL); - if (file) { - if ((sp = aout_db_search_name(sp, ep, file, N_TEXT, &fp)) == 0) - return(DB_SYM_NULL); - } - if (sym) { - sp = aout_db_search_name(sp, ep, sym, (line > 0)? N_FUN: 0, &fp); - if (sp == 0) - return(DB_SYM_NULL); - } - if (line > 0) { - if (file && !aout_db_eq_name(fp, file)) - return(DB_SYM_NULL); - found_sp = 0; - if (sp->n_type == N_FUN) { - /* - * qualified by function name - * search backward because line number entries - * for the function are above it in this case. - */ - func_top = sp->n_value; - for (sp--; sp >= (struct nlist *)stab->start; sp--) { - if (sp->n_type != N_SLINE) - continue; - if (sp->n_value < func_top) - break; - if (sp->n_desc <= line) { - if (found_sp == 0 || found_sp->n_desc < sp->n_desc) - found_sp = sp; - if (sp->n_desc == line) - break; - } - } - if (sp->n_type != N_SLINE || sp->n_value < func_top) - return(DB_SYM_NULL); - } else { - /* - * qualified by only file name - * search forward in this case - */ - in_file = TRUE; - for (sp++; sp < ep; sp++) { - if (sp->n_type == N_TEXT - && aout_db_is_filename(sp->n_un.n_name)) - break; /* enter into another file */ - if (sp->n_type == N_SOL) { - in_file = aout_db_eq_name(sp, file); - continue; - } - if (!in_file || sp->n_type != N_SLINE) - continue; - if (sp->n_desc <= line) { - if (found_sp == 0 || found_sp->n_desc < sp->n_desc) - found_sp = sp; - if (sp->n_desc == line) - break; - } - } - } - sp = found_sp; - } - return((db_sym_t) sp); -} - -/* - * lookup symbol by name - */ -db_sym_t -aout_db_lookup( - db_symtab_t *stab, - char * symstr) -{ - return(db_sym_parse_and_lookup(aout_db_qualified_search, stab, symstr)); -} - -db_sym_t -aout_db_search_symbol( - db_symtab_t * symtab, - db_addr_t off, - db_strategy_t strategy, - db_expr_t *diffp) /* in/out */ -{ - unsigned long diff = *diffp; - struct nlist *symp = 0; - struct nlist *sp, *ep; - - sp = (struct nlist *)symtab->start; - ep = (struct nlist *)symtab->end; - - for (; sp < ep; sp++) { - if (sp->n_un.n_name == 0) - continue; - if ((sp->n_type & N_STAB) != 0) - continue; - if (strategy == DB_STGY_XTRN && (sp->n_type & N_EXT) == 0) - continue; - if (off >= sp->n_value) { - - unsigned int type = sp->n_type; - - if (type == N_FN) continue; - if (off - sp->n_value < diff) { - diff = off - sp->n_value; - symp = sp; - if (diff == 0 && (type & N_EXT)) - break; - } - else if (off - sp->n_value == diff) { - if (symp == 0) - symp = sp; - else if ((symp->n_type & N_EXT) == 0 && - (type & N_EXT) != 0) - symp = sp; /* pick the external symbol */ - } - } - } - if (symp == 0) { - *diffp = off; - } - else { - *diffp = diff; - } - return ((db_sym_t)symp); -} - -/* - * Return the name and value for a symbol. - */ -void -aout_db_symbol_values( - db_symtab_t *stab, - db_sym_t sym, - char **namep, - db_expr_t *valuep) -{ - struct nlist *sp; - - sp = (struct nlist *)sym; - if (namep) - *namep = sp->n_un.n_name; - if (valuep) - *valuep = sp->n_value; -} - -#define X_DB_MAX_DIFF 8 /* maximum allowable diff at the end of line */ - -/* - * search symbol by value - */ -private boolean_t -aout_db_search_by_addr( - const db_symtab_t *stab, - vm_offset_t addr, - char **file, - char **func, - int *line, - unsigned long *diff) -{ - struct nlist *sp; - struct nlist *line_sp, *func_sp, *file_sp, *line_func; - vm_size_t func_diff, line_diff; - boolean_t found_line = FALSE; - struct nlist *ep = (struct nlist *)stab->end; - - line_sp = func_sp = file_sp = line_func = 0; - *file = *func = 0; - *line = 0; - func_diff = line_diff = ~0; - for (sp = (struct nlist *)stab->start; sp < ep; sp++) { - switch(sp->n_type) { - case N_SLINE: - if (sp->n_value <= addr) { - if (line_sp == 0 || line_diff >= addr - sp->n_value) { - if (line_func) - line_func = 0; - line_sp = sp; - line_diff = addr - sp->n_value; - } - } - if (sp->n_value >= addr && line_sp) - found_line = TRUE; - continue; - case N_FUN: - if ((found_line || (line_sp && line_diff < X_DB_MAX_DIFF)) - && line_func == 0) - line_func = sp; - continue; - case N_SO: - if (sp->n_value > addr) - continue; - if (file_sp == 0 || file_sp->n_value <= sp->n_value) - file_sp = sp; - continue; - case N_TEXT: - if (aout_db_is_filename(sp->n_un.n_name)) { - if (sp->n_value > addr) - continue; - if (file_sp == 0 || file_sp->n_value <= sp->n_value) - file_sp = sp; - } else if (sp->n_value <= addr && - (func_sp == 0 || func_diff > addr - sp->n_value)) { - func_sp = sp; - func_diff = addr - sp->n_value; - } - continue; - case N_TEXT|N_EXT: - if (sp->n_value <= addr && - (func_sp == 0 || func_diff >= addr - sp->n_value)) { - func_sp = sp; - func_diff = addr - sp->n_value; - if (func_diff == 0 && file_sp && func_sp) - break; - } - default: - continue; - } - break; - } - if (line_sp) { - if (line_func == 0 || func_sp == 0 - || line_func->n_value != func_sp->n_value) - line_sp = 0; - } - if (file_sp) { - *diff = addr - file_sp->n_value; - *file = file_sp->n_un.n_name; - } - if (func_sp) { - *diff = addr - func_sp->n_value; - *func = (func_sp->n_un.n_name[0] == '_')? - func_sp->n_un.n_name + 1: func_sp->n_un.n_name; - } - if (line_sp) { - *diff = addr - line_sp->n_value; - *line = line_sp->n_desc; - } - return(file_sp || func_sp || line_sp); -} - -/* - * Find filename and lineno within, given the current pc. - */ -boolean_t -aout_db_line_at_pc( - db_symtab_t *stab, - db_sym_t sym, - char **file, - int *line, - db_addr_t pc) -{ - char *func; - unsigned long diff; - boolean_t found; - - found = aout_db_search_by_addr(stab, pc, file, &func, line, &diff); - return(found && func && *file); -} - -#endif /* DB_NO_AOUT */ - -#endif /* MACH_KDB */ diff --git a/ddb/db_aout.h b/ddb/db_aout.h deleted file mode 100644 index 7c03d36d..00000000 --- a/ddb/db_aout.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2013 Free Software Foundation. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifndef _DDB_DB_AOUT_H_ -#define _DDB_DB_AOUT_H_ - -#include <ddb/db_sym.h> -#include <machine/db_machdep.h> - -extern boolean_t -aout_db_line_at_pc( - db_symtab_t *stab, - db_sym_t sym, - char **file, - int *line, - db_addr_t pc); - -extern db_sym_t -aout_db_lookup( - db_symtab_t *stab, - char * symstr); - -extern db_sym_t -aout_db_search_symbol( - db_symtab_t * symtab, - db_addr_t off, - db_strategy_t strategy, - db_expr_t *diffp); - -extern void -aout_db_symbol_values( - db_symtab_t *stab, - db_sym_t sym, - char **namep, - db_expr_t *valuep); - -#endif /* _DDB_DB_AOUT_H_ */ diff --git a/ddb/db_sym.c b/ddb/db_sym.c index a247b645..f0adb0c2 100644 --- a/ddb/db_sym.c +++ b/ddb/db_sym.c @@ -37,7 +37,6 @@ #include <ddb/db_output.h> #include <ddb/db_sym.h> #include <ddb/db_task_thread.h> -#include <ddb/db_aout.h> #include <ddb/db_elf.h> #include <vm/vm_map.h> /* vm_map_t */ @@ -513,13 +512,8 @@ static boolean_t dummy_db_sym_init(char *a, char *b, const char *c, char *d) { struct db_sym_switch x_db[] = { - /* BSD a.out format (really, sdb/dbx(1) symtabs) */ -#ifdef DB_NO_AOUT + /* BSD a.out format (really, sdb/dbx(1) symtabs) not supported */ { 0,}, -#else /* DB_NO_AOUT */ - { aout_db_sym_init, aout_db_lookup, aout_db_search_symbol, - aout_db_line_at_pc, aout_db_symbol_values, dummy_db_free_symbol }, -#endif /* DB_NO_AOUT */ { 0,}, diff --git a/ddb/db_sym.h b/ddb/db_sym.h index bc8a10dd..20450f64 100644 --- a/ddb/db_sym.h +++ b/ddb/db_sym.h @@ -222,7 +222,7 @@ extern struct db_sym_switch { } x_db[]; #ifndef symtab_type -#define symtab_type(s) SYMTAB_AOUT +#define symtab_type(s) SYMTAB_ELF #endif #define X_db_sym_init(s,e,n,t) x_db[symtab_type(s)].init(s,e,n,t) @@ -238,12 +238,6 @@ extern boolean_t db_line_at_pc( int *linenum, db_addr_t pc); -extern boolean_t aout_db_sym_init( - char *symtab, - char *esymtab, - const char *name, - char *task_addr); - extern boolean_t elf_db_sym_init ( unsigned shdr_num, vm_size_t shdr_size, diff --git a/i386/i386at/model_dep.c b/i386/i386at/model_dep.c index 98408c06..3a4b41a1 100644 --- a/i386/i386at/model_dep.c +++ b/i386/i386at/model_dep.c @@ -94,18 +94,12 @@ #include <ddb/db_sym.h> #include <i386/db_interface.h> -/* a.out symbol table */ -static vm_offset_t kern_sym_start, kern_sym_end; - /* ELF section header */ static unsigned elf_shdr_num; static vm_size_t elf_shdr_size; static vm_offset_t elf_shdr_addr; static unsigned elf_shdr_shndx; -#else /* MACH_KDB */ -#define kern_sym_start 0 -#define kern_sym_end 0 #endif /* MACH_KDB */ #define RESERVED_BIOS 0x10000 @@ -522,22 +516,6 @@ void c_boot_entry(vm_offset_t bi) * We need to do this before i386at_init() * so that the symbol table's memory won't be stomped on. */ - if ((boot_info.flags & MULTIBOOT_AOUT_SYMS) - && boot_info.shdr_addr) - { - vm_size_t symtab_size, strtab_size; - - /* For simplicity we just use a simple boot_info_raw structure for elf */ - kern_sym_start = (vm_offset_t)phystokv(boot_info.shdr_addr); - symtab_size = (vm_offset_t)phystokv(boot_info.shdr_num); - strtab_size = (vm_offset_t)phystokv(boot_info.shdr_size); - kern_sym_end = kern_sym_start + 4 + symtab_size + strtab_size; - - printf("kernel symbol table at %08" PRIxPTR "-%08" PRIxPTR " (%ld,%ld)\n", - kern_sym_start, kern_sym_end, - (unsigned long) symtab_size, (unsigned long) strtab_size); - } - if ((boot_info.flags & MULTIBOOT_ELF_SHDR) && boot_info.shdr_num) { @@ -562,11 +540,6 @@ void c_boot_entry(vm_offset_t bi) /* * Initialize the kernel debugger's kernel symbol table. */ - if (kern_sym_start) - { - aout_db_sym_init((char *)kern_sym_start, (char *)kern_sym_end, "mach", (char *)0); - } - if (elf_shdr_num) { elf_db_sym_init(elf_shdr_num,elf_shdr_size, -- 2.39.0