]>
git.saurik.com Git - apple/xnu.git/blob - SETUP/setsegname/setsegname.c
9afd6bc5de03e9aca4d984b1decd3fa575ffd638
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>
32 #include <IOKit/IOTypes.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
));
108 /*********************************************************************
109 *********************************************************************/
110 int main(int argc
, char * argv
[])
113 const char * output_name
= NULL
;
114 const char * newseg_name
= NULL
;
115 struct mach_header
* hdr
;
116 struct mach_header_64
* hdr64
;
117 struct load_command
* cmds
;
118 boolean_t swap
= false;
119 uint32_t ncmds
, cmdtype
;
122 vm_size_t input_size
;
124 uint32_t * flags
= NULL
;
126 typedef char segname_t
[16];
127 segname_t
* names
= NULL
;
129 if ((argc
!= 5) || strcmp("-o", argv
[3])) {
130 fprintf(stderr
, "Usage: %s NEWSEGNAME input -o output\n", argv
[0]);
134 output_name
= argv
[4];
135 newseg_name
= argv
[1];
137 error
= readFile(argv
[2], &input
, &input_size
);
142 hdr
= (typeof(hdr
)) input
;
143 switch (hdr
->magic
) {
149 cmds
= (typeof(cmds
)) (hdr
+1);
156 hdr64
= (typeof(hdr64
)) hdr
;
157 ncmds
= hdr64
->ncmds
;
158 cmds
= (typeof(cmds
)) (hdr64
+1);
162 fprintf(stderr
, "not macho input file\n");
168 ncmds
= OSSwapInt32(ncmds
);
173 cmdtype
= OSSwapInt32(cmdtype
);
177 if (LC_SEGMENT
== cmdtype
) {
178 struct segment_command
* segcmd
;
179 struct section
* sects
;
181 segcmd
= (typeof(segcmd
)) cmds
;
182 nsects
= segcmd
->nsects
;
183 sects
= (typeof(sects
))(segcmd
+ 1);
184 names
= §s
->segname
;
185 flags
= §s
->flags
;
186 len
= sizeof(*sects
);
187 } else if (LC_SEGMENT_64
== cmdtype
) {
188 struct segment_command_64
* segcmd
;
189 struct section_64
* sects
;
191 segcmd
= (typeof(segcmd
)) cmds
;
192 nsects
= segcmd
->nsects
;
193 sects
= (typeof(sects
))(segcmd
+ 1);
194 names
= §s
->segname
;
195 flags
= §s
->flags
;
196 len
= sizeof(*sects
);
200 nsects
= OSSwapInt32(nsects
);
204 attr
= OSSwapInt32(attr
);
207 if (!(S_ATTR_DEBUG
& attr
)) {
208 strncpy((char *)names
, newseg_name
, sizeof(*names
));
211 names
= (typeof(names
))(((uintptr_t) names
) + len
);
212 flags
= (typeof(flags
))(((uintptr_t) flags
) + len
);
217 len
= OSSwapInt32(len
);
219 cmds
= (typeof(cmds
))(((uintptr_t) cmds
) + len
);
222 int fd
= open(output_name
, O_WRONLY
|O_CREAT
|O_TRUNC
, 0755);
226 error
= writeFile(fd
, (const void *) input
, input_size
);
231 fprintf(stderr
, "couldn't write output: %s\n", strerror(errno
));