Home | History | Annotate | Line # | Download | only in libsa
loadfile_aout.c revision 1.12.10.2
      1  1.12.10.2     yamt /* $NetBSD: loadfile_aout.c,v 1.12.10.2 2009/08/19 18:48:21 yamt Exp $ */
      2        1.1  thorpej 
      3        1.1  thorpej /*-
      4        1.1  thorpej  * Copyright (c) 1997 The NetBSD Foundation, Inc.
      5        1.1  thorpej  * All rights reserved.
      6        1.1  thorpej  *
      7        1.1  thorpej  * This code is derived from software contributed to The NetBSD Foundation
      8        1.1  thorpej  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
      9        1.1  thorpej  * NASA Ames Research Center and by Christos Zoulas.
     10        1.1  thorpej  *
     11        1.1  thorpej  * Redistribution and use in source and binary forms, with or without
     12        1.1  thorpej  * modification, are permitted provided that the following conditions
     13        1.1  thorpej  * are met:
     14        1.1  thorpej  * 1. Redistributions of source code must retain the above copyright
     15        1.1  thorpej  *    notice, this list of conditions and the following disclaimer.
     16        1.1  thorpej  * 2. Redistributions in binary form must reproduce the above copyright
     17        1.1  thorpej  *    notice, this list of conditions and the following disclaimer in the
     18        1.1  thorpej  *    documentation and/or other materials provided with the distribution.
     19        1.1  thorpej  *
     20        1.1  thorpej  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     21        1.1  thorpej  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     22        1.1  thorpej  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     23        1.1  thorpej  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     24        1.1  thorpej  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     25        1.1  thorpej  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     26        1.1  thorpej  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     27        1.1  thorpej  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     28        1.1  thorpej  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     29        1.1  thorpej  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     30        1.1  thorpej  * POSSIBILITY OF SUCH DAMAGE.
     31        1.1  thorpej  */
     32        1.1  thorpej 
     33        1.1  thorpej /*
     34        1.1  thorpej  * Copyright (c) 1992, 1993
     35        1.1  thorpej  *	The Regents of the University of California.  All rights reserved.
     36        1.1  thorpej  *
     37        1.1  thorpej  * This code is derived from software contributed to Berkeley by
     38        1.1  thorpej  * Ralph Campbell.
     39        1.1  thorpej  *
     40        1.1  thorpej  * Redistribution and use in source and binary forms, with or without
     41        1.1  thorpej  * modification, are permitted provided that the following conditions
     42        1.1  thorpej  * are met:
     43        1.1  thorpej  * 1. Redistributions of source code must retain the above copyright
     44        1.1  thorpej  *    notice, this list of conditions and the following disclaimer.
     45        1.1  thorpej  * 2. Redistributions in binary form must reproduce the above copyright
     46        1.1  thorpej  *    notice, this list of conditions and the following disclaimer in the
     47        1.1  thorpej  *    documentation and/or other materials provided with the distribution.
     48        1.5      agc  * 3. Neither the name of the University nor the names of its contributors
     49        1.1  thorpej  *    may be used to endorse or promote products derived from this software
     50        1.1  thorpej  *    without specific prior written permission.
     51        1.1  thorpej  *
     52        1.1  thorpej  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     53        1.1  thorpej  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     54        1.1  thorpej  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     55        1.1  thorpej  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     56        1.1  thorpej  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     57        1.1  thorpej  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     58        1.1  thorpej  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     59        1.1  thorpej  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     60        1.1  thorpej  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     61        1.1  thorpej  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     62        1.1  thorpej  * SUCH DAMAGE.
     63        1.1  thorpej  *
     64        1.1  thorpej  *	@(#)boot.c	8.1 (Berkeley) 6/10/93
     65        1.1  thorpej  */
     66        1.1  thorpej 
     67        1.2  thorpej #ifdef _STANDALONE
     68        1.2  thorpej #include <lib/libsa/stand.h>
     69        1.2  thorpej #include <lib/libkern/libkern.h>
     70        1.7    perry #else
     71        1.2  thorpej #include <stdio.h>
     72        1.2  thorpej #include <string.h>
     73        1.2  thorpej #include <errno.h>
     74        1.2  thorpej #include <stdlib.h>
     75        1.7    perry #include <unistd.h>
     76        1.2  thorpej #include <fcntl.h>
     77        1.2  thorpej #include <err.h>
     78        1.7    perry #endif
     79        1.2  thorpej 
     80        1.7    perry #include <sys/param.h>
     81  1.12.10.2     yamt #include <sys/exec_aout.h>
     82        1.2  thorpej 
     83        1.2  thorpej #include "loadfile.h"
     84        1.2  thorpej 
     85        1.2  thorpej #ifdef BOOT_AOUT
     86        1.2  thorpej 
     87        1.2  thorpej int
     88       1.12  tsutsui loadfile_aout(int fd, struct exec *x, u_long *marks, int flags)
     89        1.1  thorpej {
     90        1.1  thorpej 	u_long entry = x->a_entry;
     91        1.1  thorpej 	paddr_t aoutp = 0;
     92        1.1  thorpej 	paddr_t minp, maxp;
     93        1.1  thorpej 	int cc;
     94        1.1  thorpej 	paddr_t offset = marks[MARK_START];
     95        1.1  thorpej 	u_long magic = N_GETMAGIC(*x);
     96        1.1  thorpej 	int sub;
     97       1.10    isaki 	ssize_t nr;
     98        1.3  reinoud 
     99        1.3  reinoud 	/* some ports dont use the offset */
    100        1.3  reinoud 	offset = offset;
    101        1.1  thorpej 
    102        1.1  thorpej 	/* In OMAGIC and NMAGIC, exec header isn't part of text segment */
    103        1.1  thorpej 	if (magic == OMAGIC || magic == NMAGIC)
    104        1.1  thorpej 		sub = 0;
    105        1.1  thorpej 	else
    106        1.1  thorpej 		sub = sizeof(*x);
    107        1.7    perry 
    108        1.1  thorpej 	minp = maxp = ALIGNENTRY(entry);
    109        1.1  thorpej 
    110        1.1  thorpej 	if (lseek(fd, sizeof(*x), SEEK_SET) == -1)  {
    111        1.1  thorpej 		WARN(("lseek text"));
    112        1.1  thorpej 		return 1;
    113        1.1  thorpej 	}
    114        1.1  thorpej 
    115        1.1  thorpej 	/*
    116        1.1  thorpej 	 * Leave a copy of the exec header before the text.
    117        1.1  thorpej 	 * The kernel may use this to verify that the
    118        1.1  thorpej 	 * symbols were loaded by this boot program.
    119        1.1  thorpej 	 */
    120        1.1  thorpej 	if (magic == OMAGIC || magic == NMAGIC) {
    121        1.1  thorpej 		if (flags & LOAD_HDR && maxp >= sizeof(*x))
    122        1.1  thorpej 			BCOPY(x, maxp - sizeof(*x), sizeof(*x));
    123        1.1  thorpej 	}
    124        1.1  thorpej 	else {
    125        1.1  thorpej 		if (flags & LOAD_HDR)
    126        1.1  thorpej 			BCOPY(x, maxp, sizeof(*x));
    127        1.1  thorpej 		if (flags & (LOAD_HDR|COUNT_HDR))
    128        1.1  thorpej 			maxp += sizeof(*x);
    129        1.1  thorpej 	}
    130        1.1  thorpej 
    131        1.1  thorpej 	/*
    132        1.1  thorpej 	 * Read in the text segment.
    133        1.1  thorpej 	 */
    134        1.1  thorpej 	if (flags & LOAD_TEXT) {
    135        1.1  thorpej 		PROGRESS(("%ld", x->a_text));
    136        1.1  thorpej 
    137       1.10    isaki 		nr = READ(fd, maxp, x->a_text - sub);
    138       1.10    isaki 		if (nr == -1) {
    139       1.10    isaki 			WARN(("read text"));
    140       1.10    isaki 			return 1;
    141       1.10    isaki 		}
    142       1.10    isaki 		if (nr != (ssize_t)(x->a_text - sub)) {
    143       1.11    isaki 			errno = EIO;
    144        1.1  thorpej 			WARN(("read text"));
    145        1.1  thorpej 			return 1;
    146        1.1  thorpej 		}
    147        1.1  thorpej 	} else {
    148        1.1  thorpej 		if (lseek(fd, x->a_text - sub, SEEK_CUR) == -1) {
    149        1.1  thorpej 			WARN(("seek text"));
    150        1.1  thorpej 			return 1;
    151        1.1  thorpej 		}
    152        1.1  thorpej 	}
    153        1.1  thorpej 	if (flags & (LOAD_TEXT|COUNT_TEXT))
    154        1.1  thorpej 		maxp += x->a_text - sub;
    155        1.1  thorpej 
    156        1.1  thorpej 	/*
    157        1.1  thorpej 	 * Provide alignment if required
    158        1.1  thorpej 	 */
    159        1.1  thorpej 	if (magic == ZMAGIC || magic == NMAGIC) {
    160        1.4  thorpej 		int size = -(unsigned int)maxp & (AOUT_LDPGSZ - 1);
    161        1.1  thorpej 
    162        1.1  thorpej 		if (flags & LOAD_TEXTA) {
    163        1.1  thorpej 			PROGRESS(("/%d", size));
    164        1.1  thorpej 			BZERO(maxp, size);
    165        1.1  thorpej 		}
    166        1.1  thorpej 
    167        1.1  thorpej 		if (flags & (LOAD_TEXTA|COUNT_TEXTA))
    168        1.1  thorpej 			maxp += size;
    169        1.1  thorpej 	}
    170        1.1  thorpej 
    171        1.1  thorpej 	/*
    172        1.1  thorpej 	 * Read in the data segment.
    173        1.1  thorpej 	 */
    174        1.1  thorpej 	if (flags & LOAD_DATA) {
    175        1.1  thorpej 		PROGRESS(("+%ld", x->a_data));
    176        1.1  thorpej 
    177        1.9   martin 		marks[MARK_DATA] = LOADADDR(maxp);
    178       1.10    isaki 		nr = READ(fd, maxp, x->a_data);
    179       1.10    isaki 		if (nr == -1) {
    180       1.10    isaki 			WARN(("read data"));
    181       1.10    isaki 			return 1;
    182       1.10    isaki 		}
    183       1.10    isaki 		if (nr != (ssize_t)x->a_data) {
    184       1.11    isaki 			errno = EIO;
    185        1.1  thorpej 			WARN(("read data"));
    186        1.1  thorpej 			return 1;
    187        1.1  thorpej 		}
    188        1.1  thorpej 	}
    189        1.1  thorpej 	else {
    190        1.1  thorpej 		if (lseek(fd, x->a_data, SEEK_CUR) == -1) {
    191        1.1  thorpej 			WARN(("seek data"));
    192        1.1  thorpej 			return 1;
    193        1.1  thorpej 		}
    194        1.1  thorpej 	}
    195        1.1  thorpej 	if (flags & (LOAD_DATA|COUNT_DATA))
    196        1.1  thorpej 		maxp += x->a_data;
    197        1.1  thorpej 
    198        1.1  thorpej 	/*
    199        1.1  thorpej 	 * Zero out the BSS section.
    200        1.1  thorpej 	 * (Kernel doesn't care, but do it anyway.)
    201        1.1  thorpej 	 */
    202        1.1  thorpej 	if (flags & LOAD_BSS) {
    203        1.1  thorpej 		PROGRESS(("+%ld", x->a_bss));
    204        1.1  thorpej 
    205        1.1  thorpej 		BZERO(maxp, x->a_bss);
    206        1.1  thorpej 	}
    207        1.1  thorpej 
    208        1.1  thorpej 	if (flags & (LOAD_BSS|COUNT_BSS))
    209        1.1  thorpej 		maxp += x->a_bss;
    210        1.1  thorpej 
    211        1.1  thorpej 	/*
    212        1.1  thorpej 	 * Read in the symbol table and strings.
    213        1.1  thorpej 	 * (Always set the symtab size word.)
    214        1.1  thorpej 	 */
    215        1.1  thorpej 	if (flags & LOAD_SYM)
    216        1.1  thorpej 		BCOPY(&x->a_syms, maxp, sizeof(x->a_syms));
    217        1.1  thorpej 
    218        1.1  thorpej 	if (flags & (LOAD_SYM|COUNT_SYM)) {
    219        1.1  thorpej 		maxp += sizeof(x->a_syms);
    220        1.1  thorpej 		aoutp = maxp;
    221        1.1  thorpej 	}
    222        1.1  thorpej 
    223        1.1  thorpej 	if (x->a_syms > 0) {
    224        1.1  thorpej 		/* Symbol table and string table length word. */
    225        1.1  thorpej 
    226        1.1  thorpej 		if (flags & LOAD_SYM) {
    227        1.1  thorpej 			PROGRESS(("+[%ld", x->a_syms));
    228        1.1  thorpej 
    229       1.10    isaki 			nr = READ(fd, maxp, x->a_syms);
    230       1.10    isaki 			if (nr == -1) {
    231       1.10    isaki 				WARN(("read symbols"));
    232       1.10    isaki 				return 1;
    233       1.10    isaki 			}
    234       1.10    isaki 			if (nr != (ssize_t)x->a_syms) {
    235       1.11    isaki 				errno = EIO;
    236        1.1  thorpej 				WARN(("read symbols"));
    237        1.1  thorpej 				return 1;
    238        1.1  thorpej 			}
    239        1.1  thorpej 		} else  {
    240        1.1  thorpej 			if (lseek(fd, x->a_syms, SEEK_CUR) == -1) {
    241        1.1  thorpej 				WARN(("seek symbols"));
    242        1.1  thorpej 				return 1;
    243        1.1  thorpej 			}
    244        1.1  thorpej 		}
    245        1.1  thorpej 		if (flags & (LOAD_SYM|COUNT_SYM))
    246        1.1  thorpej 			maxp += x->a_syms;
    247        1.1  thorpej 
    248       1.10    isaki 		nr = read(fd, &cc, sizeof(cc));
    249       1.10    isaki 		if (nr == -1) {
    250       1.10    isaki 			WARN(("read string table"));
    251       1.10    isaki 			return 1;
    252       1.10    isaki 		}
    253       1.10    isaki 		if (nr != sizeof(cc)) {
    254       1.11    isaki 			errno = EIO;
    255        1.1  thorpej 			WARN(("read string table"));
    256        1.1  thorpej 			return 1;
    257        1.1  thorpej 		}
    258        1.1  thorpej 
    259        1.1  thorpej 		if (flags & LOAD_SYM) {
    260        1.1  thorpej 			BCOPY(&cc, maxp, sizeof(cc));
    261        1.1  thorpej 
    262        1.1  thorpej 			/* String table. Length word includes itself. */
    263        1.1  thorpej 
    264        1.1  thorpej 			PROGRESS(("+%d]", cc));
    265        1.1  thorpej 		}
    266        1.1  thorpej 		if (flags & (LOAD_SYM|COUNT_SYM))
    267        1.1  thorpej 			maxp += sizeof(cc);
    268        1.1  thorpej 
    269        1.1  thorpej 		cc -= sizeof(int);
    270        1.1  thorpej 		if (cc <= 0) {
    271        1.1  thorpej 			WARN(("symbol table too short"));
    272        1.1  thorpej 			return 1;
    273        1.1  thorpej 		}
    274        1.1  thorpej 
    275        1.1  thorpej 		if (flags & LOAD_SYM) {
    276       1.10    isaki 			nr = READ(fd, maxp, cc);
    277       1.10    isaki 			if (nr == -1) {
    278       1.10    isaki 				WARN(("read strings"));
    279       1.10    isaki 				return 1;
    280       1.10    isaki 			}
    281       1.10    isaki 			if (nr != cc) {
    282       1.11    isaki 				errno = EIO;
    283        1.1  thorpej 				WARN(("read strings"));
    284        1.1  thorpej 				return 1;
    285        1.1  thorpej 			}
    286        1.1  thorpej 		} else {
    287        1.1  thorpej 			if (lseek(fd, cc, SEEK_CUR) == -1) {
    288        1.1  thorpej 				WARN(("seek strings"));
    289        1.1  thorpej 				return 1;
    290        1.1  thorpej 			}
    291        1.1  thorpej 		}
    292        1.1  thorpej 		if (flags & (LOAD_SYM|COUNT_SYM))
    293        1.1  thorpej 			maxp += cc;
    294        1.1  thorpej 	}
    295        1.1  thorpej 
    296        1.1  thorpej 	marks[MARK_START] = LOADADDR(minp);
    297        1.1  thorpej 	marks[MARK_ENTRY] = LOADADDR(entry);
    298        1.1  thorpej 	marks[MARK_NSYM] = x->a_syms;
    299        1.1  thorpej 	marks[MARK_SYM] = LOADADDR(aoutp);
    300        1.1  thorpej 	marks[MARK_END] = LOADADDR(maxp);
    301        1.1  thorpej 	return 0;
    302        1.1  thorpej }
    303        1.2  thorpej 
    304        1.2  thorpej #endif /* BOOT_AOUT */
    305