Annotation of Net2/ddb/db_aout.c, revision 1.1

1.1     ! root        1: /* 
        !             2:  * Mach Operating System
        !             3:  * Copyright (c) 1991,1990 Carnegie Mellon University
        !             4:  * All Rights Reserved.
        !             5:  * 
        !             6:  * Permission to use, copy, modify and distribute this software and its
        !             7:  * documentation is hereby granted, provided that both the copyright
        !             8:  * notice and this permission notice appear in all copies of the
        !             9:  * software, derivative works or modified versions, and any portions
        !            10:  * thereof, and that both notices appear in supporting documentation.
        !            11:  * 
        !            12:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS 
        !            13:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
        !            14:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
        !            15:  * 
        !            16:  * Carnegie Mellon requests users of this software to return to
        !            17:  * 
        !            18:  *  Software Distribution Coordinator  or  [email protected]
        !            19:  *  School of Computer Science
        !            20:  *  Carnegie Mellon University
        !            21:  *  Pittsburgh PA 15213-3890
        !            22:  * 
        !            23:  * any improvements or extensions that they make and grant Carnegie the
        !            24:  * rights to redistribute these changes.
        !            25:  */
        !            26: /*
        !            27:  * HISTORY
        !            28:  * $Log: db_aout.c,v $
        !            29:  * Revision 1.1  1992/03/25  21:44:55  pace
        !            30:  * Initial revision
        !            31:  *
        !            32:  * Revision 2.3  91/02/05  17:05:55  mrt
        !            33:  *     Changed to new Mach copyright
        !            34:  *     [91/01/31  16:16:44  mrt]
        !            35:  * 
        !            36:  * Revision 2.2  90/08/27  21:48:35  dbg
        !            37:  *     Created.
        !            38:  *     [90/08/17            dbg]
        !            39:  * 
        !            40:  */
        !            41: /*
        !            42:  *     Author: David B. Golub, Carnegie Mellon University
        !            43:  *     Date:   7/90
        !            44:  */
        !            45: /*
        !            46:  * Symbol table routines for a.out format files.
        !            47:  */
        !            48: 
        !            49: #include "param.h"
        !            50: #include "proc.h"
        !            51: #include <machine/db_machdep.h>                /* data types */
        !            52: #include <ddb/db_sym.h>
        !            53: 
        !            54: #ifndef        DB_NO_AOUT
        !            55: 
        !            56: #define _AOUT_INCLUDE_
        !            57: #include "nlist.h"
        !            58: 
        !            59: /*
        !            60:  * An a.out symbol table as loaded into the kernel debugger:
        !            61:  *
        !            62:  * symtab      -> size of symbol entries, in bytes
        !            63:  * sp          -> first symbol entry
        !            64:  *                ...
        !            65:  * ep          -> last symbol entry + 1
        !            66:  * strtab      == start of string table
        !            67:  *                size of string table in bytes,
        !            68:  *                including this word
        !            69:  *             -> strings
        !            70:  */
        !            71: 
        !            72: /*
        !            73:  * Find pointers to the start and end of the symbol entries,
        !            74:  * given a pointer to the start of the symbol table.
        !            75:  */
        !            76: #define        db_get_aout_symtab(symtab, sp, ep) \
        !            77:        (sp = (struct nlist *)((symtab) + 1), \
        !            78:         ep = (struct nlist *)((char *)sp + *(symtab)))
        !            79: 
        !            80: #define SYMTAB_SPACE 63000
        !            81: int db_symtabsize = SYMTAB_SPACE;
        !            82: char db_symtab[SYMTAB_SPACE] = { 1 };
        !            83: 
        !            84: X_db_sym_init(symtab, esymtab, name)
        !            85:        int *   symtab;         /* pointer to start of symbol table */
        !            86:        char *  esymtab;        /* pointer to end of string table,
        !            87:                                   for checking - rounded up to integer
        !            88:                                   boundary */
        !            89:        char *  name;
        !            90: {
        !            91:        register struct nlist   *sym_start, *sym_end;
        !            92:        register struct nlist   *sp;
        !            93:        register char * strtab;
        !            94:        register int    strlen;
        !            95: 
        !            96:        if (*symtab < 4) {
        !            97:                printf ("DDB: no symbols\n");
        !            98:                return;
        !            99:        }
        !           100: 
        !           101:        db_get_aout_symtab(symtab, sym_start, sym_end);
        !           102: 
        !           103:        strtab = (char *)sym_end;
        !           104:        strlen = *(int *)strtab;
        !           105: 
        !           106: #if 0
        !           107:        if (strtab + ((strlen + sizeof(int) - 1) & ~(sizeof(int)-1))
        !           108:            != esymtab)
        !           109:        {
        !           110:            db_printf("[ %s symbol table not valid ]\n", name);
        !           111:            return;
        !           112:        }
        !           113: 
        !           114:        db_printf("[ preserving %#x bytes of %s symbol table ]\n",
        !           115:                esymtab - (char *)symtab, name);
        !           116: #endif
        !           117: 
        !           118:        for (sp = sym_start; sp < sym_end; sp++) {
        !           119:            register int strx;
        !           120:            strx = sp->n_un.n_strx;
        !           121:            if (strx != 0) {
        !           122:                if (strx > strlen) {
        !           123:                    db_printf("Bad string table index (%#x)\n", strx);
        !           124:                    sp->n_un.n_name = 0;
        !           125:                    continue;
        !           126:                }
        !           127:                sp->n_un.n_name = strtab + strx;
        !           128:            }
        !           129:        }
        !           130: 
        !           131:        db_add_symbol_table(sym_start, sym_end, name, (char *)symtab);
        !           132: }
        !           133: 
        !           134: db_sym_t
        !           135: X_db_lookup(stab, symstr)
        !           136:        db_symtab_t     *stab;
        !           137:        char *          symstr;
        !           138: {
        !           139:        register struct nlist *sp, *ep;
        !           140: 
        !           141:        sp = (struct nlist *)stab->start;
        !           142:        ep = (struct nlist *)stab->end;
        !           143: 
        !           144:        for (; sp < ep; sp++) {
        !           145:            if (sp->n_un.n_name == 0)
        !           146:                continue;
        !           147:            if ((sp->n_type & N_STAB) == 0 &&
        !           148:                sp->n_un.n_name != 0 &&
        !           149:                db_eqname(sp->n_un.n_name, symstr, '_'))
        !           150:            {
        !           151:                return ((db_sym_t)sp);
        !           152:            }
        !           153:        }
        !           154:        return ((db_sym_t)0);
        !           155: }
        !           156: 
        !           157: db_sym_t
        !           158: X_db_search_symbol(symtab, off, strategy, diffp)
        !           159:        db_symtab_t *   symtab;
        !           160:        register
        !           161:        db_addr_t       off;
        !           162:        db_strategy_t   strategy;
        !           163:        db_expr_t       *diffp;         /* in/out */
        !           164: {
        !           165:        register unsigned int   diff = *diffp;
        !           166:        register struct nlist   *symp = 0;
        !           167:        register struct nlist   *sp, *ep;
        !           168: 
        !           169:        sp = (struct nlist *)symtab->start;
        !           170:        ep = (struct nlist *)symtab->end;
        !           171: 
        !           172:        for (; sp < ep; sp++) {
        !           173:            if (sp->n_un.n_name == 0)
        !           174:                continue;
        !           175:            if ((sp->n_type & N_STAB) != 0)
        !           176:                continue;
        !           177:            if (off >= sp->n_value) {
        !           178:                if (off - sp->n_value < diff) {
        !           179:                    diff = off - sp->n_value;
        !           180:                    symp = sp;
        !           181:                    if (diff == 0)
        !           182:                        break;
        !           183:                }
        !           184:                else if (off - sp->n_value == diff) {
        !           185:                    if (symp == 0)
        !           186:                        symp = sp;
        !           187:                    else if ((symp->n_type & N_EXT) == 0 &&
        !           188:                                (sp->n_type & N_EXT) != 0)
        !           189:                        symp = sp;      /* pick the external symbol */
        !           190:                }
        !           191:            }
        !           192:        }
        !           193:        if (symp == 0) {
        !           194:            *diffp = off;
        !           195:        }
        !           196:        else {
        !           197:            *diffp = diff;
        !           198:        }
        !           199:        return ((db_sym_t)symp);
        !           200: }
        !           201: 
        !           202: /*
        !           203:  * Return the name and value for a symbol.
        !           204:  */
        !           205: void
        !           206: X_db_symbol_values(sym, namep, valuep)
        !           207:        db_sym_t        sym;
        !           208:        char            **namep;
        !           209:        db_expr_t       *valuep;
        !           210: {
        !           211:        register struct nlist *sp;
        !           212: 
        !           213:        sp = (struct nlist *)sym;
        !           214:        if (namep)
        !           215:            *namep = sp->n_un.n_name;
        !           216:        if (valuep)
        !           217:            *valuep = sp->n_value;
        !           218: }
        !           219: 
        !           220: boolean_t
        !           221: X_db_line_at_pc()
        !           222: {
        !           223:        return (FALSE);
        !           224: }
        !           225: 
        !           226: /*
        !           227:  * Initialization routine for a.out files.
        !           228:  */
        !           229: kdb_init()
        !           230: {
        !           231: #if 0
        !           232:        extern char     *esym;
        !           233:        extern int      end;
        !           234: 
        !           235:        if (esym > (char *)&end) {
        !           236:            X_db_sym_init((int *)&end, esym, "mach");
        !           237:        }
        !           238: #endif
        !           239: 
        !           240:        X_db_sym_init (db_symtab, 0, "mach");
        !           241: }
        !           242: 
        !           243: #if 0
        !           244: /*
        !           245:  * Read symbol table from file.
        !           246:  * (should be somewhere else)
        !           247:  */
        !           248: #include <boot_ufs/file_io.h>
        !           249: #include <vm/vm_kern.h>
        !           250: 
        !           251: read_symtab_from_file(fp, symtab_name)
        !           252:        struct file     *fp;
        !           253:        char *          symtab_name;
        !           254: {
        !           255:        vm_size_t       resid;
        !           256:        kern_return_t   result;
        !           257:        vm_offset_t     symoff;
        !           258:        vm_size_t       symsize;
        !           259:        vm_offset_t     stroff;
        !           260:        vm_size_t       strsize;
        !           261:        vm_size_t       table_size;
        !           262:        vm_offset_t     symtab;
        !           263: 
        !           264:        if (!get_symtab(fp, &symoff, &symsize)) {
        !           265:            boot_printf("[ error %d reading %s file header ]\n",
        !           266:                        result, symtab_name);
        !           267:            return;
        !           268:        }
        !           269: 
        !           270:        stroff = symoff + symsize;
        !           271:        result = read_file(fp, (vm_offset_t)stroff,
        !           272:                        (vm_offset_t)&strsize, sizeof(strsize), &resid);
        !           273:        if (result || resid) {
        !           274:            boot_printf("[ no valid symbol table present for %s ]\n",
        !           275:                symtab_name);
        !           276:                return;
        !           277:        }
        !           278: 
        !           279:        table_size = sizeof(int) + symsize + strsize;
        !           280:        table_size = (table_size + sizeof(int)-1) & ~(sizeof(int)-1);
        !           281: 
        !           282:        symtab = kmem_alloc_wired(kernel_map, table_size);
        !           283: 
        !           284:        *(int *)symtab = symsize;
        !           285: 
        !           286:        result = read_file(fp, symoff,
        !           287:                        symtab + sizeof(int), symsize, &resid);
        !           288:        if (result || resid) {
        !           289:            boot_printf("[ error %d reading %s symbol table ]\n",
        !           290:                        result, symtab_name);
        !           291:            return;
        !           292:        }
        !           293: 
        !           294:        result = read_file(fp, stroff,
        !           295:                        symtab + sizeof(int) + symsize, strsize, &resid);
        !           296:        if (result || resid) {
        !           297:            boot_printf("[ error %d reading %s string table ]\n",
        !           298:                        result, symtab_name);
        !           299:            return;
        !           300:        }
        !           301: 
        !           302:        X_db_sym_init((int *)symtab,
        !           303:                        (char *)(symtab + table_size),
        !           304:                        symtab_name);
        !           305:        
        !           306: }
        !           307: #endif
        !           308: 
        !           309: #endif /* DB_NO_AOUT */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.