6
6
#include <mach-o/dyld.h>
7
7
8
8
#include <sys/types.h>
9
+ #include <sys/sysctl.h>
9
10
10
11
typedef NSObjectFileImageReturnCode (* NSCreateObjectFileImageFromMemory_ptr )(void * address , unsigned long size , NSObjectFileImage * objectFileImage );
11
12
typedef NSModule (* NSLinkModule_ptr )(NSObjectFileImage objectFileImage , const char * moduleName , unsigned long options );
@@ -222,12 +223,12 @@ int string_compare(const char* s1, const char* s2)
222
223
223
224
int detect_sierra ()
224
225
{
225
- uint64_t sc_sysctlbyname = 0x2000112 ;
226
- char * name = "kern.osrelease" ;
226
+ uint64_t sc_sysctl = 0x20000ca ;
227
+ int name [] = { CTL_KERN , KERN_OSRELEASE };
228
+ uint64_t nameptr = (uint64_t )& name ;
229
+ uint64_t namelen = sizeof (name )/sizeof (name [0 ]);
227
230
char osrelease [32 ];
228
231
size_t size = sizeof (osrelease );
229
- uint64_t nameptr = (uint64_t )name ;
230
- uint64_t namelen = (uint64_t )sizeof (name );
231
232
uint64_t valptr = (uint64_t )osrelease ;
232
233
uint64_t valsizeptr = (uint64_t )& size ;
233
234
uint64_t ret = 0 ;
@@ -243,12 +244,15 @@ int detect_sierra()
243
244
"syscall;\n"
244
245
"mov %%rax, %0;\n"
245
246
: "=g" (ret )
246
- : "g" (sc_sysctlbyname ), "g" (nameptr ), "g" (namelen ), "g" (valptr ), "g" (valsizeptr )
247
- : "rax" , "rdi" , "rdx" );
247
+ : "g" (sc_sysctl ), "g" (nameptr ), "g" (namelen ), "g" (valptr ), "g" (valsizeptr )
248
+ : );
248
249
249
250
// osrelease is 16.x.x on Sierra
250
251
if (ret == 0 && size > 2 ) {
251
- if (osrelease [0 ] == '1' && osrelease [1 ] <= '6' ) {
252
+ if (osrelease [0 ] == '1' && osrelease [1 ] < '6' ) {
253
+ return 0 ;
254
+ }
255
+ if (osrelease [0 ] <= '9' && osrelease [1 ] == '.' ) {
252
256
return 0 ;
253
257
}
254
258
}
0 commit comments