Annotation of objc/getsecbyname.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 <mach-o/ldsyms.h>
        !            25: #include <string.h>
        !            26: 
        !            27: /*
        !            28:  * This routine returns the section structure for the named section in the
        !            29:  * named segment for the mach_header pointer passed to it if it exist.
        !            30:  * Otherwise it returns zero.
        !            31:  */
        !            32: const struct section *
        !            33: getsectbynamefromheader(
        !            34:     struct mach_header *mhp,
        !            35:     char *segname,
        !            36:     char *sectname)
        !            37: {
        !            38:        struct segment_command *sgp;
        !            39:        struct section *sp;
        !            40:        long i, j;
        !            41: 
        !            42:        sgp = (struct segment_command *)
        !            43:              ((char *)mhp + sizeof(struct mach_header));
        !            44:        for(i = 0; i < mhp->ncmds; i++){
        !            45:            if(sgp->cmd == LC_SEGMENT)
        !            46:                if(strncmp(sgp->segname, segname, sizeof(sgp->segname)) == 0 ||
        !            47:                   mhp->filetype == MH_OBJECT){
        !            48:                    sp = (struct section *)((char *)sgp +
        !            49:                         sizeof(struct segment_command));
        !            50:                    for(j = 0; j < sgp->nsects; j++){
        !            51:                        if(strncmp(sp->sectname, sectname,
        !            52:                           sizeof(sp->sectname)) == 0 &&
        !            53:                           strncmp(sp->segname, segname,
        !            54:                           sizeof(sp->segname)) == 0)
        !            55:                            return(sp);
        !            56:                        sp = (struct section *)((char *)sp +
        !            57:                             sizeof(struct section));
        !            58:                    }
        !            59:                }
        !            60:            sgp = (struct segment_command *)((char *)sgp + sgp->cmdsize);
        !            61:        }
        !            62:        return((struct section *)0);
        !            63: }
        !            64: 
        !            65: 
        !            66: /*
        !            67:  * This routine returns the section structure for the named section in the
        !            68:  * named segment for the mach_header pointer passed to it if it exist.
        !            69:  * Otherwise it returns zero.  If fSwap == YES (the mach header has been
        !            70:  * swapped to the endiannes of the current machine, but the segments and
        !            71:  * sections are different) then the segment and sections are swapped.
        !            72:  */
        !            73: const struct section *
        !            74: getsectbynamefromheaderwithswap(
        !            75:     struct mach_header *mhp,
        !            76:     const char *segname,
        !            77:     const char *sectname, 
        !            78:     int fSwap)
        !            79: {
        !            80:        struct segment_command *sgp;
        !            81:        struct section *sp;
        !            82:        long i, j;
        !            83: 
        !            84:        sgp = (struct segment_command *)
        !            85:              ((char *)mhp + sizeof(struct mach_header));
        !            86:        for(i = 0; i < mhp->ncmds; i++){
        !            87:            if(sgp->cmd == (fSwap ? NXSwapLong(LC_SEGMENT) : LC_SEGMENT)) {
        !            88:            
        !            89:                if (fSwap) {
        !            90: #ifdef __LITTLE_ENDIAN__
        !            91:                    swap_segment_command(sgp, NX_BigEndian);
        !            92: #else
        !            93:                    swap_segment_command(sgp, NX_LittleEndian);
        !            94: #endif __LITTLE_ENDIAN__
        !            95:                }
        !            96:            
        !            97:                if(strncmp(sgp->segname, segname, sizeof(sgp->segname)) == 0 ||
        !            98:                   mhp->filetype == MH_OBJECT){
        !            99:                    sp = (struct section *)((char *)sgp +
        !           100:                         sizeof(struct segment_command));
        !           101:                
        !           102:                    if (fSwap) {
        !           103: #ifdef __LITTLE_ENDIAN__
        !           104:                        swap_section(sp, sgp->nsects, NX_BigEndian);
        !           105: #else
        !           106:                        swap_section(sp, sgp->nsects, NX_LittleEndian);
        !           107: #endif __LITTLE_ENDIAN__
        !           108:                    }
        !           109:                
        !           110:                    for(j = 0; j < sgp->nsects; j++){
        !           111:                        if(strncmp(sp->sectname, sectname,
        !           112:                           sizeof(sp->sectname)) == 0 &&
        !           113:                           strncmp(sp->segname, segname,
        !           114:                           sizeof(sp->segname)) == 0)
        !           115:                            return(sp);
        !           116:                        sp = (struct section *)((char *)sp +
        !           117:                             sizeof(struct section));
        !           118:                    }
        !           119:                }
        !           120:                sgp = (struct segment_command *)((char *)sgp + sgp->cmdsize);
        !           121:            } else {
        !           122:                sgp = (struct segment_command *)((char *)sgp +
        !           123:                    (fSwap ? NXSwapLong(sgp->cmdsize) : sgp->cmdsize));
        !           124:            }
        !           125:        }
        !           126:        return((struct section *)0);
        !           127: }
        !           128: 
        !           129: 
        !           130: /*
        !           131:  * This routine returns the a pointer the section structure of the named
        !           132:  * section in the named segment if it exist in the mach executable it is
        !           133:  * linked into.  Otherwise it returns zero.
        !           134:  */
        !           135: const struct section *
        !           136: getsectbyname(
        !           137:     char *segname,
        !           138:     char *sectname)
        !           139: {
        !           140:        return(getsectbynamefromheader(
        !           141:                (struct mach_header *)&_mh_execute_header, segname, sectname));
        !           142: }
        !           143: 
        !           144: /*
        !           145:  * This routine returns the a pointer to the data for the named section in the
        !           146:  * named segment if it exist in the mach executable it is linked into.  Also
        !           147:  * it returns the size of the section data indirectly through the pointer size.
        !           148:  * Otherwise it returns zero for the pointer and the size.
        !           149:  */
        !           150: char *
        !           151: getsectdata(
        !           152:     char *segname,
        !           153:     char *sectname,
        !           154:     int *size)
        !           155: {
        !           156:        const struct section *sp;
        !           157: 
        !           158:        sp = getsectbyname(segname, sectname);
        !           159:        if(sp == (struct section *)0){
        !           160:            *size = 0;
        !           161:            return((char *)0);
        !           162:        }
        !           163:        *size = sp->size;
        !           164:        return((char *)(sp->addr));
        !           165: }
        !           166: 
        !           167: /*
        !           168:  * This routine returns the a pointer to the data for the named section in the
        !           169:  * named segment if it exist in the mach header passed to it.  Also it returns
        !           170:  * the size of the section data indirectly through the pointer size.  Otherwise
        !           171:  *  it returns zero for the pointer and the size.
        !           172:  */
        !           173: char *
        !           174: getsectdatafromheader(
        !           175:     struct mach_header *mhp,
        !           176:     char *segname,
        !           177:     char *sectname,
        !           178:     int *size)
        !           179: {
        !           180:        const struct section *sp;
        !           181: 
        !           182:        sp = getsectbynamefromheader(mhp, segname, sectname);
        !           183:        if(sp == (struct section *)0){
        !           184:            *size = 0;
        !           185:            return((char *)0);
        !           186:        }
        !           187:        *size = sp->size;
        !           188:        return((char *)(sp->addr));
        !           189: }
        !           190: 
        !           191: /*
        !           192:  * This routine returns the a pointer to the data for the named section in the
        !           193:  * named segment if it exist in the named shared library the executable it is
        !           194:  * linked into.  Also it returns the size of the section data indirectly
        !           195:  * through the pointer size.  Otherwise it returns zero for the pointer and
        !           196:  * the size.  The last component of the shared libraries name must be of the
        !           197:  * form libx.X.shlib.  Where the library name passed to this routine would
        !           198:  * be libx and x is any string.  In libx.X.shlib, X is any single character.
        !           199:  */
        !           200: char *
        !           201: getsectdatafromlib(
        !           202:     char *libname,
        !           203:     char *segname,
        !           204:     char *sectname,
        !           205:     int *size)
        !           206: {
        !           207:        struct mach_header *mhp;
        !           208:        struct fvmlib_command *flp;
        !           209:        const struct section *sp;
        !           210:        long i, libnamelen, namelen;
        !           211:        char *name, *p;
        !           212: 
        !           213:        libnamelen = strlen(libname);
        !           214:        mhp = (struct mach_header *)(&_mh_execute_header);
        !           215:        flp = (struct fvmlib_command *)
        !           216:              ((char *)mhp + sizeof(struct mach_header));
        !           217:        for(i = 0; i < mhp->ncmds; i++){
        !           218:            if(flp->cmd == LC_LOADFVMLIB){
        !           219:                name = (char *)flp + flp->fvmlib.name.offset;
        !           220:                p = strrchr(name, '/');
        !           221:                if(p == NULL)
        !           222:                    p = name;
        !           223:                else
        !           224:                    p++;
        !           225:                namelen = strlen(p);
        !           226:                if(namelen >= libnamelen + sizeof(".X.shlib") - 1 &&
        !           227:                   strncmp(p, libname, libnamelen) == 0 &&
        !           228:                   *(p + libnamelen) == '.' &&
        !           229:                   strcmp(p + libnamelen + 2, ".shlib") == 0){
        !           230:                    sp = getsectbynamefromheader(
        !           231:                                (struct mach_header *)flp->fvmlib.header_addr,
        !           232:                                segname, sectname);
        !           233:                    if(sp == (struct section *)0){
        !           234:                        *size = 0;
        !           235:                        return((char *)0);
        !           236:                    }
        !           237:                    *size = sp->size;
        !           238:                    return((char *)(sp->addr));
        !           239:                }
        !           240:            }
        !           241:            flp = (struct fvmlib_command *)((char *)flp + flp->cmdsize);
        !           242:        }
        !           243: 
        !           244:        *size = 0;
        !           245:        return((char *)0);
        !           246: }

unix.superglobalmegacorp.com

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