]>
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
) {
102 fprintf(stderr
, "couldn't read %s: %s\n", path
, strerror(errno
));
111 fprintf(stderr
, "Usage: %s [-s OLDSEGNAME] -n NEWSEGNAME input -o output\n", getprogname());
115 /*********************************************************************
116 *********************************************************************/
117 int 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 * newseg_name
= NULL
;
124 struct mach_header
* hdr
;
125 struct mach_header_64
* hdr64
;
126 struct load_command
* cmds
;
127 boolean_t swap
= false;
128 uint32_t ncmds
, cmdtype
;
131 vm_size_t input_size
;
133 uint32_t * flags
= NULL
;
135 typedef char segname_t
[16];
136 segname_t
* names
= NULL
;
140 while ((ch
= getopt(argc
, argv
, "s:n:o:")) != -1) {
143 oldseg_name
= optarg
;
146 newseg_name
= optarg
;
149 output_name
= optarg
;
160 if ((argc
!= 1) || !newseg_name
|| !output_name
) {
164 input_name
= argv
[0];
166 error
= readFile(input_name
, &input
, &input_size
);
171 hdr
= (typeof(hdr
)) input
;
172 switch (hdr
->magic
) {
178 cmds
= (typeof(cmds
)) (hdr
+1);
185 hdr64
= (typeof(hdr64
)) hdr
;
186 ncmds
= hdr64
->ncmds
;
187 cmds
= (typeof(cmds
)) (hdr64
+1);
191 fprintf(stderr
, "not macho input file\n");
197 ncmds
= OSSwapInt32(ncmds
);
202 cmdtype
= OSSwapInt32(cmdtype
);
206 if (LC_SEGMENT
== cmdtype
) {
207 struct segment_command
* segcmd
;
208 struct section
* sects
;
210 segcmd
= (typeof(segcmd
)) cmds
;
211 nsects
= segcmd
->nsects
;
212 sects
= (typeof(sects
))(segcmd
+ 1);
213 names
= §s
->segname
;
214 flags
= §s
->flags
;
215 len
= sizeof(*sects
);
216 } else if (LC_SEGMENT_64
== cmdtype
) {
217 struct segment_command_64
* segcmd
;
218 struct section_64
* sects
;
220 segcmd
= (typeof(segcmd
)) cmds
;
221 nsects
= segcmd
->nsects
;
222 sects
= (typeof(sects
))(segcmd
+ 1);
223 names
= §s
->segname
;
224 flags
= §s
->flags
;
225 len
= sizeof(*sects
);
229 nsects
= OSSwapInt32(nsects
);
233 attr
= OSSwapInt32(attr
);
236 if (!(S_ATTR_DEBUG
& attr
)) {
238 0 == strncmp(oldseg_name
, (char *)names
, sizeof(*names
))) {
239 memset(names
, 0x0, sizeof(*names
));
240 strncpy((char *)names
, newseg_name
, sizeof(*names
));
244 names
= (typeof(names
))(((uintptr_t) names
) + len
);
245 flags
= (typeof(flags
))(((uintptr_t) flags
) + len
);
250 len
= OSSwapInt32(len
);
252 cmds
= (typeof(cmds
))(((uintptr_t) cmds
) + len
);
255 int fd
= open(output_name
, O_WRONLY
|O_CREAT
|O_TRUNC
, 0755);
259 error
= writeFile(fd
, (const void *) input
, input_size
);
264 fprintf(stderr
, "couldn't write output: %s\n", strerror(errno
));