|
|
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 <coff.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: VERBOSE( puts("COFF! COFF!\r\n"); ); ! 35: retval = ! 36: coff2load(ip, table, data_seg); ! 37: break; ! 38: ! 39: /* Is this an l.out executable? */ ! 40: case L_MAGIC: ! 41: VERBOSE( puts("l.out!\r\n"); ); ! 42: retval = ! 43: lout2load(ip, table, data_seg); ! 44: break; ! 45: ! 46: default: ! 47: retval = FALSE; ! 48: break; ! 49: } /* switch (magic) */ ! 50: ! 51: return (retval); ! 52: } /* object2load() */ ! 53: ! 54: ! 55: /* Look up symbol(s) in an object file. ! 56: * searches the name list (symbol table) of the load module ! 57: * "filename" for each symbol in the array pointed to by "nlp". ! 58: * ! 59: * nlp points to an array of nlist structures, terminated by a ! 60: * structure with a null string as its n_name member. ! 61: * ! 62: * If "filename" is not a load module or has had its symbol table ! 63: * stripped, all returned n_type and n_value entries will be zero. ! 64: * ! 65: */ ! 66: ! 67: uint16 ! 68: object_nlist(magic, filename, symbol) ! 69: uint16 magic; ! 70: char *filename; ! 71: char *symbol; ! 72: { ! 73: uint32 tmp; ! 74: unsigned int retval; /* Return value. */ ! 75: ! 76: switch (magic) { ! 77: /* Is this an i386 COFF executable? */ ! 78: case I386MAGIC: ! 79: /* Check that offset into data segment is < 64K. */ ! 80: if ((tmp = wrap_coffnlist(filename, symbol)) > MAXUINT16) { ! 81: puts("object_nlist(): ERROR: Symbol "); ! 82: puts(symbol); ! 83: puts(" will not fit into 16 bits.\r\n"); ! 84: puts(symbol); puts("="); ! 85: print32(tmp); ! 86: puts("\r\n"); ! 87: ! 88: retval = 0; ! 89: } else { ! 90: retval = (uint16) tmp; ! 91: } ! 92: break; ! 93: ! 94: /* Is this an l.out executable? */ ! 95: case L_MAGIC: ! 96: retval = wrap_l_out_nlist(filename, symbol); ! 97: break; ! 98: ! 99: default: ! 100: break; ! 101: } /* switch (magic) */ ! 102: ! 103: return (retval); ! 104: } /* object_nlist() */ ! 105: ! 106: ! 107: /* Determine the value for sys_base based on the type of the load file. */ ! 108: uint16 ! 109: object_sys_base(magic) ! 110: int magic; ! 111: { ! 112: uint16 retval; ! 113: ! 114: switch (magic) { ! 115: /* Is this an i386 COFF executable? */ ! 116: case I386MAGIC: ! 117: retval = COFF_SYS_BASE; ! 118: break; ! 119: ! 120: /* Is this an l.out executable? */ ! 121: case L_MAGIC: ! 122: retval = DEF_SYS_BASE; ! 123: break; ! 124: ! 125: default: ! 126: break; ! 127: } /* switch (magic) */ ! 128: ! 129: return(retval); ! 130: } /* object_sys_base() */ ! 131: ! 132: #ifdef TEST ! 133: main() ! 134: { ! 135: printf("pipdev: %x", object_nlist(I386MAGIC, "/at386", "pipedev")); ! 136: } /* main () */ ! 137: ! 138: #endif /* TEST */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.