+#endif
+
+/*
+ * Returns the sdk version (encode as nibble XXXX.YY.ZZ) the
+ * specified binary was built against.
+ *
+ * First looks for LC_VERSION_MIN_* in binary and if sdk field is
+ * not zero, return that value.
+ * Otherwise, looks for the libSystem.B.dylib the binary linked
+ * against and uses a table to convert that to an sdk version.
+ */
+uint32_t dyld_get_sdk_version(const mach_header* mh)
+{
+ uint32_t loadCommand;
+ uint32_t minOS;
+ uint32_t sdk;
+
+ if ( getVersionLoadCommandInfo(mh, &loadCommand, &minOS, &sdk) ) {
+ switch (loadCommand) {
+#if __WATCH_OS_VERSION_MIN_REQUIRED
+ case LC_VERSION_MIN_WATCHOS:
+ // new binary. sdk version looks like "2.0" but API wants "9.0"
+ return watchVersToIOSVers(sdk);
+ case LC_VERSION_MIN_IPHONEOS:
+ // old binary. sdk matches API semantics so can return directly.
+ return sdk;
+#elif __TV_OS_VERSION_MIN_REQUIRED
+ case LC_VERSION_MIN_TVOS:
+ case LC_VERSION_MIN_IPHONEOS:
+ return sdk;
+#elif __IPHONE_OS_VERSION_MIN_REQUIRED
+ case LC_VERSION_MIN_IPHONEOS:
+ if ( sdk != 0 ) // old binaries might not have SDK set
+ return sdk;
+ break;
+#else
+ case LC_VERSION_MIN_MACOSX:
+ if ( sdk != 0 ) // old binaries might not have SDK set
+ return sdk;
+ break;
+#endif
+ }
+ }
+
+#if __WATCH_OS_VERSION_MIN_REQUIRED ||__TV_OS_VERSION_MIN_REQUIRED
+ // All WatchOS and tv OS binaries should have version load command.
+ return 0;
+#else
+ // MacOSX and iOS have old binaries without version load commmand.
+ return deriveSDKVersFromDylibs(mh);
+#endif
+}