exec_aout.c revision 1.3.10.1 1 1.3.10.1 minoura /* $NetBSD: exec_aout.c,v 1.3.10.1 2000/06/22 18:01:03 minoura Exp $ */
2 1.1 cgd
3 1.1 cgd /*
4 1.3.10.1 minoura * Copyright (c) 1996 Christopher G. Demetriou
5 1.3.10.1 minoura * All rights reserved.
6 1.3.10.1 minoura *
7 1.1 cgd * Redistribution and use in source and binary forms, with or without
8 1.1 cgd * modification, are permitted provided that the following conditions
9 1.1 cgd * are met:
10 1.1 cgd * 1. Redistributions of source code must retain the above copyright
11 1.1 cgd * notice, this list of conditions and the following disclaimer.
12 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 cgd * notice, this list of conditions and the following disclaimer in the
14 1.1 cgd * documentation and/or other materials provided with the distribution.
15 1.1 cgd * 3. All advertising materials mentioning features or use of this software
16 1.1 cgd * must display the following acknowledgement:
17 1.3.10.1 minoura * This product includes software developed for the
18 1.3.10.1 minoura * NetBSD Project. See http://www.netbsd.org/ for
19 1.3.10.1 minoura * information about NetBSD.
20 1.1 cgd * 4. The name of the author may not be used to endorse or promote products
21 1.3.10.1 minoura * derived from this software without specific prior written permission.
22 1.3.10.1 minoura *
23 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24 1.1 cgd * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25 1.1 cgd * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 1.1 cgd * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27 1.1 cgd * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28 1.1 cgd * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 1.1 cgd * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 1.1 cgd * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 1.1 cgd * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32 1.1 cgd * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 1.3.10.1 minoura *
34 1.3.10.1 minoura * <<Id: LICENSE,v 1.2 2000/06/14 15:57:33 cgd Exp>>
35 1.1 cgd */
36 1.1 cgd
37 1.3 lukem #include <sys/cdefs.h>
38 1.1 cgd #ifndef lint
39 1.3.10.1 minoura __RCSID("$NetBSD: exec_aout.c,v 1.3.10.1 2000/06/22 18:01:03 minoura Exp $");
40 1.1 cgd #endif /* not lint */
41 1.1 cgd
42 1.1 cgd #include <sys/types.h>
43 1.1 cgd #include <stdio.h>
44 1.1 cgd #include <string.h>
45 1.1 cgd #include "extern.h"
46 1.1 cgd
47 1.1 cgd #if defined(NLIST_AOUT)
48 1.1 cgd #include <a.out.h>
49 1.1 cgd
50 1.1 cgd #define check(off, size) ((off < 0) || (off + size > mappedsize))
51 1.1 cgd #define BAD do { rv = -1; goto out; } while (0)
52 1.1 cgd
53 1.2 scottr extern int T_flag_specified;
54 1.2 scottr extern u_long text_start;
55 1.2 scottr
56 1.1 cgd int
57 1.1 cgd check_aout(mappedfile, mappedsize)
58 1.1 cgd const char *mappedfile;
59 1.1 cgd size_t mappedsize;
60 1.1 cgd {
61 1.1 cgd struct exec *execp;
62 1.1 cgd int rv;
63 1.1 cgd
64 1.1 cgd rv = 0;
65 1.1 cgd
66 1.1 cgd if (check(0, sizeof *execp))
67 1.1 cgd BAD;
68 1.1 cgd execp = (struct exec *)&mappedfile[0];
69 1.1 cgd
70 1.1 cgd if (N_BADMAG(*execp))
71 1.1 cgd BAD;
72 1.1 cgd
73 1.1 cgd out:
74 1.1 cgd return (rv);
75 1.1 cgd }
76 1.1 cgd
77 1.1 cgd int
78 1.1 cgd findoff_aout(mappedfile, mappedsize, vmaddr, fileoffp)
79 1.1 cgd const char *mappedfile;
80 1.1 cgd size_t mappedsize, *fileoffp;
81 1.1 cgd u_long vmaddr;
82 1.1 cgd {
83 1.1 cgd struct exec *execp;
84 1.1 cgd int rv;
85 1.1 cgd
86 1.1 cgd rv = 0;
87 1.1 cgd execp = (struct exec *)&mappedfile[0];
88 1.1 cgd
89 1.1 cgd if (N_TXTADDR(*execp) + (execp->a_entry & (N_PAGSIZ(*execp)-1)) !=
90 1.1 cgd execp->a_entry)
91 1.1 cgd vmaddr += N_TXTADDR(*execp) +
92 1.1 cgd (execp->a_entry & (N_PAGSIZ(*execp)-1)) - execp->a_entry;
93 1.2 scottr
94 1.2 scottr /* apply correction based on the supplied text start address, if any */
95 1.2 scottr if (T_flag_specified)
96 1.2 scottr vmaddr += N_TXTADDR(*execp) - text_start;
97 1.1 cgd
98 1.1 cgd if (N_TXTADDR(*execp) <= vmaddr &&
99 1.1 cgd vmaddr < (N_TXTADDR(*execp) + execp->a_text))
100 1.1 cgd *fileoffp = vmaddr - N_TXTADDR(*execp) + N_TXTOFF(*execp);
101 1.1 cgd else if (N_DATADDR(*execp) <= vmaddr &&
102 1.1 cgd vmaddr < (N_DATADDR(*execp) + execp->a_data))
103 1.1 cgd *fileoffp = vmaddr - N_DATADDR(*execp) + N_DATOFF(*execp);
104 1.1 cgd else
105 1.1 cgd BAD;
106 1.1 cgd
107 1.1 cgd out:
108 1.1 cgd return (rv);
109 1.1 cgd }
110 1.1 cgd
111 1.1 cgd #endif /* NLIST_AOUT */
112