Annotation of coherent/d/conf/old_tboot/objects.c, revision 1.1.1.1

1.1       root        1: /* objects.c -- routines for handling different object formats.
                      2:  * Currently, only COFF and COHERENT l.out are supported.
                      3:  */
                      4: #include <sys/inode.h>
                      5: #include <sys/types.h>
                      6: #include <l.out.h>
                      7: #include <filehdr.h>   /* COFF */
                      8: 
                      9: #include "tboot.h"
                     10: 
                     11: /* Extract information from an object file that describes how to
                     12:  * load an executable.
                     13:  * The magic number of the file is in "magic".
                     14:  * The object file's inode is in "ip".
                     15:  *
                     16:  * The information needed is extracted into "table".
                     17:  * The value for the data segment is put in "data_seg".
                     18:  *
                     19:  * Returns TRUE if the needed information could be extracted, FALSE ow.
                     20:  */
                     21: 
                     22: int
                     23: object2load(magic, ip, table, data_seg)
                     24:        uint16 magic;
                     25:        struct inode *ip;
                     26:        struct load_segment table[];
                     27:        uint16 *data_seg;
                     28: {
                     29:        int retval;
                     30: 
                     31:        switch (magic) {
                     32:        /* Is this an i386 COFF executable?  */
                     33:        case I386MAGIC:
                     34: #ifdef VERBOSE
                     35:                puts("COFF!  COFF!\r\n");
                     36: #endif
                     37:                retval = 
                     38:                        coff2load(ip, table, data_seg);
                     39:                break;
                     40:                
                     41:        /* Is this an l.out executable?  */
                     42:        case L_MAGIC:
                     43: #ifdef VERBOSE
                     44:                puts("l.out!\r\n");
                     45: #endif
                     46:                retval =
                     47:                        lout2load(ip, table, data_seg);
                     48:                break;
                     49:        
                     50:        default:
                     51:                retval = (1==2);
                     52:                break;
                     53:        } /* switch (magic) */
                     54: 
                     55:        return (retval);
                     56: } /* object2load() */
                     57: 
                     58: 
                     59: /* Look up symbol(s) in an object file. 
                     60:  * searches  the name list  (symbol table) of  the load module
                     61:  * "filename" for each symbol in the array pointed to by "nlp".
                     62:  *
                     63:  * nlp points to an array of nlist structures, terminated by a
                     64:  * structure with a null string as its n_name member.
                     65:  *
                     66:  * If "filename" is not a load module or has had its symbol table
                     67:  * stripped, all returned n_type and n_value entries will be zero.
                     68:  *
                     69:  */
                     70: 
                     71: uint16
                     72: object_nlist(magic, filename, symbol)
                     73:        uint16 magic;
                     74:        char *filename;
                     75:        char *symbol;
                     76: {
                     77:        uint32 tmp;
                     78:        unsigned int retval;            /* Return value.  */
                     79:        struct nlist nlp[2];            /* For talking with l_out_nlist().  */
                     80: 
                     81:        switch (magic) {
                     82:        /* Is this an i386 COFF executable?  */
                     83:        case I386MAGIC:
                     84:                /* Check that offset into data segment is < 64K.  */
                     85:                if ((tmp = wrap_coffnlist(filename, symbol)) > MAXUINT16) {
                     86:                        puts("object_nlist(): ERROR: Symbol ");
                     87:                        puts(symbol);
                     88:                        puts(" will not fit into 16 bits.\r\n");
                     89:                        puts(symbol); puts("=");
                     90:                        print32(tmp);
                     91:                        puts("\r\n");
                     92:                        
                     93:                        retval = 0;
                     94:                } else {
                     95:                        retval = (uint16) tmp;
                     96:                }
                     97:                break;
                     98:                
                     99:        /* Is this an l.out executable?  */
                    100:        case L_MAGIC:
                    101:                strcpy(nlp[0].n_name, symbol);
                    102:                strcat(nlp[0].n_name, "_");
                    103:                nlp[1].n_name[0] = '\0';
                    104:                l_out_nlist(filename, nlp);
                    105:                retval = nlp[0].n_value;
                    106:                break;
                    107:        
                    108:        default:
                    109:                break;
                    110:        } /* switch (magic) */
                    111: 
                    112:        return (retval);
                    113: } /* object_nlist() */
                    114: 
                    115: 
                    116: /* Determine the value for sys_base based on the type of the load file.  */
                    117: uint16
                    118: object_sys_base(magic)
                    119:        int magic;
                    120: {
                    121:        uint16 retval;
                    122: 
                    123:        switch (magic) {
                    124:        /* Is this an i386 COFF executable?  */
                    125:        case I386MAGIC:
                    126:                retval = COFF_SYS_BASE;
                    127:                break;
                    128:                
                    129:        /* Is this an l.out executable?  */
                    130:        case L_MAGIC:
                    131:                retval = DEF_SYS_BASE;
                    132:                break;
                    133:        
                    134:        default:
                    135:                break;
                    136:        } /* switch (magic) */
                    137: 
                    138:        return(retval);
                    139: } /* object_sys_base() */
                    140: 
                    141: #ifdef TEST
                    142: main()
                    143: {
                    144:        printf("pipdev: %x", object_nlist(I386MAGIC, "/at386", "pipedev"));
                    145: } /* main () */
                    146: 
                    147: #endif /* TEST */

unix.superglobalmegacorp.com

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