Coherent4.2.10/tboot/objects.c
/* objects.c -- routines for handling different object formats.
* Currently, only COFF and COHERENT l.out are supported.
*/
#include <sys/inode.h>
#include <sys/types.h>
#include <l.out.h>
#include <coff.h> /* COFF */
#include "tboot.h"
/* Extract information from an object file that describes how to
* load an executable.
* The magic number of the file is in "magic".
* The object file's inode is in "ip".
*
* The information needed is extracted into "table".
* The value for the data segment is put in "data_seg".
*
* Returns TRUE if the needed information could be extracted, FALSE ow.
*/
int
object2load(magic, ip, table, data_seg)
uint16 magic;
struct inode *ip;
struct load_segment table[];
uint16 *data_seg;
{
int retval;
switch (magic) {
/* Is this an i386 COFF executable? */
case I386MAGIC:
VERBOSE( puts("COFF! COFF!\r\n"); );
retval =
coff2load(ip, table, data_seg);
break;
/* Is this an l.out executable? */
case L_MAGIC:
VERBOSE( puts("l.out!\r\n"); );
retval =
lout2load(ip, table, data_seg);
break;
default:
retval = FALSE;
break;
} /* switch (magic) */
return (retval);
} /* object2load() */
/* Look up symbol(s) in an object file.
* searches the name list (symbol table) of the load module
* "filename" for each symbol in the array pointed to by "nlp".
*
* nlp points to an array of nlist structures, terminated by a
* structure with a null string as its n_name member.
*
* If "filename" is not a load module or has had its symbol table
* stripped, all returned n_type and n_value entries will be zero.
*
*/
uint16
object_nlist(magic, filename, symbol)
uint16 magic;
char *filename;
char *symbol;
{
uint32 tmp;
unsigned int retval; /* Return value. */
switch (magic) {
/* Is this an i386 COFF executable? */
case I386MAGIC:
/* Check that offset into data segment is < 64K. */
if ((tmp = wrap_coffnlist(filename, symbol)) > MAXUINT16) {
puts("object_nlist(): ERROR: Symbol ");
puts(symbol);
puts(" will not fit into 16 bits.\r\n");
puts(symbol); puts("=");
print32(tmp);
puts("\r\n");
retval = 0;
} else {
retval = (uint16) tmp;
}
break;
/* Is this an l.out executable? */
case L_MAGIC:
retval = wrap_l_out_nlist(filename, symbol);
break;
default:
break;
} /* switch (magic) */
return (retval);
} /* object_nlist() */
/* Determine the value for sys_base based on the type of the load file. */
uint16
object_sys_base(magic)
int magic;
{
uint16 retval;
switch (magic) {
/* Is this an i386 COFF executable? */
case I386MAGIC:
retval = COFF_SYS_BASE;
break;
/* Is this an l.out executable? */
case L_MAGIC:
retval = DEF_SYS_BASE;
break;
default:
break;
} /* switch (magic) */
return(retval);
} /* object_sys_base() */
#ifdef TEST
main()
{
printf("pipdev: %x", object_nlist(I386MAGIC, "/at386", "pipedev"));
} /* main () */
#endif /* TEST */