Annotation of 43BSDReno/contrib/emacs-18.55/src/unexmips.c, revision 1.1.1.1

1.1       root        1: /* Unexec for MIPS (including IRIS4D).
                      2:    Note that the GNU project considers support for MIPS operation
                      3:    a peripheral activity which should not be allowed to divert effort
                      4:    from development of the GNU system.  Changes in this code will be
                      5:    installed when users send them in, but aside from that
                      6:    we don't plan to think about it, or about whether other Emacs
                      7:    maintenance might break it.
                      8: 
                      9:    Copyright (C) 1988 Free Software Foundation, Inc.
                     10: 
                     11:                       NO WARRANTY
                     12: 
                     13:   BECAUSE THIS PROGRAM IS LICENSED FREE OF CHARGE, WE PROVIDE ABSOLUTELY
                     14: NO WARRANTY, TO THE EXTENT PERMITTED BY APPLICABLE STATE LAW.  EXCEPT
                     15: WHEN OTHERWISE STATED IN WRITING, FREE SOFTWARE FOUNDATION, INC,
                     16: RICHARD M. STALLMAN AND/OR OTHER PARTIES PROVIDE THIS PROGRAM "AS IS"
                     17: WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
                     18: BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
                     19: FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY
                     20: AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE
                     21: DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
                     22: CORRECTION.
                     23: 
                     24:  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL RICHARD M.
                     25: STALLMAN, THE FREE SOFTWARE FOUNDATION, INC., AND/OR ANY OTHER PARTY
                     26: WHO MAY MODIFY AND REDISTRIBUTE THIS PROGRAM AS PERMITTED BELOW, BE
                     27: LIABLE TO YOU FOR DAMAGES, INCLUDING ANY LOST PROFITS, LOST MONIES, OR
                     28: OTHER SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
                     29: USE OR INABILITY TO USE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR
                     30: DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY THIRD PARTIES OR
                     31: A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS) THIS
                     32: PROGRAM, EVEN IF YOU HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH
                     33: DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY.
                     34: 
                     35:                GENERAL PUBLIC LICENSE TO COPY
                     36: 
                     37:   1. You may copy and distribute verbatim copies of this source file
                     38: as you receive it, in any medium, provided that you conspicuously and
                     39: appropriately publish on each copy a valid copyright notice "Copyright
                     40: (C) 1987 Free Software Foundation, Inc."; and include following the
                     41: copyright notice a verbatim copy of the above disclaimer of warranty
                     42: and of this License.  You may charge a distribution fee for the
                     43: physical act of transferring a copy.
                     44: 
                     45:   2. You may modify your copy or copies of this source file or
                     46: any portion of it, and copy and distribute such modifications under
                     47: the terms of Paragraph 1 above, provided that you also do the following:
                     48: 
                     49:     a) cause the modified files to carry prominent notices stating
                     50:     that you changed the files and the date of any change; and
                     51: 
                     52:     b) cause the whole of any work that you distribute or publish,
                     53:     that in whole or in part contains or is a derivative of this
                     54:     program or any part thereof, to be licensed at no charge to all
                     55:     third parties on terms identical to those contained in this
                     56:     License Agreement (except that you may choose to grant more extensive
                     57:     warranty protection to some or all third parties, at your option).
                     58: 
                     59:     c) You may charge a distribution fee for the physical act of
                     60:     transferring a copy, and you may at your option offer warranty
                     61:     protection in exchange for a fee.
                     62: 
                     63: Mere aggregation of another unrelated program with this program (or its
                     64: derivative) on a volume of a storage or distribution medium does not bring
                     65: the other program under the scope of these terms.
                     66: 
                     67:   3. You may copy and distribute this program (or a portion or derivative
                     68: of it, under Paragraph 2) in object code or executable form under the terms
                     69: of Paragraphs 1 and 2 above provided that you also do one of the following:
                     70: 
                     71:     a) accompany it with the complete corresponding machine-readable
                     72:     source code, which must be distributed under the terms of
                     73:     Paragraphs 1 and 2 above; or,
                     74: 
                     75:     b) accompany it with a written offer, valid for at least three
                     76:     years, to give any third party free (except for a nominal
                     77:     shipping charge) a complete machine-readable copy of the
                     78:     corresponding source code, to be distributed under the terms of
                     79:     Paragraphs 1 and 2 above; or,
                     80: 
                     81:     c) accompany it with the information you received as to where the
                     82:     corresponding source code may be obtained.  (This alternative is
                     83:     allowed only for noncommercial distribution and only if you
                     84:     received the program in object code or executable form alone.)
                     85: 
                     86: For an executable file, complete source code means all the source code for
                     87: all modules it contains; but, as a special exception, it need not include
                     88: source code for modules which are standard libraries that accompany the
                     89: operating system on which the executable file runs.
                     90: 
                     91:   4. You may not copy, sublicense, distribute or transfer this program
                     92: except as expressly provided under this License Agreement.  Any attempt
                     93: otherwise to copy, sublicense, distribute or transfer this program is void and
                     94: your rights to use the program under this License agreement shall be
                     95: automatically terminated.  However, parties who have received computer
                     96: software programs from you with this License Agreement will not have
                     97: their licenses terminated so long as such parties remain in full compliance.
                     98: 
                     99:   5. If you wish to incorporate parts of this program into other free
                    100: programs whose distribution conditions are different, write to the Free
                    101: Software Foundation at 675 Mass Ave, Cambridge, MA 02139.  We have not yet
                    102: worked out a simple rule that can be stated here, but we will often permit
                    103: this.  We will be guided by the two goals of preserving the free status of
                    104: all derivatives of our free software and of promoting the sharing and reuse of
                    105: software.
                    106: 
                    107: 
                    108: In other words, you are welcome to use, share and improve this program.
                    109: You are forbidden to forbid anyone else to use, share and improve
                    110: what you give them.   Help stamp out software-hoarding!  */
                    111: 
                    112: #include "config.h"
                    113: #include <sys/types.h>
                    114: #include <sys/file.h>
                    115: #include <sys/stat.h>
                    116: #include <stdio.h>
                    117: #include <varargs.h>
                    118: #include <filehdr.h>
                    119: #include <aouthdr.h>
                    120: #include <scnhdr.h>
                    121: #include <sym.h>
                    122: 
                    123: #ifdef IRIS_4D
                    124: #include "getpagesize.h"
                    125: #include <fcntl.h>
                    126: #endif
                    127: 
                    128: static void fatal_unexec ();
                    129: 
                    130: #define READ(_fd, _buffer, _size, _error_message, _error_arg) \
                    131:        errno = EEOF; \
                    132:        if (read(_fd, _buffer, _size) != _size) \
                    133:          fatal_unexec(_error_message, _error_arg);
                    134: 
                    135: #define WRITE(_fd, _buffer, _size, _error_message, _error_arg) \
                    136:        if (write(_fd, _buffer, _size) != _size) \
                    137:          fatal_unexec(_error_message, _error_arg);
                    138: 
                    139: #define SEEK(_fd, _position, _error_message, _error_arg) \
                    140:        errno = EEOF; \
                    141:        if (lseek(_fd, _position, L_SET) != _position) \
                    142:          fatal_unexec(_error_message, _error_arg);
                    143: 
                    144: extern int errno;
                    145: extern int sys_nerr;
                    146: extern char *sys_errlist[];
                    147: #define EEOF -1
                    148: 
                    149: static struct scnhdr *text_section;
                    150: static struct scnhdr *init_section;
                    151: static struct scnhdr *finit_section;
                    152: static struct scnhdr *rdata_section;
                    153: static struct scnhdr *data_section;
                    154: static struct scnhdr *lit8_section;
                    155: static struct scnhdr *lit4_section;
                    156: static struct scnhdr *sdata_section;
                    157: static struct scnhdr *sbss_section;
                    158: static struct scnhdr *bss_section;
                    159: 
                    160: struct headers {
                    161:     struct filehdr fhdr;
                    162:     struct aouthdr aout;
                    163:     struct scnhdr section[10];
                    164: };
                    165: 
                    166: /* Define name of label for entry point for the dumped executable.  */
                    167: 
                    168: #ifndef DEFAULT_ENTRY_ADDRESS
                    169: #define DEFAULT_ENTRY_ADDRESS __start
                    170: #endif
                    171: 
                    172: unexec (new_name, a_name, data_start, bss_start, entry_address)
                    173:      char *new_name, *a_name;
                    174:      unsigned data_start, bss_start, entry_address;
                    175: {
                    176:   int new, old;
                    177:   int pagesize, brk;
                    178:   int newsyms, symrel;
                    179:   int nread;
                    180:   struct headers hdr;
                    181:   int i;
                    182:   int vaddr, scnptr;
                    183: #define BUFSIZE 8192
                    184:   char buffer[BUFSIZE];
                    185: 
                    186:   old = open (a_name, O_RDONLY, 0);
                    187:   if (old < 0) fatal_unexec ("opening %s", a_name);
                    188: 
                    189:   new = creat (new_name, 0666);
                    190:   if (new < 0) fatal_unexec ("creating %s", new_name);
                    191: 
                    192:   hdr = *((struct headers *)TEXT_START);
                    193:   if (hdr.fhdr.f_magic != MIPSELMAGIC
                    194:       && hdr.fhdr.f_magic != MIPSEBMAGIC)
                    195:     {
                    196:       fprintf(stderr, "unexec: input file magic number is %x, not %x or %x.\n",
                    197:              hdr.fhdr.f_magic, MIPSELMAGIC, MIPSEBMAGIC);
                    198:       exit(1);
                    199:     }
                    200:   if (hdr.fhdr.f_opthdr != sizeof(hdr.aout))
                    201:     {
                    202:       fprintf(stderr, "unexec: input a.out header is %d bytes, not %d.\n",
                    203:              hdr.fhdr.f_opthdr, sizeof(hdr.aout));
                    204:       exit(1);
                    205:     }
                    206:   if (hdr.aout.magic != ZMAGIC)
                    207:     {
                    208:       fprintf(stderr, "unexec: input file a.out magic number is %o, not %o.\n",
                    209:              hdr.aout.magic, ZMAGIC);
                    210:       exit(1);
                    211:     }
                    212: 
                    213: #define CHECK_SCNHDR(ptr, name, flags) \
                    214:   if (strcmp(hdr.section[i].s_name, name) == 0) { \
                    215:     if (hdr.section[i].s_flags != flags) { \
                    216:       fprintf(stderr, "unexec: %x flags where %x expected in %s section.\n", \
                    217:              hdr.section[i].s_flags, flags, name); \
                    218:     } \
                    219:     ptr = hdr.section + i; \
                    220:     i += 1; \
                    221:   } \
                    222:   else { \
                    223:     ptr = NULL; \
                    224:     }
                    225: 
                    226:   i = 0;
                    227:   CHECK_SCNHDR(text_section,  _TEXT,  STYP_TEXT);
                    228:   CHECK_SCNHDR(init_section,  _INIT,  STYP_INIT);
                    229:   CHECK_SCNHDR(rdata_section, _RDATA, STYP_RDATA);
                    230:   CHECK_SCNHDR(data_section,  _DATA,  STYP_DATA);
                    231: #ifdef _LIT8
                    232:   CHECK_SCNHDR(lit8_section,  _LIT8,  STYP_LIT8);
                    233:   CHECK_SCNHDR(lit4_section,  _LIT4,  STYP_LIT4);
                    234: #endif /* _LIT8 */
                    235:   CHECK_SCNHDR(sdata_section, _SDATA, STYP_SDATA);
                    236:   CHECK_SCNHDR(sbss_section,  _SBSS,  STYP_SBSS);
                    237:   CHECK_SCNHDR(bss_section,   _BSS,   STYP_BSS);
                    238:   if (i != hdr.fhdr.f_nscns)
                    239:     fprintf(stderr, "unexec: %d sections found instead of %d.\n",
                    240:            i, hdr.fhdr.f_nscns);
                    241: 
                    242:   pagesize = getpagesize();
                    243:   brk = (sbrk(0) + pagesize - 1) & (-pagesize);
                    244:   hdr.aout.dsize = brk - DATA_START;
                    245:   hdr.aout.bsize = 0;
                    246:   if (entry_address == 0)
                    247:     {
                    248:       extern DEFAULT_ENTRY_ADDRESS();
                    249:       hdr.aout.entry = (unsigned)DEFAULT_ENTRY_ADDRESS;
                    250:     }
                    251:   else
                    252:     hdr.aout.entry = entry_address;
                    253: 
                    254:   hdr.aout.bss_start = hdr.aout.data_start + hdr.aout.dsize;
                    255:   rdata_section->s_size = data_start - DATA_START;
                    256:   data_section->s_vaddr = data_start;
                    257:   data_section->s_paddr = data_start;
                    258:   data_section->s_size = brk - DATA_START;
                    259:   data_section->s_scnptr = rdata_section->s_scnptr + rdata_section->s_size;
                    260:   vaddr = data_section->s_vaddr + data_section->s_size;
                    261:   scnptr = data_section->s_scnptr + data_section->s_size;
                    262:   if (lit8_section != NULL)
                    263:     {
                    264:       lit8_section->s_vaddr = vaddr;
                    265:       lit8_section->s_paddr = vaddr;
                    266:       lit8_section->s_size = 0;
                    267:       lit8_section->s_scnptr = scnptr;
                    268:     }
                    269:   if (lit4_section != NULL)
                    270:     {
                    271:       lit4_section->s_vaddr = vaddr;
                    272:       lit4_section->s_paddr = vaddr;
                    273:       lit4_section->s_size = 0;
                    274:       lit4_section->s_scnptr = scnptr;
                    275:     }
                    276:   if (sdata_section != NULL)
                    277:     {
                    278:       sdata_section->s_vaddr = vaddr;
                    279:       sdata_section->s_paddr = vaddr;
                    280:       sdata_section->s_size = 0;
                    281:       sdata_section->s_scnptr = scnptr;
                    282:     }
                    283:   if (sbss_section != NULL)
                    284:     {
                    285:       sbss_section->s_vaddr = vaddr;
                    286:       sbss_section->s_paddr = vaddr;
                    287:       sbss_section->s_size = 0;
                    288:       sbss_section->s_scnptr = scnptr;
                    289:     }
                    290:   if (bss_section != NULL)
                    291:     {
                    292:       bss_section->s_vaddr = vaddr;
                    293:       bss_section->s_paddr = vaddr;
                    294:       bss_section->s_size = 0;
                    295:       bss_section->s_scnptr = scnptr;
                    296:     }
                    297: 
                    298:   WRITE(new, TEXT_START, hdr.aout.tsize,
                    299:        "writing text section to %s", new_name);
                    300:   WRITE(new, DATA_START, hdr.aout.dsize,
                    301:        "writing text section to %s", new_name);
                    302: 
                    303:   SEEK(old, hdr.fhdr.f_symptr, "seeking to start of symbols in %s", a_name);
                    304:   errno = EEOF;
                    305:   nread = read(old, buffer, BUFSIZE);
                    306:   if (nread < sizeof(HDRR)) fatal_unexec("reading symbols from %s", a_name);
                    307: #define symhdr ((pHDRR)buffer)
                    308:   newsyms = hdr.aout.tsize + hdr.aout.dsize;
                    309:   symrel = newsyms - hdr.fhdr.f_symptr;
                    310:   hdr.fhdr.f_symptr = newsyms;
                    311:   symhdr->cbLineOffset += symrel;
                    312:   symhdr->cbDnOffset += symrel;
                    313:   symhdr->cbPdOffset += symrel;
                    314:   symhdr->cbSymOffset += symrel;
                    315:   symhdr->cbOptOffset += symrel;
                    316:   symhdr->cbAuxOffset += symrel;
                    317:   symhdr->cbSsOffset += symrel;
                    318:   symhdr->cbSsExtOffset += symrel;
                    319:   symhdr->cbFdOffset += symrel;
                    320:   symhdr->cbRfdOffset += symrel;
                    321:   symhdr->cbExtOffset += symrel;
                    322: #undef symhdr
                    323:   do
                    324:     {
                    325:       if (write(new, buffer, nread) != nread)
                    326:        fatal_unexec("writing symbols to %s", new_name);
                    327:       nread = read(old, buffer, BUFSIZE);
                    328:       if (nread < 0) fatal_unexec("reading symbols from %s", a_name);
                    329: #undef BUFSIZE
                    330:     } while (nread != 0);
                    331: 
                    332:   SEEK(new, 0, "seeking to start of header in %s", new_name);
                    333:   WRITE(new, &hdr, sizeof(hdr),
                    334:        "writing header of %s", new_name);
                    335: 
                    336:   close(old);
                    337:   close(new);
                    338:   mark_x(new_name);
                    339: }
                    340: 
                    341: /*
                    342:  * mark_x
                    343:  *
                    344:  * After succesfully building the new a.out, mark it executable
                    345:  */
                    346: 
                    347: static
                    348: mark_x (name)
                    349:      char *name;
                    350: {
                    351:   struct stat sbuf;
                    352:   int um = umask (777);
                    353:   umask (um);
                    354:   if (stat (name, &sbuf) < 0)
                    355:     fatal_unexec ("getting protection on %s", name);
                    356:   sbuf.st_mode |= 0111 & ~um;
                    357:   if (chmod (name, sbuf.st_mode) < 0)
                    358:     fatal_unexec ("setting protection on %s", name);
                    359: }
                    360: 
                    361: static void
                    362: fatal_unexec (s, va_alist)
                    363:      va_dcl
                    364: {
                    365:   va_list ap;
                    366:   if (errno == EEOF)
                    367:     fputs ("unexec: unexpected end of file, ", stderr);
                    368:   else if (errno < sys_nerr)
                    369:     fprintf (stderr, "unexec: %s, ", sys_errlist[errno]);
                    370:   else
                    371:     fprintf (stderr, "unexec: error code %d, ", errno);
                    372:   va_start (ap);
                    373:   _doprnt (s, ap, stderr);
                    374:   fputs (".\n", stderr);
                    375:   exit (1);
                    376: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.