Index: trunk/i386/util/segsize.c =================================================================== --- trunk/i386/util/segsize.c (revision 0) +++ trunk/i386/util/segsize.c (revision 2072) @@ -0,0 +1,128 @@ +/* + * Copyright (c) 1999-2003 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * Portions Copyright (c) 1999-2003 Apple Computer, Inc. All Rights + * Reserved. This file contains Original Code and/or Modifications of + * Original Code as defined in and that are subject to the Apple Public + * Source License Version 2.0 (the "License"). You may not use this file + * except in compliance with the License. Please obtain a copy of the + * License at http://www.apple.com/publicsource and read it before using + * this file. + * + * The Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int infile; + +struct mach_header mh; +void * cmds; + +static bool swap_ends; + +static unsigned long swap( + unsigned long x + ) +{ + if (swap_ends) + return OSSwapInt32(x); + else + return x; +} + +int +main(int argc, char *argv[]) +{ + int nc, ncmds; + char * cp; + + if (argc == 3) { + infile = open(argv[1], O_RDONLY); + if (infile < 0) + goto usage; + } + else { + usage: + fprintf(stderr, "usage: segsize segment\n"); + exit(1); + } + + nc = read(infile, &mh, sizeof (mh)); + if (nc < 0) { + perror("read mach header"); + exit(1); + } + if (nc < (int)sizeof (mh)) { + fprintf(stderr, "read mach header: premature EOF %d\n", nc); + exit(1); + } + if (mh.magic == MH_MAGIC) + swap_ends = false; + else if (mh.magic == MH_CIGAM) + swap_ends = true; + else { + fprintf(stderr, "bad magic number %lx\n", (unsigned long)mh.magic); + exit(1); + } + + cmds = calloc(swap(mh.sizeofcmds), sizeof (char)); + if (cmds == 0) { + fprintf(stderr, "alloc load commands: no memory\n"); + exit(1); + } + nc = read(infile, cmds, swap(mh.sizeofcmds)); + if (nc < 0) { + perror("read load commands"); + exit(1); + } + if (nc < (int)swap(mh.sizeofcmds)) { + fprintf(stderr, "read load commands: premature EOF %d\n", nc); + exit(1); + } + + for ( ncmds = swap(mh.ncmds), cp = cmds; + ncmds > 0; ncmds--) { +// bool isDATA; +// unsigned vmsize; + +#define lcp ((struct load_command *)cp) + switch(swap(lcp->cmd)) { + + case LC_SEGMENT: +#define scp ((struct segment_command *)cp) + if(strcmp(scp->segname, argv[2]) == 0) + { + printf("%ld\n", swap(scp->vmsize)); +#if 0 + if (isDATA) + vmsize = swap(scp->filesize); + else + vmsize = swap(scp->vmsize); +#endif + } + break; + } + + cp += swap(lcp->cmdsize); + } + + exit(0); +} Index: trunk/i386/util/Makefile =================================================================== --- trunk/i386/util/Makefile (revision 2071) +++ trunk/i386/util/Makefile (revision 2072) @@ -16,8 +16,8 @@ DIR = util include ${SRCROOT}/Make.rules -PROGRAMS = machOconv dyldsymboltool -OBJS = dyldsymboltool.o32 dyldsymboltool.o64 machOconv.o32 machOconv.o64 +PROGRAMS = machOconv dyldsymboltool segsize +OBJS = dyldsymboltool.o32 dyldsymboltool.o64 machOconv.o32 machOconv.o64 segsize.o32 segsize.o64 ifeq (${CONFIG_BDMESG}, y)