xref: /xnu-10002.61.3/libkern/kxld/kxld_versionmin.c (revision 0f4c859e951fba394238ab619495c4e1d54d0f34)
1 /*
2  * Copyright (c) 2011 Apple Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
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. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 #include <string.h>
29 #include <mach-o/loader.h>
30 #include <sys/types.h>
31 
32 #define DEBUG_ASSERT_COMPONENT_NAME_STRING "kxld"
33 #include <AssertMacros.h>
34 
35 #include "kxld_util.h"
36 #include "kxld_versionmin.h"
37 
38 /*******************************************************************************
39 *******************************************************************************/
40 void
kxld_versionmin_init_from_macho(KXLDversionmin * versionmin,struct version_min_command * src)41 kxld_versionmin_init_from_macho(KXLDversionmin *versionmin, struct version_min_command *src)
42 {
43 	check(versionmin);
44 	check(src);
45 	check((src->cmd == LC_VERSION_MIN_MACOSX) || (src->cmd == LC_VERSION_MIN_IPHONEOS) || (src->cmd == LC_VERSION_MIN_TVOS) || (src->cmd == LC_VERSION_MIN_WATCHOS));
46 
47 	switch (src->cmd) {
48 	case LC_VERSION_MIN_MACOSX:
49 		versionmin->platform = kKxldVersionMinMacOSX;
50 		break;
51 	case LC_VERSION_MIN_IPHONEOS:
52 		versionmin->platform = kKxldVersionMiniPhoneOS;
53 		break;
54 	case LC_VERSION_MIN_TVOS:
55 		versionmin->platform = kKxldVersionMinAppleTVOS;
56 		break;
57 	case LC_VERSION_MIN_WATCHOS:
58 		versionmin->platform = kKxldVersionMinWatchOS;
59 		break;
60 	}
61 
62 	versionmin->version = src->version;
63 	versionmin->has_versionmin = TRUE;
64 }
65 
66 void
kxld_versionmin_init_from_build_cmd(KXLDversionmin * versionmin,struct build_version_command * src)67 kxld_versionmin_init_from_build_cmd(KXLDversionmin *versionmin, struct build_version_command *src)
68 {
69 	check(versionmin);
70 	check(src);
71 	switch (src->platform) {
72 	case PLATFORM_MACOS:
73 		versionmin->platform = kKxldVersionMinMacOSX;
74 		break;
75 	case PLATFORM_IOS:
76 		versionmin->platform = kKxldVersionMiniPhoneOS;
77 		break;
78 	case PLATFORM_TVOS:
79 		versionmin->platform = kKxldVersionMinAppleTVOS;
80 		break;
81 	case PLATFORM_WATCHOS:
82 		versionmin->platform = kKxldVersionMinWatchOS;
83 		break;
84 	default:
85 		return;
86 	}
87 	versionmin->version = src->minos;
88 	versionmin->has_versionmin = TRUE;
89 }
90 
91 /*******************************************************************************
92 *******************************************************************************/
93 void
kxld_versionmin_clear(KXLDversionmin * versionmin)94 kxld_versionmin_clear(KXLDversionmin *versionmin)
95 {
96 	bzero(versionmin, sizeof(*versionmin));
97 }
98 
99 /*******************************************************************************
100 *******************************************************************************/
101 u_long
kxld_versionmin_get_macho_header_size(__unused const KXLDversionmin * versionmin)102 kxld_versionmin_get_macho_header_size(__unused const KXLDversionmin *versionmin)
103 {
104 	/* TODO: eventually we can just use struct build_version_command */
105 	return sizeof(struct version_min_command);
106 }
107 
108 /*******************************************************************************
109 *******************************************************************************/
110 kern_return_t
kxld_versionmin_export_macho(const KXLDversionmin * versionmin,u_char * buf,u_long * header_offset,u_long header_size)111 kxld_versionmin_export_macho(const KXLDversionmin *versionmin, u_char *buf,
112     u_long *header_offset, u_long header_size)
113 {
114 	kern_return_t rval = KERN_FAILURE;
115 	struct version_min_command *versionminhdr = NULL;
116 
117 	check(versionmin);
118 	check(buf);
119 	check(header_offset);
120 
121 
122 	require_action(sizeof(*versionminhdr) <= header_size - *header_offset, finish,
123 	    rval = KERN_FAILURE);
124 	versionminhdr = (struct version_min_command *) ((void *) (buf + *header_offset));
125 	bzero(versionminhdr, sizeof(*versionminhdr));
126 	*header_offset += sizeof(*versionminhdr);
127 
128 	switch (versionmin->platform) {
129 	case kKxldVersionMinMacOSX:
130 		versionminhdr->cmd = LC_VERSION_MIN_MACOSX;
131 		break;
132 	case kKxldVersionMiniPhoneOS:
133 		versionminhdr->cmd = LC_VERSION_MIN_IPHONEOS;
134 		break;
135 	case kKxldVersionMinAppleTVOS:
136 		versionminhdr->cmd = LC_VERSION_MIN_TVOS;
137 		break;
138 	case kKxldVersionMinWatchOS:
139 		versionminhdr->cmd = LC_VERSION_MIN_WATCHOS;
140 		break;
141 	default:
142 		goto finish;
143 	}
144 	versionminhdr->cmdsize = (uint32_t) sizeof(*versionminhdr);
145 	versionminhdr->version = versionmin->version;
146 	versionminhdr->sdk = 0;
147 
148 	rval = KERN_SUCCESS;
149 
150 finish:
151 	return rval;
152 }
153