Annotation of objc/objcopt.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * "Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
        !             7:  * Reserved.  This file contains Original Code and/or Modifications of
        !             8:  * Original Code as defined in and that are subject to the Apple Public
        !             9:  * Source License Version 1.0 (the 'License').  You may not use this file
        !            10:  * except in compliance with the License.  Please obtain a copy of the
        !            11:  * License at http://www.apple.com/publicsource and read it before using
        !            12:  * this file.
        !            13:  * 
        !            14:  * The Original Code and all software distributed under the License are
        !            15:  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            19:  * License for the specific language governing rights and limitations
        !            20:  * under the License."
        !            21:  * 
        !            22:  * @APPLE_LICENSE_HEADER_END@
        !            23:  */
        !            24: #include <stdio.h>
        !            25: #include <stdlib.h>
        !            26: #include <sys/file.h>
        !            27: #include <sys/types.h>
        !            28: #include <sys/stat.h>
        !            29: #include <mach-o/loader.h>
        !            30: #include <objc/objc-runtime.h>
        !            31: #include <objc/NXString.h>
        !            32: #include <sys/types.h>
        !            33: #include "Protocol.h"
        !            34: 
        !            35: /* These are in libc in later updates */
        !            36: void
        !            37: swap_mach_header(
        !            38: struct mach_header *mh,
        !            39: enum NXByteOrder target_byte_order)
        !            40: {
        !            41:        mh->magic = NXSwapLong(mh->magic);
        !            42:        mh->cputype = NXSwapLong(mh->cputype);
        !            43:        mh->cpusubtype = NXSwapLong(mh->cpusubtype);
        !            44:        mh->filetype = NXSwapLong(mh->filetype);
        !            45:        mh->ncmds = NXSwapLong(mh->ncmds);
        !            46:        mh->sizeofcmds = NXSwapLong(mh->sizeofcmds);
        !            47:        mh->flags = NXSwapLong(mh->flags);
        !            48: }
        !            49: 
        !            50: void
        !            51: swap_load_command(
        !            52: struct load_command *lc,
        !            53: enum NXByteOrder target_byte_order)
        !            54: {
        !            55:        lc->cmd = NXSwapLong(lc->cmd);
        !            56:        lc->cmdsize = NXSwapLong(lc->cmdsize);
        !            57: }
        !            58: 
        !            59: void
        !            60: swap_segment_command(
        !            61: struct segment_command *sg,
        !            62: enum NXByteOrder target_byte_order)
        !            63: {
        !            64:        /* segname[16] */
        !            65:        sg->cmd = NXSwapLong(sg->cmd);
        !            66:        sg->cmdsize = NXSwapLong(sg->cmdsize);
        !            67:        sg->vmaddr = NXSwapLong(sg->vmaddr);
        !            68:        sg->vmsize = NXSwapLong(sg->vmsize);
        !            69:        sg->fileoff = NXSwapLong(sg->fileoff);
        !            70:        sg->filesize = NXSwapLong(sg->filesize);
        !            71:        sg->maxprot = NXSwapLong(sg->maxprot);
        !            72:        sg->initprot = NXSwapLong(sg->initprot);
        !            73:        sg->nsects = NXSwapLong(sg->nsects);
        !            74:        sg->flags = NXSwapLong(sg->flags);
        !            75: }
        !            76: 
        !            77: void
        !            78: swap_section(
        !            79: struct section *s,
        !            80: unsigned long nsects,
        !            81: enum NXByteOrder target_byte_order)
        !            82: {
        !            83:     unsigned long i;
        !            84: 
        !            85:        for(i = 0; i < nsects; i++){
        !            86:            /* sectname[16] */
        !            87:            /* segname[16] */
        !            88:            s[i].addr = NXSwapLong(s[i].addr);
        !            89:            s[i].size = NXSwapLong(s[i].size);
        !            90:            s[i].offset = NXSwapLong(s[i].offset);
        !            91:            s[i].align = NXSwapLong(s[i].align);
        !            92:            s[i].reloff = NXSwapLong(s[i].reloff);
        !            93:            s[i].nreloc = NXSwapLong(s[i].nreloc);
        !            94:            s[i].flags = NXSwapLong(s[i].flags);
        !            95:            s[i].reserved1 = NXSwapLong(s[i].reserved1);
        !            96:            s[i].reserved2 = NXSwapLong(s[i].reserved2);
        !            97:        }
        !            98: }
        !            99: 
        !           100: void
        !           101: swap_symtab_command(
        !           102: struct symtab_command *st,
        !           103: enum NXByteOrder target_byte_order)
        !           104: {
        !           105:        st->cmd = NXSwapLong(st->cmd);
        !           106:        st->cmdsize = NXSwapLong(st->cmdsize);
        !           107:        st->symoff = NXSwapLong(st->symoff);
        !           108:        st->nsyms = NXSwapLong(st->nsyms);
        !           109:        st->stroff = NXSwapLong(st->stroff);
        !           110:        st->strsize = NXSwapLong(st->strsize);
        !           111: }
        !           112: 
        !           113: void
        !           114: swap_symseg_command(
        !           115: struct symseg_command *ss,
        !           116: enum NXByteOrder target_byte_order)
        !           117: {
        !           118:        ss->cmd = NXSwapLong(ss->cmd);
        !           119:        ss->cmdsize = NXSwapLong(ss->cmdsize);
        !           120:        ss->offset = NXSwapLong(ss->offset);
        !           121:        ss->size = NXSwapLong(ss->size);
        !           122: }
        !           123: 
        !           124: /*
        !           125:  * For system call errors the error messages allways contains
        !           126:  * sys_errlist[errno] as part of the message.
        !           127:  */
        !           128: extern char *sys_errlist[];
        !           129: extern int errno;
        !           130: 
        !           131: /* Name of this program for error messages (argv[0]) */
        !           132: char *progname;
        !           133: 
        !           134: extern void _sel_writeHashTable(
        !           135:        int start_addr, 
        !           136:        char *myselectorstraddr, 
        !           137:        char *shlibselectorstraddr,
        !           138:        void **stuff, 
        !           139:        int *stuffsize
        !           140: );
        !           141: 
        !           142: /*
        !           143:  * Declarations for the static routines in this file.
        !           144:  */
        !           145: static void usage();
        !           146: 
        !           147: static Module get_objc(
        !           148:        long fd, 
        !           149:        char *filename, 
        !           150:        struct section *objcsects, 
        !           151:        int nsects
        !           152: );
        !           153: static void print_method_list(
        !           154:        struct objc_method_list *mlist_before_reloc, 
        !           155:        struct section *firstobjcsect, 
        !           156:        int nsects
        !           157: );
        !           158: static void print_method_list2(
        !           159:        struct objc_method_description_list *mlist_before_reloc, 
        !           160:        struct section *firstobjcsect, 
        !           161:        int nsects
        !           162: );
        !           163: static void getObjcSections(
        !           164:        struct mach_header *mh,
        !           165:        struct load_command *lc, 
        !           166:        struct section **objcsects, 
        !           167:        int *nsects
        !           168: );
        !           169: static void readObjcData(
        !           170:        long fd,
        !           171:        char *filename,
        !           172:        struct section *objcsects, 
        !           173:        int nsects
        !           174: );
        !           175: static void swapObjcData(
        !           176:        struct section *objcsects, 
        !           177:        int nsects
        !           178: );
        !           179: static void swap_objc_modules(
        !           180:        struct objc_module *modules,
        !           181:        unsigned long size
        !           182: );
        !           183: static void swap_objc_symtabs(
        !           184:        struct objc_symtab *symtabs,
        !           185:        unsigned long size
        !           186: );
        !           187: static void swap_objc_classes(
        !           188:        struct objc_class *classes,
        !           189:        unsigned long size
        !           190: );
        !           191: static void swap_objc_categories(
        !           192:        struct objc_category *categories,
        !           193:        unsigned long size
        !           194: );
        !           195: static void swap_objc_method_lists(
        !           196:        struct objc_method_list *method_lists,
        !           197:        unsigned long size
        !           198: );
        !           199: static void swap_objc_protocols(
        !           200:        Protocol *protocols,
        !           201:        unsigned long size
        !           202: );
        !           203: static void swap_objc_ivar_lists(
        !           204:        struct objc_ivar_list *ivar_lists,
        !           205:        unsigned long size
        !           206: );
        !           207: static void swap_objc_protocol_lists(
        !           208:        struct objc_protocol_list *protocol_lists,
        !           209:        unsigned long size
        !           210: );
        !           211: static void swap_objc_refs(
        !           212:        unsigned long *refs,
        !           213:        unsigned long size
        !           214: );
        !           215: static void swap_string_objects(
        !           216:        NXConstantString *s,
        !           217:        unsigned long size
        !           218: );
        !           219: static void swap_objc_method_description_lists(
        !           220:        struct objc_method_description_list *mdls,
        !           221:        unsigned long size
        !           222: );
        !           223: struct _hashEntry {
        !           224:     struct _hashEntry *next;
        !           225:     char *sel;
        !           226: };
        !           227: static void swap_hashEntries(
        !           228:        struct _hashEntry *_hashEntries,
        !           229:        unsigned long size
        !           230: );
        !           231: static void *getObjcData(
        !           232:        struct section *objcsects, 
        !           233:        int nsects,
        !           234:        const void *addr
        !           235: );
        !           236: static struct section *getObjcSection(
        !           237:        struct section *objcsects, 
        !           238:        int nsects,
        !           239:        char *name      
        !           240: );
        !           241: 
        !           242: int swapped = 0;
        !           243: 
        !           244: void
        !           245: main(argc, argv)
        !           246: int argc;
        !           247: char *argv[];
        !           248: {
        !           249:        long fd;
        !           250:        char *filename;
        !           251:        struct mach_header mh;
        !           252:        struct load_command *lcp;
        !           253: 
        !           254:        progname = argv[0];
        !           255: 
        !           256:        if(argc == 1) {
        !           257:            fprintf(stderr, "%s: At least one file must be specified\n",
        !           258:                    progname);
        !           259:            usage();
        !           260:            exit(1);
        !           261:        }
        !           262:        else if (argc == 2)
        !           263:          filename = argv[1];
        !           264:        else
        !           265:          {
        !           266:            usage();
        !           267:            exit(1);
        !           268:          }
        !           269:        
        !           270:        fd = open(filename, O_RDONLY);
        !           271:        if(fd < 0){
        !           272:                fprintf(stderr, "%s : Can't open %s (%s)\n", progname,
        !           273:                        filename, sys_errlist[errno]);
        !           274:        }
        !           275:        lseek(fd, 0, 0);
        !           276:        if(read(fd, (char *)&mh, sizeof(mh)) != sizeof(mh)){
        !           277:            fprintf(stderr, "%s : Can't read mach header of %s (%s)\n",
        !           278:                        progname, filename, sys_errlist[errno]);
        !           279:            return;
        !           280:        }
        !           281:        if(mh.magic == MH_MAGIC){
        !           282:                if((lcp = (struct load_command *)malloc(mh.sizeofcmds))
        !           283:                    == (struct load_command *)0){
        !           284:                    fprintf(stderr, "%s : Ran out of memory (%s)\n",
        !           285:                            progname, sys_errlist[errno]);
        !           286:                    exit(1);
        !           287:                }
        !           288:                if(read(fd, (char *)lcp, mh.sizeofcmds) != mh.sizeofcmds){
        !           289:                    fprintf(stderr,"%s : Can't read load commands of %s (%s)\n",
        !           290:                               progname, filename, sys_errlist[errno]);
        !           291:                    lcp = (struct load_command *)0;
        !           292:                }
        !           293:        }
        !           294:        else if(mh.magic == NXSwapLong(MH_MAGIC)){
        !           295:                if((lcp = (struct load_command *)
        !           296:                                malloc(NXSwapLong(mh.sizeofcmds)))
        !           297:                                == (struct load_command *)0){
        !           298:                    fprintf(stderr, "%s : Ran out of memory (%s)\n",
        !           299:                            progname, sys_errlist[errno]);
        !           300:                    exit(1);
        !           301:                }
        !           302:                if(read(fd, (char *)lcp, NXSwapLong(mh.sizeofcmds)) !=
        !           303:                   NXSwapLong(mh.sizeofcmds)){
        !           304:                    fprintf(stderr,"%s : Can't read load commands of %s (%s)\n",
        !           305:                               progname, filename, sys_errlist[errno]);
        !           306:                    lcp = (struct load_command *)0;
        !           307:                }
        !           308:        }
        !           309: 
        !           310:        {
        !           311:        struct section *firstobjcsect;
        !           312:        int nsects, size;
        !           313:        long vm_hashaddr;
        !           314:        void *table; 
        !           315:        struct section *sel, *tmp;
        !           316:        char *selectors, tempfilename[] = "objcoptXXXXXX";
        !           317: 
        !           318:        getObjcSections(&mh, lcp, &firstobjcsect, &nsects);
        !           319:        get_objc(fd, filename, firstobjcsect, nsects);
        !           320: 
        !           321:        if (strcmp(firstobjcsect[nsects-1].sectname, "__runtime_setup") == 0)
        !           322:                // we are doing a `replace'
        !           323:                vm_hashaddr = firstobjcsect[nsects-1].addr;
        !           324:        else  
        !           325:                vm_hashaddr = round(firstobjcsect[nsects-1].addr + 
        !           326:                                firstobjcsect[nsects-1].size, sizeof(long));
        !           327: 
        !           328:        sel = getObjcSection(firstobjcsect, nsects, "__meth_var_names");
        !           329:        
        !           330:        tmp = getObjcSection(firstobjcsect, nsects, "__selector_strs");
        !           331:        
        !           332:        if (sel && tmp)
        !           333:          {
        !           334:            fprintf (stderr,
        !           335:                     "Cannot objcopt mixture of new and old strings\n");
        !           336:            exit (1);
        !           337:          }
        !           338:        
        !           339:        if (!sel)
        !           340:          sel = tmp;    // Use old-style strings
        !           341:        
        !           342:        selectors = (char *)sel->reserved1;
        !           343: 
        !           344:        _sel_writeHashTable(vm_hashaddr, (char *)selectors, (char *)sel->addr,
        !           345:                                 &table, &size);
        !           346:        if(swapped)
        !           347:            swap_hashEntries((struct _hashEntry *)table, size);
        !           348: 
        !           349:        mktemp(tempfilename);
        !           350:        add_objc_runtime_setup(filename,tempfilename,table, size);
        !           351: 
        !           352:        close(fd);
        !           353:        unlink(filename);
        !           354:        if (rename(tempfilename, filename) == -1) {
        !           355:                fprintf(stderr, "%s : Cannot rename temporary file from: "
        !           356:                                "%s to %s\n", progname, tempfilename, filename);
        !           357:                exit(1);
        !           358:        }
        !           359:        }
        !           360: 
        !           361:        exit(0);
        !           362: }
        !           363: 
        !           364: static void getObjcSections(
        !           365:        struct mach_header *mh,
        !           366:        struct load_command *lc, 
        !           367:        struct section **objcsects, 
        !           368:        int *nsects
        !           369: )
        !           370: {
        !           371:        int i,j;
        !           372:        struct segment_command *sg;
        !           373:        struct section *s;
        !           374:        struct load_command l, *initlc;
        !           375: 
        !           376:        swapped = mh->magic == NXSwapLong(MH_MAGIC);
        !           377:        if(swapped)
        !           378:            swap_mach_header(mh, NXHostByteOrder());
        !           379:        initlc = lc;
        !           380: 
        !           381:        for(i = 0 ; i < mh->ncmds; i++){
        !           382:            l = *lc;
        !           383:            if(swapped)
        !           384:                swap_load_command(&l, NXHostByteOrder());
        !           385:            if(l.cmdsize % sizeof(long) != 0)
        !           386:                printf("load command %d size not a multiple of sizeof(long)\n",
        !           387:                       i);
        !           388:            if((char *)lc + l.cmdsize > (char *)initlc + mh->sizeofcmds)
        !           389:                printf("load command %d extends past end of load commands\n",i);
        !           390:            if(l.cmd == LC_SEGMENT){
        !           391:                sg = (struct segment_command *)lc;
        !           392:                if(swapped)
        !           393:                    swap_segment_command(sg, NXHostByteOrder());
        !           394:                if(mh->filetype == MH_OBJECT ||
        !           395:                   strcmp(sg->segname, SEG_OBJC) == 0){
        !           396: 
        !           397:                    s = (struct section *)
        !           398:                        ((char *)sg + sizeof(struct segment_command));
        !           399: 
        !           400:                    *objcsects = s;
        !           401:                    *nsects = sg->nsects;
        !           402: 
        !           403:                    for(j = 0 ; j < sg->nsects ; j++){
        !           404:                        if(swapped)
        !           405:                            swap_section(s, 1, NXHostByteOrder());
        !           406:                        if((char *)s + sizeof(struct section) >
        !           407:                           (char *)initlc + mh->sizeofcmds){
        !           408:                            printf("section structure command extends past end "
        !           409:                                   "of load commands\n");
        !           410:                        }
        !           411:                        if((char *)s + sizeof(struct section) >
        !           412:                           (char *)initlc + mh->sizeofcmds)
        !           413:                            break;
        !           414:                        s++;
        !           415:                    }
        !           416:                }
        !           417:            }
        !           418:            if(l.cmdsize <= 0){
        !           419:                printf("load command %d size negative or zero (can't "
        !           420:                       "advance to other load commands)\n", i);
        !           421:                break;
        !           422:            }
        !           423:            lc = (struct load_command *)((char *)lc + l.cmdsize);
        !           424:            if((char *)lc > (char *)initlc + mh->sizeofcmds)
        !           425:                break;
        !           426:        }
        !           427:        if((char *)initlc + mh->sizeofcmds != (char *)lc)
        !           428:            printf("Inconsistant mh_sizeofcmds\n");
        !           429: }
        !           430: 
        !           431: static void readObjcData(
        !           432:        long fd,
        !           433:        char *filename,
        !           434:        struct section *objcsects, 
        !           435:        int nsects
        !           436: )
        !           437: {
        !           438:        int i;
        !           439: 
        !           440:        for (i = 0; i < nsects; i++) {
        !           441: 
        !           442:                struct section *s;
        !           443: 
        !           444:                s = objcsects + i;
        !           445: 
        !           446:                if (s->size > 0) {
        !           447:                  if((s->reserved1 = (long)malloc(s->size)) == 0) {
        !           448:                    fprintf(stderr, "%s : Ran out of memory (%s)\n", 
        !           449:                        progname, sys_errlist[errno]);
        !           450:                    exit(1);
        !           451:                  }
        !           452:                  lseek(fd, s->offset, 0);
        !           453:                  if((read(fd, s->reserved1, s->size)) != s->size){
        !           454:                    fprintf(stderr, "%s : Can't read modules of %s (%s)\n",
        !           455:                        progname, filename, sys_errlist[errno]);
        !           456:                    free((void *)s->reserved1);
        !           457:                    return;
        !           458:                  }
        !           459:                }
        !           460:        }
        !           461: }
        !           462: 
        !           463: struct objc_protocol
        !           464: {
        !           465:     @defs(Protocol)
        !           466: };
        !           467: 
        !           468: struct objc_string_object
        !           469: {
        !           470:     @defs(NXConstantString)
        !           471: };
        !           472: 
        !           473: static void swapObjcData(
        !           474:        struct section *objcsects, 
        !           475:        int nsects
        !           476: )
        !           477: {
        !           478:        int i, categories_size = 0, protocols_size = 0;
        !           479:        struct objc_category *categories = NULL;
        !           480:        struct objc_protocol *protocols = NULL;
        !           481:        struct section *s, *cat_inst = NULL, *cat_cls = NULL;
        !           482:        struct objc_method_list *method_list;
        !           483:        struct objc_protocol_list *protocol_list;
        !           484:        struct objc_method_description_list *mdl;
        !           485: 
        !           486:        for (i = 0; i < nsects; i++) {
        !           487: 
        !           488:                s = objcsects + i;
        !           489:                if(strncmp(s->sectname, "__class", 16) == 0 ||
        !           490:                   strncmp(s->sectname, "__meta_class", 16) == 0){
        !           491:                    swap_objc_classes((struct objc_class *)s->reserved1,
        !           492:                                      s->size);
        !           493:                }
        !           494:                else if(strncmp(s->sectname, "__string_object", 16) == 0){
        !           495:                    swap_string_objects((NXConstantString *)s->reserved1,
        !           496:                                        s->size);
        !           497:                }
        !           498:                else if(strncmp(s->sectname, "__protocol", 16) == 0){
        !           499:                    protocols = (struct objc_protocol *)s->reserved1;
        !           500:                    protocols_size = s->size;
        !           501:                    swap_objc_protocols((Protocol *)s->reserved1,
        !           502:                                        s->size);
        !           503:                }
        !           504:                else if(strncmp(s->sectname, "__cat_cls_meth", 16) == 0){
        !           505:                    /* handled special below */
        !           506:                    cat_cls = s;
        !           507:                }
        !           508:                else if(strncmp(s->sectname, "__cat_inst_meth", 16) == 0){
        !           509:                    /* handled special below */
        !           510:                    cat_inst = s;
        !           511:                }
        !           512:                else if(strncmp(s->sectname, "__cls_meth", 16) == 0 ||
        !           513:                        strncmp(s->sectname, "__inst_meth", 16) == 0){
        !           514:                    swap_objc_method_lists((struct objc_method_list *)
        !           515:                                           s->reserved1, s->size);
        !           516:                }
        !           517:                else if(strncmp(s->sectname, "__message_refs", 16) == 0 ||
        !           518:                        strncmp(s->sectname, "__selector_refs", 16) == 0 ||
        !           519:                        strncmp(s->sectname, "__cls_refs", 16) == 0){
        !           520:                    swap_objc_refs((unsigned long *)s->reserved1, s->size);
        !           521:                }
        !           522:                else if(strncmp(s->sectname, "__class_names", 16) == 0 ||
        !           523:                        strncmp(s->sectname, "__meth_var_names", 16) == 0 ||
        !           524:                        strncmp(s->sectname, "__meth_var_types", 16) == 0 ||
        !           525:                        strncmp(s->sectname, "__selector_strs", 16) == 0){
        !           526:                        ; /* character strings, no swapping */
        !           527:                }
        !           528:                else if(strncmp(s->sectname, "__module_info", 16) == 0){
        !           529:                    swap_objc_modules((struct objc_module *)s->reserved1,
        !           530:                                      s->size);
        !           531:                }
        !           532:                else if(strncmp(s->sectname, "__symbols", 16) == 0){
        !           533:                    swap_objc_symtabs((struct objc_symtab *)s->reserved1,
        !           534:                                      s->size);
        !           535:                }
        !           536:                else if(strncmp(s->sectname, "__category", 16) == 0){
        !           537:                    categories = (struct objc_category *)s->reserved1;
        !           538:                    categories_size = s->size;
        !           539:                    swap_objc_categories((struct objc_category *)s->reserved1,
        !           540:                                      s->size);
        !           541:                }
        !           542:                else if(strncmp(s->sectname, "__class_vars", 16) == 0 ||
        !           543:                        strncmp(s->sectname, "__instance_vars", 16) == 0){
        !           544:                    swap_objc_ivar_lists((struct objc_ivar_list *)s->reserved1,
        !           545:                                         s->size);
        !           546:                }
        !           547:                else if(strncmp(s->sectname, "__runtime_setup", 16) == 0){
        !           548:                    ; /* do nothing it will be tossed */
        !           549:                }
        !           550:                 else if(strncmp(s->sectname, "__cstring_object", 16)) {
        !           551:                    ; /* do nothing */
        !           552:                 }
        !           553:                 else if(strncmp(s->sectname, "__sel_fixup", 16)) {
        !           554:                    ; /* do nothing */
        !           555:                 }
        !           556:                else{
        !           557:                    fprintf(stderr, "%s : unknown __OBJC section: %s\n",
        !           558:                            progname, s->sectname);
        !           559:                    exit(1);
        !           560:                }
        !           561:        }
        !           562: 
        !           563:        for (i = 0; i < categories_size; i += sizeof(struct objc_category)){
        !           564:            if(categories->instance_methods != 0){
        !           565:                method_list = (struct objc_method_list *)
        !           566:                                (cat_inst->reserved1 + 
        !           567:                                ((unsigned long)categories->instance_methods -
        !           568:                                (unsigned long)cat_inst->addr));
        !           569:                swap_objc_method_lists(method_list,
        !           570:                    sizeof(struct objc_method_list) -
        !           571:                           sizeof(struct objc_method));
        !           572:            }
        !           573: 
        !           574:            if(categories->class_methods != 0){
        !           575:                method_list = (struct objc_method_list *)
        !           576:                                (cat_cls->reserved1 + 
        !           577:                                ((unsigned long)categories->class_methods -
        !           578:                                (unsigned long)cat_cls->addr));
        !           579:                swap_objc_method_lists(method_list,
        !           580:                    sizeof(struct objc_method_list) -
        !           581:                    sizeof(struct objc_method));
        !           582:            }
        !           583: 
        !           584:            if(categories->protocols != 0){
        !           585:                protocol_list = (struct objc_protocol_list *)
        !           586:                                (cat_cls->reserved1 + 
        !           587:                                ((unsigned long)categories->protocols -
        !           588:                                (unsigned long)cat_cls->addr));
        !           589:                swap_objc_protocol_lists(protocol_list, 
        !           590:                                         sizeof(struct objc_protocol_list) -
        !           591:                                         sizeof(struct objc_protocol *));
        !           592:            }
        !           593:            categories++;
        !           594:        }
        !           595:        for (i = 0; i < protocols_size; i += sizeof(struct objc_protocol)){
        !           596:            if(protocols->instance_methods != 0){
        !           597:                mdl = (struct objc_method_description_list *)
        !           598:                            (cat_inst->reserved1 + 
        !           599:                            ((unsigned long)protocols->instance_methods -
        !           600:                            (unsigned long)cat_inst->addr));
        !           601:                swap_objc_method_description_lists(mdl,
        !           602:                        sizeof(struct objc_method_description_list) -
        !           603:                        sizeof(struct objc_method_description));
        !           604:            }
        !           605: 
        !           606:            if(protocols->class_methods != 0){
        !           607:                mdl = (struct objc_method_description_list *)
        !           608:                            (cat_cls->reserved1 + 
        !           609:                            ((unsigned long)protocols->class_methods -
        !           610:                            (unsigned long)cat_cls->addr));
        !           611:                swap_objc_method_description_lists(mdl,
        !           612:                        sizeof(struct objc_method_description_list) -
        !           613:                        sizeof(struct objc_method_description));
        !           614:            }
        !           615:            protocols++;
        !           616:        }
        !           617: }
        !           618: 
        !           619: static
        !           620: void
        !           621: swap_objc_module(
        !           622: struct objc_module *module,
        !           623: enum NXByteOrder target_byte_order)
        !           624: {
        !           625:        module->version = NXSwapLong(module->version);
        !           626:        module->size = NXSwapLong(module->size);
        !           627:        module->name = (char *) NXSwapLong((long)module->name);
        !           628:        module->symtab = (Symtab) NXSwapLong((long)module->symtab);
        !           629: }
        !           630: 
        !           631: static
        !           632: void
        !           633: swap_objc_symtab(
        !           634: struct objc_symtab *symtab,
        !           635: enum NXByteOrder target_byte_order)
        !           636: {
        !           637:        symtab->sel_ref_cnt = NXSwapLong(symtab->sel_ref_cnt);
        !           638:        symtab->refs = (SEL *) NXSwapLong((long)symtab->refs);
        !           639:        symtab->cls_def_cnt = NXSwapShort(symtab->cls_def_cnt);
        !           640:        symtab->cat_def_cnt = NXSwapShort(symtab->cat_def_cnt);
        !           641: }
        !           642: 
        !           643: static
        !           644: void
        !           645: swap_objc_class(
        !           646: struct objc_class *objc_class,
        !           647: enum NXByteOrder target_byte_order)
        !           648: {
        !           649:        objc_class->isa = (struct objc_class *)
        !           650:                NXSwapLong((long)objc_class->isa);
        !           651:        objc_class->super_class = (struct objc_class *)
        !           652:                NXSwapLong((long)objc_class->super_class);
        !           653:        objc_class->name = (const char *)
        !           654:                NXSwapLong((long)objc_class->name);             
        !           655:        objc_class->version =
        !           656:                NXSwapLong(objc_class->version);
        !           657:        objc_class->info =
        !           658:                NXSwapLong(objc_class->info);
        !           659:        objc_class->instance_size =
        !           660:                NXSwapLong(objc_class->instance_size);
        !           661:        objc_class->ivars = (struct objc_ivar_list *)
        !           662:                NXSwapLong((long)objc_class->ivars);
        !           663:        objc_class->methods = (struct objc_method_list *)
        !           664:                NXSwapLong((long)objc_class->methods);
        !           665:        objc_class->cache = (struct objc_cache *)
        !           666:                NXSwapLong((long)objc_class->cache);
        !           667:        objc_class->protocols = (struct objc_protocol_list *)
        !           668:                NXSwapLong((long)objc_class->protocols);
        !           669: }
        !           670: 
        !           671: static
        !           672: void
        !           673: swap_objc_category(
        !           674: struct objc_category *objc_category,
        !           675: enum NXByteOrder target_byte_order)
        !           676: {
        !           677:        objc_category->category_name = (char *)
        !           678:                NXSwapLong((long)objc_category->category_name);
        !           679:        objc_category->class_name = (char *)
        !           680:                NXSwapLong((long)objc_category->class_name);
        !           681:        objc_category->instance_methods = (struct objc_method_list *)
        !           682:                NXSwapLong((long)objc_category->instance_methods);
        !           683:        objc_category->class_methods = (struct objc_method_list *)
        !           684:                NXSwapLong((long)objc_category->class_methods);
        !           685:        objc_category->protocols = (struct objc_protocol_list *)
        !           686:                NXSwapLong((long)objc_category->protocols);
        !           687: }
        !           688: 
        !           689: static
        !           690: void
        !           691: swap_objc_ivar_list(
        !           692: struct objc_ivar_list *objc_ivar_list,
        !           693: enum NXByteOrder target_byte_order)
        !           694: {
        !           695:        objc_ivar_list->ivar_count = NXSwapLong(objc_ivar_list->ivar_count);
        !           696: }
        !           697: 
        !           698: static
        !           699: void
        !           700: swap_objc_ivar(
        !           701: struct objc_ivar *objc_ivar,
        !           702: enum NXByteOrder target_byte_order)
        !           703: {
        !           704:        objc_ivar->ivar_name = (char *)
        !           705:                NXSwapLong((long)objc_ivar->ivar_name);
        !           706:        objc_ivar->ivar_type = (char *)
        !           707:                NXSwapLong((long)objc_ivar->ivar_type);
        !           708:        objc_ivar->ivar_offset = 
        !           709:                NXSwapLong(objc_ivar->ivar_offset);
        !           710: }
        !           711: 
        !           712: static
        !           713: void
        !           714: swap_objc_method_list(
        !           715: struct objc_method_list *method_list,
        !           716: enum NXByteOrder target_byte_order)
        !           717: {
        !           718:        method_list->method_next = (struct objc_method_list *)
        !           719:                NXSwapLong((long)method_list->method_next);
        !           720:        method_list->method_count = 
        !           721:                NXSwapLong(method_list->method_count);
        !           722: }
        !           723: 
        !           724: static
        !           725: void
        !           726: swap_objc_method(
        !           727: struct objc_method *method,
        !           728: enum NXByteOrder target_byte_order)
        !           729: {
        !           730:        method->method_name = (SEL)
        !           731:                NXSwapLong((long)method->method_name);
        !           732:        method->method_types = (char *)
        !           733:                NXSwapLong((long)method->method_types);
        !           734:        method->method_imp = (IMP)
        !           735:                NXSwapLong((long)method->method_imp);
        !           736: }
        !           737: 
        !           738: static
        !           739: void
        !           740: swap_objc_protocol_list(
        !           741: struct objc_protocol_list *protocol_list,
        !           742: enum NXByteOrder target_byte_order)
        !           743: {
        !           744:        protocol_list->next = (struct objc_protocol_list *)
        !           745:                NXSwapLong((long)protocol_list->next);
        !           746:        protocol_list->count =
        !           747:                NXSwapLong(protocol_list->count);
        !           748: }
        !           749: 
        !           750: static
        !           751: void
        !           752: swap_objc_protocol(
        !           753: Protocol *p,
        !           754: enum NXByteOrder target_byte_order)
        !           755: {
        !           756:     struct objc_protocol *protocol;
        !           757: 
        !           758:        protocol = (struct objc_protocol *)p;
        !           759: 
        !           760:        protocol->isa = (struct objc_class *)
        !           761:                NXSwapLong((long)protocol->isa);
        !           762:        protocol->protocol_name = (char *)
        !           763:                NXSwapLong((long)protocol->protocol_name);
        !           764:        protocol->protocol_list = (struct objc_protocol_list *)
        !           765:                NXSwapLong((long)protocol->protocol_list);
        !           766:        protocol->instance_methods = (struct objc_method_description_list *)
        !           767:                NXSwapLong((long)protocol->instance_methods);
        !           768:        protocol->class_methods = (struct objc_method_description_list *)
        !           769:                NXSwapLong((long)protocol->class_methods);
        !           770: 
        !           771: }
        !           772: 
        !           773: static
        !           774: void
        !           775: swap_objc_method_description_list(
        !           776: struct objc_method_description_list *mdl,
        !           777: enum NXByteOrder target_byte_order)
        !           778: {
        !           779:        mdl->count = NXSwapLong(mdl->count);
        !           780: }
        !           781: 
        !           782: static
        !           783: void
        !           784: swap_objc_method_description(
        !           785: struct objc_method_description *md,
        !           786: enum NXByteOrder target_byte_order)
        !           787: {
        !           788:        md->name = (SEL)NXSwapLong((long)md->name);
        !           789:        md->types = (char *)NXSwapLong((long)md->types);
        !           790: }
        !           791: 
        !           792: void
        !           793: swap_string_object(
        !           794: NXConstantString *p,
        !           795: enum NXByteOrder target_byte_order)
        !           796: {
        !           797:     struct objc_string_object *string_object;
        !           798: 
        !           799:        string_object = (struct objc_string_object *)p;
        !           800: 
        !           801:        string_object->isa = (struct objc_class *)
        !           802:                NXSwapLong((long)string_object->isa);
        !           803:        string_object->characters = (char *)
        !           804:                NXSwapLong((long)string_object->characters);
        !           805:        string_object->_length =
        !           806:                NXSwapLong(string_object->_length);
        !           807: }
        !           808: 
        !           809: static
        !           810: void
        !           811: swap_hashEntry(
        !           812: struct _hashEntry *_hashEntry,
        !           813: enum NXByteOrder target_byte_order)
        !           814: {
        !           815:        _hashEntry->next = (struct _hashEntry *)
        !           816:                NXSwapLong((long)_hashEntry->next);
        !           817:        _hashEntry->sel = (char *)
        !           818:                NXSwapLong((long)_hashEntry->sel);
        !           819: }
        !           820: 
        !           821: static void swap_objc_modules(
        !           822:        struct objc_module *modules,
        !           823:        unsigned long size
        !           824: )
        !           825: {
        !           826:        int i, j;
        !           827: 
        !           828:        for (i = 0, j = 0; i < size; i += sizeof(struct objc_module), j++)
        !           829:                swap_objc_module(modules + j, NXHostByteOrder());
        !           830: }
        !           831: 
        !           832: static void swap_objc_symtabs(
        !           833:        struct objc_symtab *symtabs,
        !           834:        unsigned long size
        !           835: )
        !           836: {
        !           837:        int i, j;
        !           838:        struct objc_symtab *symtab;
        !           839: 
        !           840:        symtab = symtabs;
        !           841:        while ((unsigned long)symtab - (unsigned long)symtabs < size){
        !           842:                swap_objc_symtab(symtab, NXHostByteOrder());
        !           843:                for(j = 0; j < symtab->cls_def_cnt; j++){
        !           844:                    symtab->defs[j] = (struct objc_class *)
        !           845:                        NXSwapLong((long)symtab->defs[j]);
        !           846:                }
        !           847:                for(j = 0; j < symtab->cat_def_cnt; j++){
        !           848:                    symtab->defs[j + symtab->cls_def_cnt] =
        !           849:                        (struct objc_class *)
        !           850:                        NXSwapLong((long)symtab->defs[j + symtab->cls_def_cnt]);
        !           851:                }
        !           852:                symtab = (struct objc_symtab *)
        !           853:                    (&(symtab->defs[symtab->cls_def_cnt +
        !           854:                                    symtab->cat_def_cnt]));
        !           855:        }
        !           856: }
        !           857: 
        !           858: static void swap_objc_classes(
        !           859:        struct objc_class *classes,
        !           860:        unsigned long size
        !           861: )
        !           862: {
        !           863:        int i, j;
        !           864: 
        !           865:        for (i = 0, j = 0; i < size; i += sizeof(struct objc_class), j++)
        !           866:                swap_objc_class(classes + j, NXHostByteOrder());
        !           867: }
        !           868: 
        !           869: static void swap_objc_categories(
        !           870:        struct objc_category *categories,
        !           871:        unsigned long size
        !           872: )
        !           873: {
        !           874:        int i, j;
        !           875: 
        !           876:        for (i = 0, j = 0; i < size; i += sizeof(struct objc_category), j++)
        !           877:                swap_objc_category(categories + j, NXHostByteOrder());
        !           878: }
        !           879: 
        !           880: static void swap_objc_method_lists(
        !           881:        struct objc_method_list *method_lists,
        !           882:        unsigned long size
        !           883: )
        !           884: {
        !           885:        int i, j;
        !           886:        struct objc_method_list *method_list;
        !           887: 
        !           888:        method_list = method_lists;
        !           889:        while ((unsigned long)method_list - (unsigned long)method_lists < size){
        !           890:                swap_objc_method_list(method_list, NXHostByteOrder());
        !           891:                for (j = 0; j < method_list->method_count; j++){
        !           892:                    swap_objc_method(&(method_list->method_list[j]),
        !           893:                                     NXHostByteOrder());
        !           894:                }
        !           895:                method_list = (struct objc_method_list *)
        !           896:                    (&(method_list->method_list[method_list->method_count]));
        !           897:        }
        !           898: }
        !           899: 
        !           900: static void swap_objc_protocols(
        !           901:        Protocol *protocols,
        !           902:        unsigned long size
        !           903: )
        !           904: {
        !           905:        int i, j;
        !           906: 
        !           907:        for (i = 0, j = 0; i < size; i += sizeof(struct objc_protocol), j++)
        !           908:                swap_objc_protocol(protocols + j, NXHostByteOrder());
        !           909: }
        !           910: 
        !           911: static void swap_objc_ivar_lists(
        !           912:        struct objc_ivar_list *ivar_lists,
        !           913:        unsigned long size
        !           914: )
        !           915: {
        !           916:        int i, j;
        !           917:        struct objc_ivar_list *ivar_list;
        !           918: 
        !           919:        ivar_list = ivar_lists;
        !           920:        while ((unsigned long)ivar_list - (unsigned long)ivar_lists < size){
        !           921:                swap_objc_ivar_list(ivar_list, NXHostByteOrder());
        !           922:                for (j = 0; j < ivar_list->ivar_count; j++){
        !           923:                    swap_objc_ivar(&(ivar_list->ivar_list[j]),
        !           924:                                     NXHostByteOrder());
        !           925:                }
        !           926:                ivar_list = (struct objc_ivar_list *)
        !           927:                    (&(ivar_list->ivar_list[ivar_list->ivar_count]));
        !           928:        }
        !           929: }
        !           930: 
        !           931: static void swap_objc_protocol_lists(
        !           932:        struct objc_protocol_list *protocol_lists,
        !           933:        unsigned long size
        !           934: )
        !           935: {
        !           936:        int i, j;
        !           937:        struct objc_protocol_list *protocol_list;
        !           938: 
        !           939:        protocol_list = protocol_lists;
        !           940:        while ((unsigned long)protocol_list -
        !           941:               (unsigned long)protocol_lists < size){
        !           942:                swap_objc_protocol_list(protocol_list, NXHostByteOrder());
        !           943:                for (j = 0; j < protocol_list->count; j++){
        !           944:                    protocol_list->list[j] = (Protocol *)
        !           945:                        NXSwapLong((long)(protocol_list->list[j]));
        !           946:                }
        !           947:                protocol_list = (struct objc_protocol_list *)
        !           948:                    (&(protocol_list->list[protocol_list->count]));
        !           949:        }
        !           950: }
        !           951: 
        !           952: static void swap_objc_method_description_lists(
        !           953:        struct objc_method_description_list *mdls,
        !           954:        unsigned long size
        !           955: )
        !           956: {
        !           957:        int i, j;
        !           958:        struct objc_method_description_list *mdl;
        !           959: 
        !           960:        mdl = mdls;
        !           961:        while ((unsigned long)mdl - (unsigned long)mdls < size){
        !           962:                swap_objc_method_description_list(mdl, NXHostByteOrder());
        !           963:                for (j = 0; j < mdl->count; j++){
        !           964:                    swap_objc_method_description( &(mdl->list[j]),
        !           965:                                                 NXHostByteOrder());
        !           966:                }
        !           967:                mdl = (struct objc_method_description_list *)
        !           968:                        (&(mdl->list[mdl->count]));
        !           969:        }
        !           970: }
        !           971: 
        !           972: static void *getObjcData(
        !           973:        struct section *objcsects, 
        !           974:        int nsects,
        !           975:        const void *addr
        !           976: )
        !           977: {
        !           978:        int i;
        !           979: 
        !           980:        if (addr == 0)
        !           981:                return 0;
        !           982: 
        !           983:        for (i = 0; i < nsects; i++) {
        !           984:                struct section *s;
        !           985: 
        !           986:                s = objcsects + i;
        !           987:                if (((long)addr >= s->addr) && 
        !           988:                        ((long)addr < (s->addr + s->size)))
        !           989:                  return (void *)(s->reserved1 + ((long)addr - s->addr));
        !           990:        }
        !           991:        fprintf(stderr, "%s : Could not `getObjcData'\n", progname);
        !           992:        exit(1);
        !           993: }
        !           994: 
        !           995: static void swap_objc_refs(
        !           996:        unsigned long *refs,
        !           997:        unsigned long size
        !           998: )
        !           999: {
        !          1000:        int i,j;
        !          1001: 
        !          1002:        for (i = 0, j = 0; i < size; i += sizeof(unsigned long), j++)
        !          1003:                refs[j] = NXSwapLong(refs[j]);
        !          1004: }
        !          1005: 
        !          1006: static struct section *getObjcSection(
        !          1007:        struct section *objcsects, 
        !          1008:        int nsects,
        !          1009:        char *name      
        !          1010: )
        !          1011: {
        !          1012:        int i;
        !          1013: 
        !          1014:        for (i = 0; i < nsects; i++) {
        !          1015:                struct section *s;
        !          1016: 
        !          1017:                s = objcsects + i;
        !          1018:                if (strncmp(s->sectname,name,16) == 0)
        !          1019:                  return s;
        !          1020:        }
        !          1021:         return 0;
        !          1022: }
        !          1023: 
        !          1024: static void swap_string_objects(
        !          1025:        NXConstantString *s,
        !          1026:        unsigned long size
        !          1027: )
        !          1028: {
        !          1029:        int i, j;
        !          1030: 
        !          1031:        for (i = 0, j = 0; i < size; i += sizeof(struct objc_string_object), j++)
        !          1032:                swap_string_object(s + j, NXHostByteOrder());
        !          1033: }
        !          1034: 
        !          1035: static void swap_hashEntries(
        !          1036:        struct _hashEntry *_hashEntries,
        !          1037:        unsigned long size
        !          1038: )
        !          1039: {
        !          1040:        int i, j;
        !          1041:        enum NXByteOrder target_byte_order;
        !          1042: 
        !          1043:        target_byte_order = NXHostByteOrder() == NX_BigEndian ?
        !          1044:                            NX_LittleEndian : NX_BigEndian;
        !          1045: 
        !          1046:        for (i = 0, j = 0; i < size; i += sizeof(struct _hashEntry), j++)
        !          1047:                swap_hashEntry(_hashEntries + j, target_byte_order);
        !          1048: }
        !          1049: 
        !          1050: /*
        !          1051:  * Print the objc segment.
        !          1052:  */
        !          1053: static
        !          1054: struct objc_module *
        !          1055: get_objc(fd, filename, firstobjcsect, nsects)
        !          1056: long fd;
        !          1057: char *filename;
        !          1058: struct section *firstobjcsect;
        !          1059: int nsects;
        !          1060: {
        !          1061:        long i, j;
        !          1062:        struct section *modsect, *msgsect, *selsect, *protosect;
        !          1063:        struct objc_module *modules, *m;
        !          1064:        struct objc_symtab *t;
        !          1065: 
        !          1066:        readObjcData(fd, filename, firstobjcsect, nsects);
        !          1067:        if(swapped)
        !          1068:            swapObjcData(firstobjcsect, nsects);
        !          1069: 
        !          1070:        modsect = getObjcSection(firstobjcsect, nsects, "__module_info");
        !          1071:        msgsect = getObjcSection(firstobjcsect, nsects, "__message_refs");
        !          1072:        if (msgsect) {
        !          1073:                int i, cnt = msgsect->size/sizeof(SEL);
        !          1074:                SEL *sels = (SEL *)msgsect->reserved1;
        !          1075: 
        !          1076:                /* overwrite the string with a unique identifier */
        !          1077:                for (i = 0; i < cnt; i++) 
        !          1078:                        sels[i] = (SEL)sel_registerName(
        !          1079:                                getObjcData(firstobjcsect, nsects,
        !          1080:                                                sels[i]));
        !          1081:        }
        !          1082:        selsect = getObjcSection(firstobjcsect, nsects, "__selector_refs");
        !          1083:        if (selsect) {
        !          1084:                int i, cnt = selsect->size/sizeof(SEL);
        !          1085:                SEL *sels = (SEL *)selsect->reserved1;
        !          1086: 
        !          1087:                /* overwrite the string with a unique identifier */
        !          1088:                for (i = 0; i < cnt; i++) 
        !          1089:                        sels[i] = (SEL)sel_registerName(
        !          1090:                                getObjcData(firstobjcsect, nsects,
        !          1091:                                                sels[i]));
        !          1092:        }
        !          1093:        modules = (Module)modsect->reserved1;
        !          1094: 
        !          1095:        for(m = modules ;
        !          1096:            (char *)m < (char *)modules + modsect->size;
        !          1097:            m = (struct objc_module *)((char *)m + m->size) ){
        !          1098: 
        !          1099:                /* relocate fields in module structure */
        !          1100: 
        !          1101:                m->name = (char *)getObjcData(firstobjcsect, nsects, 
        !          1102:                                                m->name);
        !          1103:                m->symtab = t = (Symtab)getObjcData(firstobjcsect, nsects, 
        !          1104:                                                m->symtab);
        !          1105:                                                
        !          1106:                if (t) {
        !          1107: 
        !          1108:                  /* Simulate map! */
        !          1109:                  if (m->version == 1) { 
        !          1110:                    int i, cnt = m->symtab->sel_ref_cnt;
        !          1111:                    SEL *sels = (SEL *)getObjcData(firstobjcsect, nsects,
        !          1112:                                                m->symtab->refs);
        !          1113: 
        !          1114:                    /* overwrite the string with a unique identifier */
        !          1115:                    for (i = 0; i < cnt; i++) 
        !          1116:                          sels[i] = (SEL)sel_registerName(
        !          1117:                                getObjcData(firstobjcsect, nsects,
        !          1118:                                                sels[i]));
        !          1119:                  }
        !          1120: 
        !          1121:                  for(i = 0; i < t->cls_def_cnt; i++){
        !          1122: 
        !          1123:                        struct objc_class *objc_class;
        !          1124: 
        !          1125:                        t->defs[i] = objc_class = 
        !          1126:                                (Class)getObjcData(firstobjcsect, nsects,
        !          1127:                                                t->defs[i]);
        !          1128: print_objc_class:
        !          1129:                        /* relocate class structure */
        !          1130: 
        !          1131:                        if(CLS_GETINFO(objc_class, CLS_META)){
        !          1132:                                objc_class->isa = (Class)getObjcData(
        !          1133:                                        firstobjcsect, nsects, objc_class->isa);
        !          1134:                        }
        !          1135: 
        !          1136:                        objc_class->super_class = (Class)getObjcData(
        !          1137:                                                firstobjcsect, nsects, 
        !          1138:                                                objc_class->super_class);
        !          1139: 
        !          1140:                        objc_class->name = (char *)getObjcData(
        !          1141:                                                firstobjcsect, nsects, 
        !          1142:                                                objc_class->name);
        !          1143: 
        !          1144:                        if (objc_class->ivars) {
        !          1145:                                struct objc_ivar_list *ilist;
        !          1146:                                struct objc_ivar *ivar;
        !          1147: 
        !          1148:                                objc_class->ivars = ilist = 
        !          1149:                                        (struct objc_ivar_list *)getObjcData(
        !          1150:                                                firstobjcsect, nsects, 
        !          1151:                                                objc_class->ivars);
        !          1152: 
        !          1153:                                ivar = ilist->ivar_list;
        !          1154:                                for(j = 0; j < ilist->ivar_count; j++, ivar++){
        !          1155:                                        ivar->ivar_name= (char *)getObjcData(
        !          1156:                                                firstobjcsect, nsects, 
        !          1157:                                                ivar->ivar_name);
        !          1158: 
        !          1159:                                        ivar->ivar_type= (char *)getObjcData(
        !          1160:                                                firstobjcsect, nsects, 
        !          1161:                                                ivar->ivar_type);
        !          1162:                                }
        !          1163:                        }
        !          1164: 
        !          1165:                        if (objc_class->methods) {
        !          1166:                                print_method_list(objc_class->methods, 
        !          1167:                                                firstobjcsect, nsects);
        !          1168:                        }
        !          1169: 
        !          1170:                        if(CLS_GETINFO(objc_class, CLS_CLASS)){
        !          1171:                            objc_class->isa = objc_class = 
        !          1172:                                        (Class)getObjcData(
        !          1173:                                                firstobjcsect, nsects,
        !          1174:                                                objc_class->isa);
        !          1175:                            goto print_objc_class;
        !          1176:                        }
        !          1177:                  }
        !          1178: 
        !          1179:                  for(i = 0; i < t->cat_def_cnt; i++){
        !          1180: 
        !          1181:                        struct objc_category *objc_category;
        !          1182: 
        !          1183:                        t->defs[i + t->cls_def_cnt] = objc_category = 
        !          1184:                                (Category)getObjcData(firstobjcsect, nsects,
        !          1185:                                                t->defs[i+t->cls_def_cnt]);
        !          1186: 
        !          1187:                        objc_category->category_name = (char *)getObjcData(
        !          1188:                                                firstobjcsect, nsects, 
        !          1189:                                                objc_category->category_name);
        !          1190: 
        !          1191:                        objc_category->class_name = (char *)getObjcData(
        !          1192:                                                firstobjcsect, nsects, 
        !          1193:                                                objc_category->class_name);
        !          1194: 
        !          1195:                        if (objc_category->instance_methods) {
        !          1196:                            print_method_list(objc_category->instance_methods, 
        !          1197:                                                firstobjcsect, nsects);
        !          1198:                        }
        !          1199: 
        !          1200:                        if (objc_category->class_methods) {
        !          1201:                            print_method_list(objc_category->class_methods, 
        !          1202:                                                firstobjcsect, nsects);
        !          1203:                        }
        !          1204:                  }
        !          1205:                }
        !          1206:        }
        !          1207:        protosect = getObjcSection(firstobjcsect, nsects, "__protocol");
        !          1208:        if (protosect) {
        !          1209:                int i, cnt = protosect->size/sizeof(Protocol);
        !          1210:                struct proto_template { @defs(Protocol) } *protos;
        !          1211:                
        !          1212:                protos = (struct proto_template *) protosect->reserved1;
        !          1213: 
        !          1214:                for (i = 0; i < cnt; i++)
        !          1215:                  {
        !          1216:                    if (protos[i].instance_methods) {
        !          1217:                        print_method_list2(protos[i].instance_methods, 
        !          1218:                                            firstobjcsect, nsects);
        !          1219:                    }
        !          1220: 
        !          1221:                    if (protos[i].class_methods) {
        !          1222:                        print_method_list2(protos[i].class_methods, 
        !          1223:                                            firstobjcsect, nsects);
        !          1224:                    }
        !          1225:                  }
        !          1226:        }
        !          1227:        return modules;
        !          1228: }
        !          1229: 
        !          1230: static
        !          1231: void
        !          1232: print_method_list(struct objc_method_list *mlist_before_reloc, 
        !          1233:                  struct section *firstobjcsect, 
        !          1234:                  int nsects)
        !          1235: {
        !          1236:     long i;
        !          1237:     struct objc_method *method;
        !          1238:     struct objc_method_list *mlist;
        !          1239: 
        !          1240:        mlist = (struct objc_method_list *)getObjcData(firstobjcsect, nsects,
        !          1241:                                                mlist_before_reloc);
        !          1242:        method = mlist->method_list;
        !          1243:        for(i = 0; i < mlist->method_count; i++, method++){
        !          1244: 
        !          1245:            method->method_name = (SEL)getObjcData(firstobjcsect, nsects, 
        !          1246:                                                method->method_name);
        !          1247: 
        !          1248:            method->method_types = (char *)getObjcData(firstobjcsect, nsects, 
        !          1249:                                                method->method_types);
        !          1250: 
        !          1251:            method->method_name = 
        !          1252:                (SEL)sel_registerName((STR)method->method_name);
        !          1253: 
        !          1254:        }
        !          1255: }
        !          1256: 
        !          1257: static
        !          1258: void
        !          1259: print_method_list2(struct objc_method_description_list *mlist_before_reloc, 
        !          1260:                  struct section *firstobjcsect, 
        !          1261:                  int nsects)
        !          1262: {
        !          1263:     long i;
        !          1264:     struct objc_method_description *method;
        !          1265:     struct objc_method_description_list *mlist;
        !          1266: 
        !          1267:        mlist = (struct objc_method_description_list *)getObjcData(firstobjcsect, nsects,
        !          1268:                                                mlist_before_reloc);
        !          1269:        method = mlist->list;
        !          1270:        for(i = 0; i < mlist->count; i++, method++){
        !          1271: 
        !          1272:            method->name = (SEL)getObjcData(firstobjcsect, nsects, 
        !          1273:                                                method->name);
        !          1274:            method->name = 
        !          1275:                (SEL)sel_registerName((STR)method->name);
        !          1276: 
        !          1277:        }
        !          1278: }
        !          1279: 
        !          1280: /*
        !          1281:  * Print the current usage message.
        !          1282:  */
        !          1283: static
        !          1284: void
        !          1285: usage()
        !          1286: {
        !          1287:        fprintf(stderr,
        !          1288:                "Usage: %s <shlib file>\n",
        !          1289:                progname);
        !          1290: }

unix.superglobalmegacorp.com

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