]>
git.saurik.com Git - apple/xnu.git/blob - SETUP/setsegname/setsegname.c
2 * Copyright (c) 2007 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
30 #include <mach-o/swap.h>
34 /*********************************************************************
35 *********************************************************************/
37 writeFile(int fd
, const void * data
, size_t length
)
41 if (length
!= (size_t)write(fd
, data
, length
)) {
46 perror("couldn't write output");
52 /*********************************************************************
53 *********************************************************************/
55 readFile(const char *path
, vm_offset_t
* objAddr
, vm_size_t
* objSize
)
65 if ((fd
= open(path
, O_RDONLY
)) == -1) {
69 if (fstat(fd
, &stat_buf
) == -1) {
73 if (0 == (stat_buf
.st_mode
& S_IFREG
)) {
77 if (0 == stat_buf
.st_size
) {
82 *objSize
= stat_buf
.st_size
;
84 *objAddr
= (vm_offset_t
)mmap(NULL
/* address */, *objSize
,
85 PROT_READ
| PROT_WRITE
, MAP_FILE
| MAP_PRIVATE
/* flags */,
88 if ((void *)*objAddr
== MAP_FAILED
) {
101 fprintf(stderr
, "couldn't read %s: %s\n", path
, strerror(errno
));
110 fprintf(stderr
, "Usage: %s [-s OLDSEGNAME] [-i IGNORESEGNAME] -n NEWSEGNAME input -o output\n", getprogname());
114 /*********************************************************************
115 *********************************************************************/
117 main(int argc
, char * argv
[])
120 const char * output_name
= NULL
;
121 const char * input_name
= NULL
;
122 const char * oldseg_name
= NULL
;
123 const char * ignoreseg_name
= NULL
;
124 const char * newseg_name
= NULL
;
125 struct mach_header
* hdr
;
126 struct mach_header_64
* hdr64
;
127 struct load_command
* cmds
;
128 boolean_t swap
= false;
129 uint32_t ncmds
, cmdtype
;
132 vm_size_t input_size
;
134 uint32_t * flags
= NULL
;
136 typedef char segname_t
[16];
137 segname_t
* names
= NULL
;
141 while ((ch
= getopt(argc
, argv
, "s:i:n:o:")) != -1) {
144 oldseg_name
= optarg
;
147 ignoreseg_name
= optarg
;
150 newseg_name
= optarg
;
153 output_name
= optarg
;
164 if ((argc
!= 1) || !newseg_name
|| !output_name
) {
168 input_name
= argv
[0];
170 error
= readFile(input_name
, &input
, &input_size
);
175 hdr
= (typeof(hdr
))input
;
176 switch (hdr
->magic
) {
182 cmds
= (typeof(cmds
))(hdr
+ 1);
189 hdr64
= (typeof(hdr64
))hdr
;
190 ncmds
= hdr64
->ncmds
;
191 cmds
= (typeof(cmds
))(hdr64
+ 1);
195 fprintf(stderr
, "not macho input file\n");
201 ncmds
= OSSwapInt32(ncmds
);
206 cmdtype
= OSSwapInt32(cmdtype
);
210 if (LC_SEGMENT
== cmdtype
) {
211 struct segment_command
* segcmd
;
212 struct section
* sects
;
214 segcmd
= (typeof(segcmd
))cmds
;
215 nsects
= segcmd
->nsects
;
216 sects
= (typeof(sects
))(segcmd
+ 1);
217 names
= §s
->segname
;
218 flags
= §s
->flags
;
219 len
= sizeof(*sects
);
220 } else if (LC_SEGMENT_64
== cmdtype
) {
221 struct segment_command_64
* segcmd
;
222 struct section_64
* sects
;
224 segcmd
= (typeof(segcmd
))cmds
;
225 nsects
= segcmd
->nsects
;
226 sects
= (typeof(sects
))(segcmd
+ 1);
227 names
= §s
->segname
;
228 flags
= §s
->flags
;
229 len
= sizeof(*sects
);
233 nsects
= OSSwapInt32(nsects
);
238 attr
= OSSwapInt32(attr
);
241 if (!(S_ATTR_DEBUG
& attr
) && (!ignoreseg_name
||
242 0 != strncmp(ignoreseg_name
, (char *)names
, sizeof(*names
)))) {
244 0 == strncmp(oldseg_name
, (char *)names
, sizeof(*names
))) {
245 memset(names
, 0x0, sizeof(*names
));
246 strncpy((char *)names
, newseg_name
, sizeof(*names
));
250 names
= (typeof(names
))(((uintptr_t) names
) + len
);
251 flags
= (typeof(flags
))(((uintptr_t) flags
) + len
);
256 len
= OSSwapInt32(len
);
258 cmds
= (typeof(cmds
))(((uintptr_t) cmds
) + len
);
261 int fd
= open(output_name
, O_WRONLY
| O_CREAT
| O_TRUNC
, 0755);
265 error
= writeFile(fd
, (const void *) input
, input_size
);
270 fprintf(stderr
, "couldn't write output: %s\n", strerror(errno
));