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