file.c revision 1.19 1 1.19 kalvisd /* $NetBSD: file.c,v 1.19 2024/10/23 00:45:58 kalvisd Exp $ */
2 1.2 thorpej
3 1.1 cjs /*
4 1.1 cjs * Copyright (c) 1995-96 Mats O Jansson. All rights reserved.
5 1.1 cjs *
6 1.1 cjs * Redistribution and use in source and binary forms, with or without
7 1.1 cjs * modification, are permitted provided that the following conditions
8 1.1 cjs * are met:
9 1.1 cjs * 1. Redistributions of source code must retain the above copyright
10 1.1 cjs * notice, this list of conditions and the following disclaimer.
11 1.1 cjs * 2. Redistributions in binary form must reproduce the above copyright
12 1.1 cjs * notice, this list of conditions and the following disclaimer in the
13 1.1 cjs * documentation and/or other materials provided with the distribution.
14 1.1 cjs *
15 1.1 cjs * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 1.1 cjs * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 1.1 cjs * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 1.1 cjs * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 1.1 cjs * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 1.1 cjs * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 1.1 cjs * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 1.1 cjs * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 1.1 cjs * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 1.1 cjs * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 1.1 cjs */
26 1.1 cjs
27 1.16 christos #include "port.h"
28 1.4 lukem #ifndef lint
29 1.19 kalvisd __RCSID("$NetBSD: file.c,v 1.19 2024/10/23 00:45:58 kalvisd Exp $");
30 1.1 cjs #endif
31 1.1 cjs
32 1.1 cjs #include "os.h"
33 1.4 lukem #include "common.h"
34 1.4 lukem #include "file.h"
35 1.4 lukem #include "mopdef.h"
36 1.8 thorpej #include <stddef.h>
37 1.1 cjs
38 1.1 cjs #ifndef NOAOUT
39 1.19 kalvisd # if defined (HAVE_NBTOOL_CONFIG_H) || defined(__NetBSD__) || defined(__OpenBSD__)
40 1.8 thorpej # include <sys/exec_aout.h>
41 1.8 thorpej # endif
42 1.8 thorpej # if defined(__bsdi__)
43 1.8 thorpej # define NOAOUT
44 1.8 thorpej # endif
45 1.8 thorpej # if defined(__FreeBSD__)
46 1.8 thorpej # include <sys/imgact_aout.h>
47 1.8 thorpej # endif
48 1.8 thorpej # if !defined(MID_VAX)
49 1.17 abs # define MID_VAX 150
50 1.17 abs # endif
51 1.17 abs # if !defined(MID_VAX1K)
52 1.17 abs # define MID_VAX1K 140
53 1.8 thorpej # endif
54 1.8 thorpej #endif /* NOAOUT */
55 1.8 thorpej
56 1.8 thorpej #ifndef NOELF
57 1.19 kalvisd # if defined (HAVE_NBTOOL_CONFIG_H) || defined(__NetBSD__)
58 1.8 thorpej # include <sys/exec_elf.h>
59 1.8 thorpej # else
60 1.8 thorpej # define NOELF
61 1.8 thorpej # endif
62 1.8 thorpej #endif /* NOELF */
63 1.1 cjs
64 1.15 nakayama #ifndef NOAOUT
65 1.14 joerg static int getCLBYTES(int);
66 1.14 joerg static int getMID(int, int);
67 1.15 nakayama #endif
68 1.4 lukem
69 1.9 thorpej const char *
70 1.14 joerg FileTypeName(mopd_imagetype type)
71 1.9 thorpej {
72 1.9 thorpej
73 1.9 thorpej switch (type) {
74 1.9 thorpej case IMAGE_TYPE_MOP:
75 1.9 thorpej return ("MOP");
76 1.9 thorpej
77 1.9 thorpej case IMAGE_TYPE_ELF32:
78 1.9 thorpej return ("Elf32");
79 1.9 thorpej
80 1.9 thorpej case IMAGE_TYPE_AOUT:
81 1.9 thorpej return ("a.out");
82 1.9 thorpej }
83 1.9 thorpej
84 1.9 thorpej abort();
85 1.9 thorpej }
86 1.9 thorpej
87 1.1 cjs void
88 1.14 joerg mopFilePutLX(u_char *buf, int idx, u_int32_t value, int cnt)
89 1.1 cjs {
90 1.1 cjs int i;
91 1.1 cjs for (i = 0; i < cnt; i++) {
92 1.11 lukem buf[idx+i] = value % 256;
93 1.1 cjs value = value / 256;
94 1.1 cjs }
95 1.1 cjs }
96 1.1 cjs
97 1.1 cjs void
98 1.14 joerg mopFilePutBX(u_char *buf, int idx, u_int32_t value, int cnt)
99 1.1 cjs {
100 1.1 cjs int i;
101 1.1 cjs for (i = 0; i < cnt; i++) {
102 1.11 lukem buf[idx+cnt-1-i] = value % 256;
103 1.1 cjs value = value / 256;
104 1.1 cjs }
105 1.1 cjs }
106 1.1 cjs
107 1.4 lukem u_int32_t
108 1.14 joerg mopFileGetLX(u_char *buf, int idx, int cnt)
109 1.1 cjs {
110 1.4 lukem u_int32_t ret = 0;
111 1.1 cjs int i;
112 1.1 cjs
113 1.1 cjs for (i = 0; i < cnt; i++) {
114 1.13 christos int j = idx + cnt - 1 - i;
115 1.13 christos if (j < 0)
116 1.13 christos abort();
117 1.13 christos ret = ret * 256 + buf[j];
118 1.1 cjs }
119 1.1 cjs
120 1.1 cjs return(ret);
121 1.1 cjs }
122 1.1 cjs
123 1.4 lukem u_int32_t
124 1.14 joerg mopFileGetBX(u_char *buf, int idx, int cnt)
125 1.1 cjs {
126 1.4 lukem u_int32_t ret = 0;
127 1.1 cjs int i;
128 1.1 cjs
129 1.1 cjs for (i = 0; i < cnt; i++) {
130 1.13 christos int j = idx + i;
131 1.13 christos if (j < 0)
132 1.13 christos abort();
133 1.13 christos ret = ret * 256 + buf[j];
134 1.1 cjs }
135 1.1 cjs
136 1.1 cjs return(ret);
137 1.1 cjs }
138 1.1 cjs
139 1.1 cjs void
140 1.14 joerg mopFileSwapX(u_char *buf, int idx, int cnt)
141 1.1 cjs {
142 1.1 cjs int i;
143 1.1 cjs u_char c;
144 1.1 cjs
145 1.1 cjs for (i = 0; i < (cnt / 2); i++) {
146 1.11 lukem c = buf[idx+i];
147 1.11 lukem buf[idx+i] = buf[idx+cnt-1-i];
148 1.11 lukem buf[idx+cnt-1-i] = c;
149 1.1 cjs }
150 1.1 cjs
151 1.1 cjs }
152 1.1 cjs
153 1.1 cjs int
154 1.14 joerg CheckMopFile(int fd)
155 1.1 cjs {
156 1.1 cjs u_char header[512];
157 1.1 cjs short image_type;
158 1.1 cjs
159 1.1 cjs if (read(fd, header, 512) != 512)
160 1.1 cjs return(-1);
161 1.1 cjs
162 1.1 cjs (void)lseek(fd, (off_t) 0, SEEK_SET);
163 1.1 cjs
164 1.1 cjs image_type = (u_short)(header[IHD_W_ALIAS+1]*256 +
165 1.1 cjs header[IHD_W_ALIAS]);
166 1.1 cjs
167 1.1 cjs switch(image_type) {
168 1.1 cjs case IHD_C_NATIVE: /* Native mode image (VAX) */
169 1.1 cjs case IHD_C_RSX: /* RSX image produced by TKB */
170 1.1 cjs case IHD_C_BPA: /* BASIC plus analog */
171 1.1 cjs case IHD_C_ALIAS: /* Alias */
172 1.1 cjs case IHD_C_CLI: /* Image is CLI */
173 1.1 cjs case IHD_C_PMAX: /* PMAX system image */
174 1.1 cjs case IHD_C_ALPHA: /* ALPHA system image */
175 1.1 cjs break;
176 1.1 cjs default:
177 1.1 cjs return(-1);
178 1.1 cjs }
179 1.1 cjs
180 1.1 cjs return(0);
181 1.1 cjs }
182 1.1 cjs
183 1.1 cjs int
184 1.14 joerg GetMopFileInfo(struct dllist *dl)
185 1.1 cjs {
186 1.4 lukem u_char header[512];
187 1.4 lukem short image_type;
188 1.4 lukem u_int32_t load_addr, xfr_addr, isd, iha, hbcnt, isize;
189 1.1 cjs
190 1.8 thorpej if (read(dl->ldfd, header, 512) != 512)
191 1.1 cjs return(-1);
192 1.1 cjs
193 1.1 cjs image_type = (u_short)(header[IHD_W_ALIAS+1]*256 +
194 1.1 cjs header[IHD_W_ALIAS]);
195 1.1 cjs
196 1.1 cjs switch(image_type) {
197 1.1 cjs case IHD_C_NATIVE: /* Native mode image (VAX) */
198 1.1 cjs isd = (header[IHD_W_SIZE+1]*256 +
199 1.1 cjs header[IHD_W_SIZE]);
200 1.1 cjs iha = (header[IHD_W_ACTIVOFF+1]*256 +
201 1.1 cjs header[IHD_W_ACTIVOFF]);
202 1.1 cjs hbcnt = (header[IHD_B_HDRBLKCNT]);
203 1.1 cjs isize = (header[isd+ISD_W_PAGCNT+1]*256 +
204 1.1 cjs header[isd+ISD_W_PAGCNT]) * 512;
205 1.1 cjs load_addr = ((header[isd+ISD_V_VPN+1]*256 +
206 1.1 cjs header[isd+ISD_V_VPN]) & ISD_M_VPN)
207 1.1 cjs * 512;
208 1.1 cjs xfr_addr = (header[iha+IHA_L_TFRADR1+3]*0x1000000 +
209 1.1 cjs header[iha+IHA_L_TFRADR1+2]*0x10000 +
210 1.1 cjs header[iha+IHA_L_TFRADR1+1]*0x100 +
211 1.1 cjs header[iha+IHA_L_TFRADR1]) & 0x7fffffff;
212 1.1 cjs printf("Native Image (VAX)\n");
213 1.1 cjs printf("Header Block Count: %d\n",hbcnt);
214 1.1 cjs printf("Image Size: %08x\n",isize);
215 1.1 cjs printf("Load Address: %08x\n",load_addr);
216 1.1 cjs printf("Transfer Address: %08x\n",xfr_addr);
217 1.1 cjs break;
218 1.1 cjs case IHD_C_RSX: /* RSX image produced by TKB */
219 1.1 cjs hbcnt = header[L_BBLK+1]*256 + header[L_BBLK];
220 1.1 cjs isize = (header[L_BLDZ+1]*256 + header[L_BLDZ]) * 64;
221 1.1 cjs load_addr = header[L_BSA+1]*256 + header[L_BSA];
222 1.1 cjs xfr_addr = header[L_BXFR+1]*256 + header[L_BXFR];
223 1.1 cjs printf("RSX Image\n");
224 1.1 cjs printf("Header Block Count: %d\n",hbcnt);
225 1.1 cjs printf("Image Size: %08x\n",isize);
226 1.1 cjs printf("Load Address: %08x\n",load_addr);
227 1.1 cjs printf("Transfer Address: %08x\n",xfr_addr);
228 1.1 cjs break;
229 1.1 cjs case IHD_C_BPA: /* BASIC plus analog */
230 1.1 cjs printf("BASIC-Plus Image, not supported\n");
231 1.1 cjs return(-1);
232 1.1 cjs break;
233 1.1 cjs case IHD_C_ALIAS: /* Alias */
234 1.1 cjs printf("Alias, not supported\n");
235 1.1 cjs return(-1);
236 1.1 cjs break;
237 1.1 cjs case IHD_C_CLI: /* Image is CLI */
238 1.1 cjs printf("CLI, not supported\n");
239 1.1 cjs return(-1);
240 1.1 cjs break;
241 1.1 cjs case IHD_C_PMAX: /* PMAX system image */
242 1.1 cjs isd = (header[IHD_W_SIZE+1]*256 +
243 1.1 cjs header[IHD_W_SIZE]);
244 1.1 cjs iha = (header[IHD_W_ACTIVOFF+1]*256 +
245 1.1 cjs header[IHD_W_ACTIVOFF]);
246 1.1 cjs hbcnt = (header[IHD_B_HDRBLKCNT]);
247 1.1 cjs isize = (header[isd+ISD_W_PAGCNT+1]*256 +
248 1.1 cjs header[isd+ISD_W_PAGCNT]) * 512;
249 1.1 cjs load_addr = (header[isd+ISD_V_VPN+1]*256 +
250 1.1 cjs header[isd+ISD_V_VPN]) * 512;
251 1.1 cjs xfr_addr = (header[iha+IHA_L_TFRADR1+3]*0x1000000 +
252 1.1 cjs header[iha+IHA_L_TFRADR1+2]*0x10000 +
253 1.1 cjs header[iha+IHA_L_TFRADR1+1]*0x100 +
254 1.1 cjs header[iha+IHA_L_TFRADR1]);
255 1.1 cjs printf("PMAX Image \n");
256 1.1 cjs printf("Header Block Count: %d\n",hbcnt);
257 1.1 cjs printf("Image Size: %08x\n",isize);
258 1.1 cjs printf("Load Address: %08x\n",load_addr);
259 1.1 cjs printf("Transfer Address: %08x\n",xfr_addr);
260 1.1 cjs break;
261 1.1 cjs case IHD_C_ALPHA: /* ALPHA system image */
262 1.1 cjs isd = (header[EIHD_L_ISDOFF+3]*0x1000000 +
263 1.1 cjs header[EIHD_L_ISDOFF+2]*0x10000 +
264 1.1 cjs header[EIHD_L_ISDOFF+1]*0x100 +
265 1.1 cjs header[EIHD_L_ISDOFF]);
266 1.1 cjs hbcnt = (header[EIHD_L_HDRBLKCNT+3]*0x1000000 +
267 1.1 cjs header[EIHD_L_HDRBLKCNT+2]*0x10000 +
268 1.1 cjs header[EIHD_L_HDRBLKCNT+1]*0x100 +
269 1.1 cjs header[EIHD_L_HDRBLKCNT]);
270 1.1 cjs isize = (header[isd+EISD_L_SECSIZE+3]*0x1000000 +
271 1.1 cjs header[isd+EISD_L_SECSIZE+2]*0x10000 +
272 1.1 cjs header[isd+EISD_L_SECSIZE+1]*0x100 +
273 1.1 cjs header[isd+EISD_L_SECSIZE]);
274 1.1 cjs load_addr = 0;
275 1.1 cjs xfr_addr = 0;
276 1.1 cjs printf("Alpha Image \n");
277 1.1 cjs printf("Header Block Count: %d\n",hbcnt);
278 1.1 cjs printf("Image Size: %08x\n",isize);
279 1.1 cjs printf("Load Address: %08x\n",load_addr);
280 1.1 cjs printf("Transfer Address: %08x\n",xfr_addr);
281 1.1 cjs break;
282 1.1 cjs default:
283 1.1 cjs printf("Unknown Image (%d)\n",image_type);
284 1.1 cjs return(-1);
285 1.1 cjs }
286 1.1 cjs
287 1.8 thorpej dl->image_type = IMAGE_TYPE_MOP;
288 1.8 thorpej dl->loadaddr = load_addr;
289 1.8 thorpej dl->xferaddr = xfr_addr;
290 1.1 cjs
291 1.1 cjs return(0);
292 1.1 cjs }
293 1.1 cjs
294 1.1 cjs #ifndef NOAOUT
295 1.14 joerg static int
296 1.14 joerg getMID(int old_mid, int new_mid)
297 1.1 cjs {
298 1.1 cjs int mid;
299 1.1 cjs
300 1.1 cjs mid = old_mid;
301 1.1 cjs
302 1.1 cjs switch (new_mid) {
303 1.1 cjs case MID_I386:
304 1.1 cjs mid = MID_I386;
305 1.1 cjs break;
306 1.1 cjs #ifdef MID_M68K
307 1.1 cjs case MID_M68K:
308 1.1 cjs mid = MID_M68K;
309 1.1 cjs break;
310 1.1 cjs #endif
311 1.1 cjs #ifdef MID_M68K4K
312 1.1 cjs case MID_M68K4K:
313 1.1 cjs mid = MID_M68K4K;
314 1.1 cjs break;
315 1.1 cjs #endif
316 1.1 cjs #ifdef MID_NS32532
317 1.1 cjs case MID_NS32532:
318 1.1 cjs mid = MID_NS32532;
319 1.1 cjs break;
320 1.1 cjs #endif
321 1.1 cjs case MID_SPARC:
322 1.1 cjs mid = MID_SPARC;
323 1.1 cjs break;
324 1.1 cjs #ifdef MID_PMAX
325 1.1 cjs case MID_PMAX:
326 1.1 cjs mid = MID_PMAX;
327 1.1 cjs break;
328 1.1 cjs #endif
329 1.1 cjs #ifdef MID_VAX
330 1.1 cjs case MID_VAX:
331 1.1 cjs mid = MID_VAX;
332 1.1 cjs break;
333 1.1 cjs #endif
334 1.17 abs #ifdef MID_VAX1K
335 1.17 abs case MID_VAX1K:
336 1.17 abs mid = MID_VAX1K;
337 1.17 abs break;
338 1.17 abs #endif
339 1.1 cjs #ifdef MID_ALPHA
340 1.1 cjs case MID_ALPHA:
341 1.1 cjs mid = MID_ALPHA;
342 1.1 cjs break;
343 1.1 cjs #endif
344 1.1 cjs #ifdef MID_MIPS
345 1.1 cjs case MID_MIPS:
346 1.1 cjs mid = MID_MIPS;
347 1.1 cjs break;
348 1.1 cjs #endif
349 1.1 cjs #ifdef MID_ARM6
350 1.1 cjs case MID_ARM6:
351 1.1 cjs mid = MID_ARM6;
352 1.1 cjs break;
353 1.1 cjs #endif
354 1.1 cjs default:
355 1.5 cgd break;
356 1.1 cjs }
357 1.1 cjs
358 1.1 cjs return(mid);
359 1.1 cjs }
360 1.1 cjs
361 1.14 joerg static int
362 1.14 joerg getCLBYTES(int mid)
363 1.1 cjs {
364 1.1 cjs int clbytes;
365 1.1 cjs
366 1.1 cjs switch (mid) {
367 1.17 abs #ifdef MID_VAX1K
368 1.17 abs case MID_VAX1K:
369 1.1 cjs clbytes = 1024;
370 1.1 cjs break;
371 1.1 cjs #endif
372 1.6 mycroft #ifdef MID_I386
373 1.1 cjs case MID_I386:
374 1.6 mycroft #endif
375 1.1 cjs #ifdef MID_M68K4K
376 1.1 cjs case MID_M68K4K:
377 1.1 cjs #endif
378 1.1 cjs #ifdef MID_NS32532
379 1.1 cjs case MID_NS32532:
380 1.1 cjs #endif
381 1.1 cjs #ifdef MID_PMAX
382 1.1 cjs case MID_PMAX:
383 1.1 cjs #endif
384 1.1 cjs #ifdef MID_MIPS
385 1.1 cjs case MID_MIPS:
386 1.1 cjs #endif
387 1.1 cjs #ifdef MID_ARM6
388 1.1 cjs case MID_ARM6:
389 1.1 cjs #endif
390 1.17 abs #ifdef MID_VAX
391 1.17 abs case MID_VAX:
392 1.17 abs #endif
393 1.6 mycroft #if defined(MID_I386) || defined(MID_M68K4K) || defined(MID_NS32532) || \
394 1.17 abs defined(MID_PMAX) || defined(MID_MIPS) || defined(MID_ARM6) || \
395 1.17 abs defined(MID_VAX)
396 1.1 cjs clbytes = 4096;
397 1.1 cjs break;
398 1.6 mycroft #endif
399 1.1 cjs #ifdef MID_M68K
400 1.1 cjs case MID_M68K:
401 1.1 cjs #endif
402 1.1 cjs #ifdef MID_ALPHA
403 1.1 cjs case MID_ALPHA:
404 1.1 cjs #endif
405 1.6 mycroft #ifdef MID_SPARC
406 1.6 mycroft case MID_SPARC:
407 1.6 mycroft #endif
408 1.6 mycroft #if defined(MID_M68K) || defined(MID_ALPHA) || defined(MID_SPARC)
409 1.1 cjs clbytes = 8192;
410 1.1 cjs break;
411 1.1 cjs #endif
412 1.1 cjs default:
413 1.1 cjs clbytes = 0;
414 1.1 cjs }
415 1.1 cjs
416 1.1 cjs return(clbytes);
417 1.1 cjs }
418 1.1 cjs #endif
419 1.1 cjs
420 1.1 cjs int
421 1.14 joerg CheckElfFile(int fd)
422 1.8 thorpej {
423 1.8 thorpej #ifdef NOELF
424 1.8 thorpej return(-1);
425 1.8 thorpej #else
426 1.8 thorpej Elf32_Ehdr ehdr;
427 1.8 thorpej
428 1.8 thorpej (void)lseek(fd, (off_t) 0, SEEK_SET);
429 1.8 thorpej
430 1.8 thorpej if (read(fd, (char *)&ehdr, sizeof(ehdr)) != sizeof(ehdr))
431 1.8 thorpej return(-1);
432 1.8 thorpej
433 1.8 thorpej if (ehdr.e_ident[0] != ELFMAG0 ||
434 1.8 thorpej ehdr.e_ident[1] != ELFMAG1 ||
435 1.8 thorpej ehdr.e_ident[2] != ELFMAG2 ||
436 1.8 thorpej ehdr.e_ident[3] != ELFMAG3)
437 1.8 thorpej return(-1);
438 1.8 thorpej
439 1.8 thorpej /* Must be Elf32... */
440 1.8 thorpej if (ehdr.e_ident[EI_CLASS] != ELFCLASS32)
441 1.8 thorpej return(-1);
442 1.8 thorpej
443 1.8 thorpej return(0);
444 1.8 thorpej #endif /* NOELF */
445 1.8 thorpej }
446 1.8 thorpej
447 1.8 thorpej int
448 1.14 joerg GetElfFileInfo(struct dllist *dl)
449 1.8 thorpej {
450 1.8 thorpej #ifdef NOELF
451 1.8 thorpej return(-1);
452 1.8 thorpej #else
453 1.8 thorpej Elf32_Ehdr ehdr;
454 1.8 thorpej Elf32_Phdr phdr;
455 1.8 thorpej uint32_t e_machine, e_entry;
456 1.8 thorpej uint32_t e_phoff, e_phentsize, e_phnum;
457 1.8 thorpej int ei_data, i;
458 1.8 thorpej
459 1.8 thorpej (void)lseek(dl->ldfd, (off_t) 0, SEEK_SET);
460 1.8 thorpej
461 1.8 thorpej if (read(dl->ldfd, (char *)&ehdr, sizeof(ehdr)) != sizeof(ehdr))
462 1.8 thorpej return(-1);
463 1.8 thorpej
464 1.8 thorpej if (ehdr.e_ident[0] != ELFMAG0 ||
465 1.8 thorpej ehdr.e_ident[1] != ELFMAG1 ||
466 1.8 thorpej ehdr.e_ident[2] != ELFMAG2 ||
467 1.8 thorpej ehdr.e_ident[3] != ELFMAG3)
468 1.8 thorpej return(-1);
469 1.8 thorpej
470 1.8 thorpej /* Must be Elf32... */
471 1.8 thorpej if (ehdr.e_ident[EI_CLASS] != ELFCLASS32)
472 1.8 thorpej return(-1);
473 1.8 thorpej
474 1.8 thorpej ei_data = ehdr.e_ident[EI_DATA];
475 1.8 thorpej
476 1.8 thorpej switch (ei_data) {
477 1.8 thorpej case ELFDATA2LSB:
478 1.8 thorpej e_machine = mopFileGetLX((u_char *) &ehdr,
479 1.8 thorpej offsetof(Elf32_Ehdr, e_machine),
480 1.8 thorpej sizeof(ehdr.e_machine));
481 1.8 thorpej e_entry = mopFileGetLX((u_char *) &ehdr,
482 1.8 thorpej offsetof(Elf32_Ehdr, e_entry),
483 1.8 thorpej sizeof(ehdr.e_entry));
484 1.8 thorpej
485 1.8 thorpej e_phoff = mopFileGetLX((u_char *) &ehdr,
486 1.8 thorpej offsetof(Elf32_Ehdr, e_phoff),
487 1.8 thorpej sizeof(ehdr.e_phoff));
488 1.8 thorpej e_phentsize = mopFileGetLX((u_char *) &ehdr,
489 1.8 thorpej offsetof(Elf32_Ehdr, e_phentsize),
490 1.8 thorpej sizeof(ehdr.e_phentsize));
491 1.8 thorpej e_phnum = mopFileGetLX((u_char *) &ehdr,
492 1.8 thorpej offsetof(Elf32_Ehdr, e_phnum),
493 1.8 thorpej sizeof(ehdr.e_phnum));
494 1.8 thorpej break;
495 1.8 thorpej
496 1.8 thorpej case ELFDATA2MSB:
497 1.8 thorpej e_machine = mopFileGetBX((u_char *) &ehdr,
498 1.8 thorpej offsetof(Elf32_Ehdr, e_machine),
499 1.8 thorpej sizeof(ehdr.e_machine));
500 1.8 thorpej e_entry = mopFileGetBX((u_char *) &ehdr,
501 1.8 thorpej offsetof(Elf32_Ehdr, e_entry),
502 1.8 thorpej sizeof(ehdr.e_entry));
503 1.8 thorpej
504 1.8 thorpej e_phoff = mopFileGetBX((u_char *) &ehdr,
505 1.8 thorpej offsetof(Elf32_Ehdr, e_phoff),
506 1.8 thorpej sizeof(ehdr.e_phoff));
507 1.8 thorpej e_phentsize = mopFileGetBX((u_char *) &ehdr,
508 1.8 thorpej offsetof(Elf32_Ehdr, e_phentsize),
509 1.8 thorpej sizeof(ehdr.e_phentsize));
510 1.8 thorpej e_phnum = mopFileGetBX((u_char *) &ehdr,
511 1.8 thorpej offsetof(Elf32_Ehdr, e_phnum),
512 1.8 thorpej sizeof(ehdr.e_phnum));
513 1.8 thorpej break;
514 1.8 thorpej
515 1.8 thorpej default:
516 1.8 thorpej return(-1);
517 1.8 thorpej }
518 1.8 thorpej
519 1.8 thorpej dl->image_type = IMAGE_TYPE_ELF32;
520 1.10 thorpej dl->loadaddr = 0;
521 1.8 thorpej dl->xferaddr = e_entry; /* will relocate itself if necessary */
522 1.8 thorpej
523 1.8 thorpej if (e_phnum > SEC_MAX)
524 1.8 thorpej return(-1);
525 1.8 thorpej dl->e_nsec = e_phnum;
526 1.8 thorpej for (i = 0; i < dl->e_nsec; i++) {
527 1.8 thorpej if (lseek(dl->ldfd, (off_t) e_phoff + (i * e_phentsize),
528 1.8 thorpej SEEK_SET) == (off_t) -1)
529 1.8 thorpej return(-1);
530 1.8 thorpej if (read(dl->ldfd, (char *) &phdr, sizeof(phdr)) !=
531 1.8 thorpej sizeof(phdr))
532 1.8 thorpej return(-1);
533 1.8 thorpej
534 1.8 thorpej switch (ei_data) {
535 1.8 thorpej case ELFDATA2LSB:
536 1.8 thorpej dl->e_sections[i].s_foff =
537 1.8 thorpej mopFileGetLX((u_char *) &phdr,
538 1.8 thorpej offsetof(Elf32_Phdr, p_offset),
539 1.8 thorpej sizeof(phdr.p_offset));
540 1.8 thorpej dl->e_sections[i].s_vaddr =
541 1.8 thorpej mopFileGetLX((u_char *) &phdr,
542 1.8 thorpej offsetof(Elf32_Phdr, p_vaddr),
543 1.8 thorpej sizeof(phdr.p_vaddr));
544 1.8 thorpej dl->e_sections[i].s_fsize =
545 1.8 thorpej mopFileGetLX((u_char *) &phdr,
546 1.8 thorpej offsetof(Elf32_Phdr, p_filesz),
547 1.8 thorpej sizeof(phdr.p_filesz));
548 1.8 thorpej dl->e_sections[i].s_msize =
549 1.8 thorpej mopFileGetLX((u_char *) &phdr,
550 1.8 thorpej offsetof(Elf32_Phdr, p_memsz),
551 1.8 thorpej sizeof(phdr.p_memsz));
552 1.8 thorpej break;
553 1.8 thorpej
554 1.8 thorpej case ELFDATA2MSB:
555 1.8 thorpej dl->e_sections[i].s_foff =
556 1.8 thorpej mopFileGetBX((u_char *) &phdr,
557 1.8 thorpej offsetof(Elf32_Phdr, p_offset),
558 1.8 thorpej sizeof(phdr.p_offset));
559 1.8 thorpej dl->e_sections[i].s_vaddr =
560 1.8 thorpej mopFileGetBX((u_char *) &phdr,
561 1.8 thorpej offsetof(Elf32_Phdr, p_vaddr),
562 1.8 thorpej sizeof(phdr.p_vaddr));
563 1.8 thorpej dl->e_sections[i].s_fsize =
564 1.8 thorpej mopFileGetBX((u_char *) &phdr,
565 1.8 thorpej offsetof(Elf32_Phdr, p_filesz),
566 1.8 thorpej sizeof(phdr.p_filesz));
567 1.8 thorpej dl->e_sections[i].s_msize =
568 1.8 thorpej mopFileGetBX((u_char *) &phdr,
569 1.8 thorpej offsetof(Elf32_Phdr, p_memsz),
570 1.8 thorpej sizeof(phdr.p_memsz));
571 1.8 thorpej break;
572 1.8 thorpej
573 1.8 thorpej default:
574 1.8 thorpej return(-1);
575 1.8 thorpej }
576 1.8 thorpej }
577 1.8 thorpej /*
578 1.8 thorpej * In addition to padding between segments, this also
579 1.8 thorpej * takes care of memsz > filesz.
580 1.8 thorpej */
581 1.8 thorpej for (i = 0; i < dl->e_nsec - 1; i++) {
582 1.8 thorpej dl->e_sections[i].s_pad =
583 1.8 thorpej dl->e_sections[i + 1].s_vaddr -
584 1.8 thorpej (dl->e_sections[i].s_vaddr + dl->e_sections[i].s_fsize);
585 1.8 thorpej }
586 1.8 thorpej dl->e_sections[dl->e_nsec - 1].s_pad =
587 1.8 thorpej dl->e_sections[dl->e_nsec - 1].s_msize -
588 1.8 thorpej dl->e_sections[dl->e_nsec - 1].s_fsize;
589 1.8 thorpej /*
590 1.8 thorpej * Now compute the logical offsets for each section.
591 1.8 thorpej */
592 1.8 thorpej dl->e_sections[0].s_loff = 0;
593 1.8 thorpej for (i = 1; i < dl->e_nsec; i++) {
594 1.8 thorpej dl->e_sections[i].s_loff =
595 1.8 thorpej dl->e_sections[i - 1].s_loff +
596 1.8 thorpej dl->e_sections[i - 1].s_fsize +
597 1.8 thorpej dl->e_sections[i - 1].s_pad;
598 1.8 thorpej }
599 1.8 thorpej
600 1.8 thorpej /* Print info about the image. */
601 1.8 thorpej printf("Elf32 image (");
602 1.8 thorpej switch (e_machine) {
603 1.8 thorpej #ifdef EM_VAX
604 1.8 thorpej case EM_VAX:
605 1.8 thorpej printf("VAX");
606 1.8 thorpej break;
607 1.8 thorpej #endif
608 1.8 thorpej default:
609 1.8 thorpej printf("machine %d", e_machine);
610 1.8 thorpej break;
611 1.8 thorpej }
612 1.8 thorpej printf(")\n");
613 1.8 thorpej printf("Transfer Address: %08x\n", dl->xferaddr);
614 1.8 thorpej printf("Program Sections: %d\n", dl->e_nsec);
615 1.8 thorpej for (i = 0; i < dl->e_nsec; i++) {
616 1.8 thorpej printf(" S%d File Size: %08x\n", i,
617 1.8 thorpej dl->e_sections[i].s_fsize);
618 1.8 thorpej printf(" S%d Pad Size: %08x\n", i,
619 1.8 thorpej dl->e_sections[i].s_pad);
620 1.8 thorpej }
621 1.9 thorpej dl->e_machine = e_machine;
622 1.8 thorpej
623 1.8 thorpej dl->e_curpos = 0;
624 1.8 thorpej dl->e_cursec = 0;
625 1.8 thorpej
626 1.8 thorpej return(0);
627 1.8 thorpej #endif /* NOELF */
628 1.8 thorpej }
629 1.8 thorpej
630 1.8 thorpej int
631 1.14 joerg CheckAOutFile(int fd)
632 1.1 cjs {
633 1.1 cjs #ifdef NOAOUT
634 1.1 cjs return(-1);
635 1.1 cjs #else
636 1.1 cjs struct exec ex, ex_swap;
637 1.1 cjs int mid = -1;
638 1.1 cjs
639 1.1 cjs if (read(fd, (char *)&ex, sizeof(ex)) != sizeof(ex))
640 1.1 cjs return(-1);
641 1.1 cjs
642 1.1 cjs (void)lseek(fd, (off_t) 0, SEEK_SET);
643 1.1 cjs
644 1.1 cjs if (read(fd, (char *)&ex_swap, sizeof(ex_swap)) != sizeof(ex_swap))
645 1.1 cjs return(-1);
646 1.1 cjs
647 1.1 cjs (void)lseek(fd, (off_t) 0, SEEK_SET);
648 1.1 cjs
649 1.1 cjs mid = getMID(mid, N_GETMID (ex));
650 1.1 cjs
651 1.1 cjs if (mid == -1) {
652 1.1 cjs mid = getMID(mid, N_GETMID (ex_swap));
653 1.1 cjs }
654 1.1 cjs
655 1.1 cjs if (mid != -1) {
656 1.1 cjs return(0);
657 1.1 cjs } else {
658 1.1 cjs return(-1);
659 1.1 cjs }
660 1.7 cgd #endif /* NOAOUT */
661 1.1 cjs }
662 1.1 cjs
663 1.1 cjs int
664 1.14 joerg GetAOutFileInfo(struct dllist *dl)
665 1.1 cjs {
666 1.1 cjs #ifdef NOAOUT
667 1.1 cjs return(-1);
668 1.1 cjs #else
669 1.1 cjs struct exec ex, ex_swap;
670 1.4 lukem u_int32_t mid = -1;
671 1.4 lukem u_int32_t magic, clbytes, clofset;
672 1.1 cjs
673 1.8 thorpej if (read(dl->ldfd, (char *)&ex, sizeof(ex)) != sizeof(ex))
674 1.1 cjs return(-1);
675 1.1 cjs
676 1.8 thorpej (void)lseek(dl->ldfd, (off_t) 0, SEEK_SET);
677 1.1 cjs
678 1.8 thorpej if (read(dl->ldfd, (char *)&ex_swap,
679 1.8 thorpej sizeof(ex_swap)) != sizeof(ex_swap))
680 1.1 cjs return(-1);
681 1.1 cjs
682 1.1 cjs mopFileSwapX((u_char *)&ex_swap, 0, 4);
683 1.1 cjs
684 1.1 cjs mid = getMID(mid, N_GETMID (ex));
685 1.1 cjs
686 1.11 lukem if (mid == (uint32_t)-1) {
687 1.1 cjs mid = getMID(mid, N_GETMID (ex_swap));
688 1.11 lukem if (mid != (uint32_t)-1) {
689 1.1 cjs mopFileSwapX((u_char *)&ex, 0, 4);
690 1.1 cjs }
691 1.1 cjs }
692 1.1 cjs
693 1.11 lukem if (mid == (uint32_t)-1) {
694 1.1 cjs return(-1);
695 1.1 cjs }
696 1.1 cjs
697 1.1 cjs if (N_BADMAG (ex)) {
698 1.1 cjs return(-1);
699 1.1 cjs }
700 1.1 cjs
701 1.1 cjs switch (mid) {
702 1.1 cjs case MID_I386:
703 1.1 cjs #ifdef MID_NS32532
704 1.1 cjs case MID_NS32532:
705 1.1 cjs #endif
706 1.1 cjs #ifdef MID_PMAX
707 1.1 cjs case MID_PMAX:
708 1.1 cjs #endif
709 1.1 cjs #ifdef MID_VAX
710 1.1 cjs case MID_VAX:
711 1.1 cjs #endif
712 1.17 abs #ifdef MID_VAX1K
713 1.17 abs case MID_VAX1K:
714 1.17 abs #endif
715 1.1 cjs #ifdef MID_ALPHA
716 1.1 cjs case MID_ALPHA:
717 1.1 cjs #endif
718 1.1 cjs #ifdef MID_ARM6
719 1.1 cjs case MID_ARM6:
720 1.1 cjs #endif
721 1.1 cjs ex.a_text = mopFileGetLX((u_char *)&ex_swap, 4, 4);
722 1.1 cjs ex.a_data = mopFileGetLX((u_char *)&ex_swap, 8, 4);
723 1.1 cjs ex.a_bss = mopFileGetLX((u_char *)&ex_swap, 12, 4);
724 1.1 cjs ex.a_syms = mopFileGetLX((u_char *)&ex_swap, 16, 4);
725 1.1 cjs ex.a_entry = mopFileGetLX((u_char *)&ex_swap, 20, 4);
726 1.1 cjs ex.a_trsize= mopFileGetLX((u_char *)&ex_swap, 24, 4);
727 1.1 cjs ex.a_drsize= mopFileGetLX((u_char *)&ex_swap, 28, 4);
728 1.1 cjs break;
729 1.1 cjs #ifdef MID_M68K
730 1.1 cjs case MID_M68K:
731 1.1 cjs #endif
732 1.1 cjs #ifdef MID_M68K4K
733 1.1 cjs case MID_M68K4K:
734 1.1 cjs #endif
735 1.1 cjs case MID_SPARC:
736 1.1 cjs #ifdef MID_MIPS
737 1.1 cjs case MID_MIPS:
738 1.1 cjs #endif
739 1.1 cjs ex.a_text = mopFileGetBX((u_char *)&ex_swap, 4, 4);
740 1.1 cjs ex.a_data = mopFileGetBX((u_char *)&ex_swap, 8, 4);
741 1.1 cjs ex.a_bss = mopFileGetBX((u_char *)&ex_swap, 12, 4);
742 1.1 cjs ex.a_syms = mopFileGetBX((u_char *)&ex_swap, 16, 4);
743 1.1 cjs ex.a_entry = mopFileGetBX((u_char *)&ex_swap, 20, 4);
744 1.1 cjs ex.a_trsize= mopFileGetBX((u_char *)&ex_swap, 24, 4);
745 1.1 cjs ex.a_drsize= mopFileGetBX((u_char *)&ex_swap, 28, 4);
746 1.1 cjs break;
747 1.1 cjs default:
748 1.5 cgd break;
749 1.1 cjs }
750 1.1 cjs
751 1.1 cjs printf("a.out image (");
752 1.1 cjs switch (N_GETMID (ex)) {
753 1.1 cjs case MID_I386:
754 1.1 cjs printf("i386");
755 1.1 cjs break;
756 1.1 cjs #ifdef MID_M68K
757 1.1 cjs case MID_M68K:
758 1.1 cjs printf("m68k");
759 1.1 cjs break;
760 1.1 cjs #endif
761 1.1 cjs #ifdef MID_M68K4K
762 1.1 cjs case MID_M68K4K:
763 1.1 cjs printf("m68k 4k");
764 1.1 cjs break;
765 1.1 cjs #endif
766 1.1 cjs #ifdef MID_NS32532
767 1.1 cjs case MID_NS32532:
768 1.1 cjs printf("pc532");
769 1.1 cjs break;
770 1.1 cjs #endif
771 1.1 cjs case MID_SPARC:
772 1.1 cjs printf("sparc");
773 1.1 cjs break;
774 1.1 cjs #ifdef MID_PMAX
775 1.1 cjs case MID_PMAX:
776 1.1 cjs printf("pmax");
777 1.1 cjs break;
778 1.1 cjs #endif
779 1.1 cjs #ifdef MID_VAX
780 1.1 cjs case MID_VAX:
781 1.1 cjs printf("vax");
782 1.1 cjs break;
783 1.1 cjs #endif
784 1.17 abs #ifdef MID_VAX1K
785 1.17 abs case MID_VAX1K:
786 1.17 abs printf("vax 1k");
787 1.17 abs break;
788 1.17 abs #endif
789 1.1 cjs #ifdef MID_ALPHA
790 1.1 cjs case MID_ALPHA:
791 1.1 cjs printf("alpha");
792 1.1 cjs break;
793 1.1 cjs #endif
794 1.1 cjs #ifdef MID_MIPS
795 1.1 cjs case MID_MIPS:
796 1.1 cjs printf("mips");
797 1.1 cjs break;
798 1.1 cjs #endif
799 1.1 cjs #ifdef MID_ARM6
800 1.1 cjs case MID_ARM6:
801 1.1 cjs printf("arm32");
802 1.1 cjs break;
803 1.1 cjs #endif
804 1.1 cjs default:
805 1.5 cgd break;
806 1.1 cjs }
807 1.1 cjs printf(") Magic: ");
808 1.1 cjs switch (N_GETMAGIC (ex)) {
809 1.1 cjs case OMAGIC:
810 1.1 cjs printf("OMAGIC");
811 1.1 cjs break;
812 1.1 cjs case NMAGIC:
813 1.1 cjs printf("NMAGIC");
814 1.1 cjs break;
815 1.1 cjs case ZMAGIC:
816 1.1 cjs printf("ZMAGIC");
817 1.1 cjs break;
818 1.1 cjs case QMAGIC:
819 1.1 cjs printf("QMAGIC");
820 1.1 cjs break;
821 1.1 cjs default:
822 1.4 lukem printf("Unknown %ld", (long) N_GETMAGIC (ex));
823 1.1 cjs }
824 1.1 cjs printf("\n");
825 1.4 lukem printf("Size of text: %08lx\n", (long)ex.a_text);
826 1.4 lukem printf("Size of data: %08lx\n", (long)ex.a_data);
827 1.4 lukem printf("Size of bss: %08lx\n", (long)ex.a_bss);
828 1.4 lukem printf("Size of symbol tab: %08lx\n", (long)ex.a_syms);
829 1.4 lukem printf("Transfer Address: %08lx\n", (long)ex.a_entry);
830 1.4 lukem printf("Size of reloc text: %08lx\n", (long)ex.a_trsize);
831 1.4 lukem printf("Size of reloc data: %08lx\n", (long)ex.a_drsize);
832 1.3 lukem
833 1.1 cjs magic = N_GETMAGIC (ex);
834 1.1 cjs clbytes = getCLBYTES(mid);
835 1.1 cjs clofset = clbytes - 1;
836 1.1 cjs
837 1.8 thorpej dl->image_type = IMAGE_TYPE_AOUT;
838 1.8 thorpej dl->loadaddr = 0;
839 1.8 thorpej dl->xferaddr = ex.a_entry;
840 1.8 thorpej
841 1.8 thorpej dl->a_text = ex.a_text;
842 1.8 thorpej if (magic == ZMAGIC || magic == NMAGIC) {
843 1.8 thorpej dl->a_text_fill = clbytes - (ex.a_text & clofset);
844 1.8 thorpej if (dl->a_text_fill == clbytes)
845 1.8 thorpej dl->a_text_fill = 0;
846 1.8 thorpej } else
847 1.8 thorpej dl->a_text_fill = 0;
848 1.8 thorpej dl->a_data = ex.a_data;
849 1.8 thorpej if (magic == ZMAGIC || magic == NMAGIC) {
850 1.8 thorpej dl->a_data_fill = clbytes - (ex.a_data & clofset);
851 1.8 thorpej if (dl->a_data_fill == clbytes)
852 1.8 thorpej dl->a_data_fill = 0;
853 1.8 thorpej } else
854 1.8 thorpej dl->a_data_fill = 0;
855 1.8 thorpej dl->a_bss = ex.a_bss;
856 1.8 thorpej if (magic == ZMAGIC || magic == NMAGIC) {
857 1.8 thorpej dl->a_bss_fill = clbytes - (ex.a_bss & clofset);
858 1.8 thorpej if (dl->a_bss_fill == clbytes)
859 1.8 thorpej dl->a_bss_fill = 0;
860 1.8 thorpej } else {
861 1.8 thorpej dl->a_bss_fill = clbytes -
862 1.8 thorpej ((ex.a_text+ex.a_data+ex.a_bss) & clofset);
863 1.8 thorpej if (dl->a_bss_fill == clbytes)
864 1.8 thorpej dl->a_bss_fill = 0;
865 1.1 cjs }
866 1.8 thorpej dl->a_mid = mid;
867 1.1 cjs
868 1.1 cjs return(0);
869 1.7 cgd #endif /* NOAOUT */
870 1.1 cjs }
871 1.1 cjs
872 1.1 cjs int
873 1.14 joerg GetFileInfo(struct dllist *dl)
874 1.1 cjs {
875 1.11 lukem int error;
876 1.1 cjs
877 1.11 lukem error = CheckElfFile(dl->ldfd);
878 1.11 lukem if (error == 0) {
879 1.11 lukem error = GetElfFileInfo(dl);
880 1.11 lukem if (error != 0) {
881 1.8 thorpej return(-1);
882 1.8 thorpej }
883 1.8 thorpej return (0);
884 1.8 thorpej }
885 1.1 cjs
886 1.11 lukem error = CheckAOutFile(dl->ldfd);
887 1.11 lukem if (error == 0) {
888 1.11 lukem error = GetAOutFileInfo(dl);
889 1.11 lukem if (error != 0) {
890 1.1 cjs return(-1);
891 1.1 cjs }
892 1.8 thorpej return (0);
893 1.8 thorpej }
894 1.8 thorpej
895 1.11 lukem error = CheckMopFile(dl->ldfd);
896 1.11 lukem if (error == 0) {
897 1.11 lukem error = GetMopFileInfo(dl);
898 1.11 lukem if (error != 0) {
899 1.1 cjs return(-1);
900 1.1 cjs }
901 1.8 thorpej return (0);
902 1.1 cjs }
903 1.1 cjs
904 1.8 thorpej /* Unknown file format. */
905 1.8 thorpej return(-1);
906 1.1 cjs }
907 1.1 cjs
908 1.1 cjs ssize_t
909 1.14 joerg mopFileRead(struct dllist *dlslot, u_char *buf)
910 1.1 cjs {
911 1.1 cjs ssize_t len, outlen;
912 1.8 thorpej int bsz, sec;
913 1.4 lukem int32_t pos, notdone, total;
914 1.8 thorpej uint32_t secoff;
915 1.1 cjs
916 1.8 thorpej switch (dlslot->image_type) {
917 1.8 thorpej case IMAGE_TYPE_MOP:
918 1.1 cjs len = read(dlslot->ldfd,buf,dlslot->dl_bsz);
919 1.8 thorpej break;
920 1.8 thorpej
921 1.8 thorpej case IMAGE_TYPE_ELF32:
922 1.8 thorpej sec = dlslot->e_cursec;
923 1.8 thorpej
924 1.8 thorpej /*
925 1.8 thorpej * We're pretty simplistic here. We do only file-backed
926 1.8 thorpej * or only zero-fill.
927 1.8 thorpej */
928 1.8 thorpej
929 1.8 thorpej /* Determine offset into section. */
930 1.8 thorpej secoff = dlslot->e_curpos - dlslot->e_sections[sec].s_loff;
931 1.8 thorpej
932 1.8 thorpej /*
933 1.8 thorpej * If we're in the file-backed part of the section,
934 1.8 thorpej * transmit some of the file.
935 1.8 thorpej */
936 1.8 thorpej if (secoff < dlslot->e_sections[sec].s_fsize) {
937 1.8 thorpej bsz = dlslot->e_sections[sec].s_fsize - secoff;
938 1.8 thorpej if (bsz > dlslot->dl_bsz)
939 1.8 thorpej bsz = dlslot->dl_bsz;
940 1.8 thorpej if (lseek(dlslot->ldfd,
941 1.8 thorpej dlslot->e_sections[sec].s_foff + secoff,
942 1.8 thorpej SEEK_SET) == (off_t) -1)
943 1.8 thorpej return (-1);
944 1.8 thorpej len = read(dlslot->ldfd, buf, bsz);
945 1.8 thorpej }
946 1.8 thorpej /*
947 1.8 thorpej * Otherwise, if we're in the zero-fill part of the
948 1.8 thorpej * section, transmit some zeros.
949 1.8 thorpej */
950 1.8 thorpej else if (secoff < (dlslot->e_sections[sec].s_fsize +
951 1.8 thorpej dlslot->e_sections[sec].s_pad)) {
952 1.8 thorpej bsz = dlslot->e_sections[sec].s_pad -
953 1.8 thorpej (secoff - dlslot->e_sections[sec].s_fsize);
954 1.8 thorpej if (bsz > dlslot->dl_bsz)
955 1.8 thorpej bsz = dlslot->dl_bsz;
956 1.8 thorpej memset(buf, 0, (len = bsz));
957 1.8 thorpej }
958 1.8 thorpej /*
959 1.8 thorpej * ...and if we haven't hit either of those cases,
960 1.8 thorpej * that's the end of the image.
961 1.8 thorpej */
962 1.8 thorpej else {
963 1.8 thorpej return (0);
964 1.8 thorpej }
965 1.8 thorpej /*
966 1.8 thorpej * Advance the logical image pointer.
967 1.8 thorpej */
968 1.8 thorpej dlslot->e_curpos += bsz;
969 1.8 thorpej if (dlslot->e_curpos >= (dlslot->e_sections[sec].s_loff +
970 1.8 thorpej dlslot->e_sections[sec].s_fsize +
971 1.8 thorpej dlslot->e_sections[sec].s_pad))
972 1.18 kalvisd if (++dlslot->e_cursec >= dlslot->e_nsec)
973 1.18 kalvisd return (0);
974 1.8 thorpej break;
975 1.8 thorpej
976 1.8 thorpej case IMAGE_TYPE_AOUT:
977 1.1 cjs bsz = dlslot->dl_bsz;
978 1.1 cjs pos = dlslot->a_lseek;
979 1.1 cjs len = 0;
980 1.1 cjs
981 1.1 cjs total = dlslot->a_text;
982 1.1 cjs
983 1.1 cjs if (pos < total) {
984 1.1 cjs notdone = total - pos;
985 1.1 cjs if (notdone <= bsz) {
986 1.1 cjs outlen = read(dlslot->ldfd,&buf[len],notdone);
987 1.1 cjs } else {
988 1.1 cjs outlen = read(dlslot->ldfd,&buf[len],bsz);
989 1.1 cjs }
990 1.1 cjs len = len + outlen;
991 1.1 cjs pos = pos + outlen;
992 1.1 cjs bsz = bsz - outlen;
993 1.1 cjs }
994 1.1 cjs
995 1.1 cjs total = total + dlslot->a_text_fill;
996 1.1 cjs
997 1.1 cjs if ((bsz > 0) && (pos < total)) {
998 1.1 cjs notdone = total - pos;
999 1.1 cjs if (notdone <= bsz) {
1000 1.1 cjs outlen = notdone;
1001 1.1 cjs } else {
1002 1.1 cjs outlen = bsz;
1003 1.1 cjs }
1004 1.4 lukem memset(&buf[len], 0, outlen);
1005 1.1 cjs len = len + outlen;
1006 1.1 cjs pos = pos + outlen;
1007 1.1 cjs bsz = bsz - outlen;
1008 1.1 cjs }
1009 1.1 cjs
1010 1.1 cjs total = total + dlslot->a_data;
1011 1.1 cjs
1012 1.1 cjs if ((bsz > 0) && (pos < total)) {
1013 1.1 cjs notdone = total - pos;
1014 1.1 cjs if (notdone <= bsz) {
1015 1.1 cjs outlen = read(dlslot->ldfd,&buf[len],notdone);
1016 1.1 cjs } else {
1017 1.1 cjs outlen = read(dlslot->ldfd,&buf[len],bsz);
1018 1.1 cjs }
1019 1.1 cjs len = len + outlen;
1020 1.1 cjs pos = pos + outlen;
1021 1.1 cjs bsz = bsz - outlen;
1022 1.1 cjs }
1023 1.1 cjs
1024 1.1 cjs total = total + dlslot->a_data_fill;
1025 1.1 cjs
1026 1.1 cjs if ((bsz > 0) && (pos < total)) {
1027 1.1 cjs notdone = total - pos;
1028 1.1 cjs if (notdone <= bsz) {
1029 1.1 cjs outlen = notdone;
1030 1.1 cjs } else {
1031 1.1 cjs outlen = bsz;
1032 1.1 cjs }
1033 1.4 lukem memset(&buf[len], 0, outlen);
1034 1.1 cjs len = len + outlen;
1035 1.1 cjs pos = pos + outlen;
1036 1.1 cjs bsz = bsz - outlen;
1037 1.1 cjs }
1038 1.1 cjs
1039 1.1 cjs total = total + dlslot->a_bss;
1040 1.1 cjs
1041 1.1 cjs if ((bsz > 0) && (pos < total)) {
1042 1.1 cjs notdone = total - pos;
1043 1.1 cjs if (notdone <= bsz) {
1044 1.1 cjs outlen = notdone;
1045 1.1 cjs } else {
1046 1.1 cjs outlen = bsz;
1047 1.1 cjs }
1048 1.4 lukem memset(&buf[len], 0, outlen);
1049 1.1 cjs len = len + outlen;
1050 1.1 cjs pos = pos + outlen;
1051 1.1 cjs bsz = bsz - outlen;
1052 1.1 cjs }
1053 1.1 cjs
1054 1.1 cjs total = total + dlslot->a_bss_fill;
1055 1.1 cjs
1056 1.1 cjs if ((bsz > 0) && (pos < total)) {
1057 1.1 cjs notdone = total - pos;
1058 1.1 cjs if (notdone <= bsz) {
1059 1.1 cjs outlen = notdone;
1060 1.1 cjs } else {
1061 1.1 cjs outlen = bsz;
1062 1.1 cjs }
1063 1.4 lukem memset(&buf[len], 0, outlen);
1064 1.1 cjs len = len + outlen;
1065 1.1 cjs pos = pos + outlen;
1066 1.1 cjs bsz = bsz - outlen;
1067 1.1 cjs }
1068 1.1 cjs
1069 1.1 cjs dlslot->a_lseek = pos;
1070 1.8 thorpej break;
1071 1.10 thorpej
1072 1.10 thorpej default:
1073 1.10 thorpej abort();
1074 1.1 cjs }
1075 1.1 cjs
1076 1.1 cjs return(len);
1077 1.1 cjs }
1078