1 /* $NetBSD: aout.c,v 1.12 2009/03/18 16:00:10 cegger Exp $ */ 2 3 /*- 4 * Copyright (c) 1998 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Leo Weppelman. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 33 #ifdef TOSTOOLS 34 #include <stdio.h> 35 #include <stdlib.h> 36 #include <unistd.h> 37 #include <string.h> 38 #include <sys/types.h> 39 #include <a_out.h> 40 41 #define MALLOC(x) malloc(x) 42 43 #else 44 45 #include <lib/libsa/stand.h> 46 #include <atari_stand.h> 47 #include <libkern.h> 48 #include <sys/exec_aout.h> 49 50 #define MALLOC(x) alloc(x) 51 #endif 52 53 #include "libtos.h" 54 #include "kparamb.h" 55 #include "tosdefs.h" 56 #include "cread.h" 57 58 59 #ifdef TOSTOOLS 60 /* 61 * Assume compiling under TOS or MINT. The page-size will always 62 * be incorrect then (if it is defined anyway). 63 */ 64 #ifdef AOUT_LDPGSZ 65 #undef AOUT_LDPGSZ 66 #endif 67 68 #define AOUT_LDPGSZ (8*1024) /* Page size for NetBSD */ 69 70 #endif /* TOSTOOLS */ 71 72 /* 73 * Load an a.out image. 74 * Exit codes: 75 * -1 : Not an a.outfile 76 * 0 : OK 77 * error# : Error during load (*errp might contain error string). 78 */ 79 int 80 aout_load(int fd, osdsc_t *od, char **errp, int loadsyms) 81 { 82 long textsz, stringsz; 83 struct exec ehdr; 84 int err; 85 86 *errp = NULL; 87 88 lseek(fd, (off_t)0, SEEK_SET); 89 if (read(fd, (char *)&ehdr, sizeof(ehdr)) != sizeof(ehdr)) 90 return -1; 91 92 #ifdef TOSTOOLS 93 if ((ehdr.a_magic & 0xffff) != NMAGIC) 94 return -1; 95 #else 96 if ((N_GETMAGIC(ehdr) != NMAGIC) && (N_GETMAGIC(ehdr) != OMAGIC)) 97 return -1; 98 #endif 99 100 /* 101 * Extract various sizes from the kernel executable 102 */ 103 textsz = (ehdr.a_text + AOUT_LDPGSZ - 1) & ~(AOUT_LDPGSZ - 1); 104 od->k_esym = 0; 105 od->ksize = textsz + ehdr.a_data + ehdr.a_bss; 106 od->kentry = ehdr.a_entry; 107 108 if (loadsyms && ehdr.a_syms) { 109 err = 1; 110 if (lseek(fd, ehdr.a_text+ehdr.a_data+ehdr.a_syms+sizeof(ehdr), 111 0) <= 0) 112 goto error; 113 err = 2; 114 if (read(fd, (char *)&stringsz, sizeof(long)) != sizeof(long)) 115 goto error; 116 err = 3; 117 if (lseek(fd, sizeof(ehdr), 0) <= 0) 118 goto error; 119 od->ksize += ehdr.a_syms + sizeof(long) + stringsz; 120 } 121 122 err = 4; 123 if ((od->kstart = (u_char *)MALLOC(od->ksize)) == NULL) 124 goto error; 125 126 /* 127 * Read text & data, clear bss 128 */ 129 err = 5; 130 if ((read(fd, (char *)(od->kstart), ehdr.a_text) != ehdr.a_text) 131 ||(read(fd,(char *)(od->kstart+textsz),ehdr.a_data) != ehdr.a_data)) 132 goto error; 133 memset(od->kstart + textsz + ehdr.a_data, 0, ehdr.a_bss); 134 135 /* 136 * Read symbol and string table 137 */ 138 if (loadsyms && ehdr.a_syms) { 139 long *p; 140 141 p = (long *)((od->kstart) + textsz + ehdr.a_data + ehdr.a_bss); 142 *p++ = ehdr.a_syms; 143 err = 6; 144 if (read(fd, (char *)p, ehdr.a_syms) != ehdr.a_syms) 145 goto error; 146 p = (long *)((char *)p + ehdr.a_syms); 147 err = 7; 148 if (read(fd, (char *)p, stringsz) != stringsz) 149 goto error; 150 od->k_esym = (long)((char *)p-(char *)od->kstart +stringsz); 151 } 152 return 0; 153 154 error: 155 #ifdef TOSTOOLS 156 { 157 static char *errs[] = { 158 /* 1 */ "Cannot seek to string table", 159 /* 2 */ "Cannot read string-table size", 160 /* 3 */ "Cannot seek back to text start", 161 /* 4 */ "Cannot malloc kernel image space", 162 /* 5 */ "Unable to read kernel image", 163 /* 6 */ "Cannot read symbol table", 164 /* 7 */ "Cannot read string table" 165 }; 166 *errp = errs[err]; 167 } 168 #endif /* TOSTOOLS */ 169 170 return err; 171 } 172