Annotation of 43BSDReno/contrib/emacs-18.55/src/unexmips.c, revision 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.