Annotation of sys/arch/macppc/stand/boot.mac/fixcoff.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: */
! 2: /* $NetBSD: fixcoff.c,v 1.10 2006/04/07 02:34:55 gdamore Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1999 National Aeronautics & Space Administration
! 6: * All rights reserved.
! 7: *
! 8: * This software was written by William Studenmund of the
! 9: * Numerical Aerospace Similation Facility, NASA Ames Research Center.
! 10: *
! 11: * Redistribution and use in source and binary forms, with or without
! 12: * modification, are permitted provided that the following conditions
! 13: * are met:
! 14: * 1. Redistributions of source code must retain the above copyright
! 15: * notice, this list of conditions and the following disclaimer.
! 16: * 2. Redistributions in binary form must reproduce the above copyright
! 17: * notice, this list of conditions and the following disclaimer in the
! 18: * documentation and/or other materials provided with the distribution.
! 19: * 3. Neither the name of the National Aeronautics & Space Administration
! 20: * nor the names of its contributors may be used to endorse or promote
! 21: * products derived from this software without specific prior written
! 22: * permission.
! 23: *
! 24: * THIS SOFTWARE IS PROVIDED BY THE NATIONAL AERONAUTICS & SPACE ADMINISTRATION
! 25: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
! 26: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
! 27: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ADMINISTRATION OR CONTRIB-
! 28: * UTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
! 29: * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
! 30: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
! 31: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
! 32: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
! 33: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
! 34: * POSSIBILITY OF SUCH DAMAGE.
! 35: */
! 36:
! 37: /*
! 38: * This program fixes up the extended xcoff headers generated when an elf
! 39: * file is turned into an xcoff one with the current objcopy. It should
! 40: * go away someday, when objcopy will correctly fix up the output xcoff
! 41: *
! 42: * Partially inspired by hack-coff, written by Paul Mackerras.
! 43: */
! 44:
! 45: #include <stdio.h>
! 46: #include <stdlib.h>
! 47: #include <unistd.h>
! 48: #include <fcntl.h>
! 49:
! 50: #include <sys/endian.h>
! 51:
! 52: struct filehdr {
! 53: #define U802WRMAGIC 0730
! 54: #define U802ROMAGIC 0735
! 55: #define U802TOCMAGIC 0737
! 56: char f_magic[2];
! 57: char f_nsect[2];
! 58: char f_time[4];
! 59: char f_symtab[4];
! 60: char f_nsyms[4];
! 61: char f_opthdr[2];
! 62: char f_flags[2];
! 63: };
! 64:
! 65: struct sectionhdr {
! 66: char s_name[8];
! 67: char s_paddr[4];
! 68: char s_vaddr[4];
! 69: char s_size[4];
! 70: char s_section[4];
! 71: char s_reloc[4];
! 72: char s_lineno[4];
! 73: char s_nreloc[2];
! 74: char s_nlineno[2];
! 75: char s_flags[4];
! 76: };
! 77:
! 78: struct aouthdr {
! 79: char magic[2];
! 80: char vstamp[2];
! 81: char tsize[4];
! 82: char dsize[4];
! 83: char bsize[4];
! 84: char entry[4];
! 85: char text_start[4];
! 86: char data_start[4];
! 87: #define SMALL_AOUTSZ 28
! 88: char o_toc[4];
! 89: char o_snentry[2];
! 90: char o_sntext[2];
! 91: char o_sndata[2];
! 92: char o_sntoc[2];
! 93: char o_snloader[2];
! 94: char o_snbss[2];
! 95: char o_algntext[2];
! 96: char o_algndata[2];
! 97: char o_modtype[2];
! 98: char o_cputype[2];
! 99: char o_maxstack[4];
! 100: char o_maxdata[4];
! 101: char o_resv2[12];
! 102: };
! 103: #define RS6K_AOUTHDR_ZMAGIC 0x010B
! 104:
! 105: char *progname;
! 106:
! 107: void
! 108: usage(char *prog)
! 109: {
! 110: fprintf(stderr, "Usage: %s [-h] | [<file to fix>]\n", prog);
! 111: }
! 112:
! 113: void
! 114: help(char *prog)
! 115: {
! 116: fprintf(stderr, "%s\tis designed to fix the xcoff headers in a\n",prog);
! 117: fprintf(stderr,
! 118: "\tbinary generated using objcopy from a non-xcoff source.\n");
! 119: usage(prog);
! 120: exit(0);
! 121: }
! 122:
! 123: main(int argc, char *argv[])
! 124: {
! 125: int fd, i, n, ch;
! 126: struct filehdr fh;
! 127: struct aouthdr aoh;
! 128: struct sectionhdr sh;
! 129:
! 130: progname = argv[0];
! 131: while ((ch = getopt(argc, argv, "h")) != -1)
! 132: switch (ch) {
! 133: case 'h':
! 134: help(progname);
! 135: }
! 136:
! 137: argc -= optind;
! 138: argv += optind;
! 139:
! 140: if (argc != 1) {
! 141: usage(progname);
! 142: exit(1);
! 143: }
! 144:
! 145: if ((fd = open(argv[0], O_RDWR, 0)) == -1)
! 146: err(i, "%s", argv[0]);
! 147:
! 148: /*
! 149: * Make sure it looks like an xcoff file..
! 150: */
! 151: if (read(fd, &fh, sizeof(fh)) != sizeof(fh))
! 152: err(1, "%s reading header", argv[0]);
! 153:
! 154: i = betoh16(*(uint16_t *)fh.f_magic);
! 155: if ((i != U802WRMAGIC) && (i != U802ROMAGIC) && (i != U802TOCMAGIC))
! 156: errx(1, "%s: not a valid xcoff file", argv[0]);
! 157:
! 158: /* Does the AOUT "Optional header" make sense? */
! 159: i = betoh16(*(uint16_t *)fh.f_opthdr);
! 160:
! 161: if (i == SMALL_AOUTSZ)
! 162: errx(1, "%s: file has small \"optional\" header, inappropriate for use with %s", argv[0], progname);
! 163: else if (i != sizeof(aoh))
! 164: errx(1, "%s: invalid \"optional\" header", argv[0]);
! 165:
! 166: if (read(fd, &aoh, i) != i)
! 167: err(1, "%s reading \"optional\" header", argv[0]);
! 168:
! 169: /* Now start filing in the AOUT header */
! 170: *(uint16_t *)aoh.magic = htobe16(RS6K_AOUTHDR_ZMAGIC);
! 171: n = betoh16(*(uint16_t *)fh.f_nsect);
! 172:
! 173: for (i = 0; i < n; i++) {
! 174: if (read(fd, &sh, sizeof(sh)) != sizeof(sh))
! 175: err(1, "%s reading section headers", argv[0]);
! 176: if (strcmp(sh.s_name, ".text") == 0) {
! 177: *(uint16_t *)(aoh.o_snentry) = htobe16(i+1);
! 178: *(uint16_t *)(aoh.o_sntext) = htobe16(i+1);
! 179: } else if (strcmp(sh.s_name, ".data") == 0) {
! 180: *(uint16_t *)(aoh.o_sndata) = htobe16(i+1);
! 181: } else if (strcmp(sh.s_name, ".bss") == 0) {
! 182: *(uint16_t *)(aoh.o_snbss) = htobe16(i+1);
! 183: }
! 184: }
! 185:
! 186: /* now write it out */
! 187: if (pwrite(fd, &aoh, sizeof(aoh), sizeof(struct filehdr)) !=
! 188: sizeof(aoh))
! 189: err(1, "%s writing modified header", argv[0]);
! 190: close(fd);
! 191: exit(0);
! 192: }
CVSweb