this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Implement _CFExecutableLinkedOnOrAfter()

+60 -13
+18 -2
src/CFF/CFUtilities.c
··· 33 33 34 34 Boolean _CFExecutableLinkedOnOrAfter(CFSystemVersion version) 35 35 { 36 - // TODO: For now just say yep, we are newer 37 - return true; 36 + // Like original CF, we always use the last version 37 + const uint16_t libSystemVersions[] = { 38 + 50, 39 + 55, 40 + 56, 41 + 67, 42 + 73, 43 + 89, 44 + 125, // 10.6 45 + 159, // 10.7 46 + 169, // 10.8 47 + 1197, // 10.9 48 + 1213, // 10.10 49 + 1226, // 10.11 (up until now) 50 + }; 51 + if (version >= CFSystemVersionMax) 52 + return false; 53 + return (NSVersionOfLinkTimeLibrary("System") >> 16) >= libSystemVersions[version]; 38 54 } 39 55 40 56 static CFDictionaryRef _CFCopyVersionDictionary(CFStringRef path)
+16
src/CFF/CoreFoundation/CFPriv.h
··· 6 6 #include <CoreFoundation/CFBase.h> 7 7 #include <CoreFoundation/CFDictionary.h> 8 8 9 + enum { 10 + CFSystemVersionCheetah = 0, /* 10.0 */ 11 + CFSystemVersionPuma = 1, /* 10.1 */ 12 + CFSystemVersionJaguar = 2, /* 10.2 */ 13 + CFSystemVersionPanther = 3, /* 10.3 */ 14 + CFSystemVersionTiger = 4, /* 10.4 */ 15 + CFSystemVersionLeopard = 5, /* 10.5 */ 16 + CFSystemVersionSnowLeopard = 6, /* 10.6 */ 17 + CFSystemVersionLion = 7, /* 10.7 */ 18 + CFSystemVersionMountainLion = 8, /* 10.8 */ 19 + CFSystemVersionMavericks = 9, /* 10.9 */ 20 + CFSystemVersionYosemite = 10, /* 10.10 */ 21 + CFSystemVersionElCapitan = 11, /* 11.11 */ 22 + CFSystemVersionMax, 23 + 24 + }; 9 25 typedef int CFSystemVersion; 10 26 11 27 extern const CFStringRef _kCFSystemVersionProductNameKey;
+2 -1
src/dyld/dyldd.cpp
··· 81 81 82 82 void resolve(MachOObject* obj, std::set<std::string>& deps) 83 83 { 84 - for (std::string dylib : obj->declaredDependencies()) 84 + for (const MachO::Dylib& d : obj->declaredDependencies()) 85 85 { 86 86 LoadableObject* dep; 87 + std::string dylib = d.name; 87 88 88 89 if (dylib.empty()) 89 90 continue;
+3 -2
src/libdyld/MachOObject.cpp
··· 495 495 496 496 void MachOObject::loadDependencies() 497 497 { 498 - std::vector<const char*> dylibs = m_file->dylibs(); 498 + std::vector<MachO::Dylib> dylibs = m_file->dylibs(); 499 499 std::string path; 500 500 const char* libsystem_dylib = "/usr/lib/libSystem.B.dylib"; 501 501 ··· 507 507 libSystem = LoadableObject::instantiateForPath(path, this); 508 508 libSystem->load(); 509 509 510 - for (std::string dylib : dylibs) 510 + for (const MachO::Dylib& d : dylibs) 511 511 { 512 512 LoadableObject* dep; 513 + std::string dylib = d.name; 513 514 514 515 if (dylib.empty()) 515 516 {
+1 -1
src/libdyld/MachOObject.h
··· 113 113 inline void setNoRecursion(bool noRecursion) { m_noRecursion = noRecursion; } 114 114 inline bool noRecursion() const { return m_noRecursion; } 115 115 116 - std::vector<const char*> declaredDependencies() const { return m_file->dylibs(); } 116 + std::vector<MachO::Dylib> declaredDependencies() const { return m_file->dylibs(); } 117 117 inline MachO* getMachOFile() const { return m_file; } 118 118 119 119 protected:
+8 -1
src/libdyld/dyld_public.cpp
··· 204 204 205 205 int32_t NSVersionOfLinkTimeLibrary(const char* libraryName) 206 206 { 207 - return -1; 207 + std::vector<MachO::Dylib> deps = MachOMgr::instance()->mainModule()->declaredDependencies(); 208 + 209 + for (const MachO::Dylib& d : deps) 210 + { 211 + if (strstr(d.name, libraryName) != NULL) 212 + return d.currentVersion; 213 + } 214 + return 0; 208 215 } 209 216 210 217 int _NSGetExecutablePath(char* buf, unsigned int* size)
+8 -2
src/libmach-o/MachO.h
··· 106 106 uintptr_t firstDescriptor; 107 107 unsigned long count; 108 108 }; 109 + 110 + struct Dylib 111 + { 112 + const char* name; 113 + uint32_t currentVersion, compatibilityVersion; 114 + }; 109 115 110 116 const std::vector<segment_command_64*>& segments64() const { return m_segments64; } 111 117 112 118 const std::vector<segment_command*>& segments() const { return m_segments; } 113 119 114 - const std::vector<const char*>& dylibs() const { return m_dylibs; } 120 + const std::vector<Dylib>& dylibs() const { return m_dylibs; } 115 121 116 122 const std::vector<const char*>& rpaths() const { return m_rpaths; } 117 123 ··· 160 166 std::string m_filename; 161 167 std::vector<segment_command_64*> m_segments64; 162 168 std::vector<segment_command*> m_segments; 163 - std::vector<const char*> m_dylibs; 169 + std::vector<Dylib> m_dylibs; 164 170 std::vector<const char*> m_rpaths; 165 171 std::vector<Rebase*> m_rebases; 166 172 std::vector<Bind*> m_binds;
+2 -2
src/libmach-o/MachOImpl.cpp
··· 631 631 { 632 632 dylib* lib = &reinterpret_cast<dylib_command*>(cmds_ptr)->dylib; 633 633 const char* name = (char*)cmds_ptr + lib->name.offset; 634 - LOG << "dylib: '" << name << "'\n"; 635 - m_dylibs.push_back(name); 634 + LOG << "dylib: '" << name << "', link ver " << lib->current_version << "\n"; 635 + m_dylibs.push_back(Dylib { name, lib->current_version, lib->compatibility_version }); 636 636 break; 637 637 } 638 638
+2 -2
src/motool/motool.cpp
··· 157 157 case ModeDylibs: 158 158 { 159 159 std::cout << "Dylibs:\n"; 160 - for (const char* name : macho->dylibs()) 160 + for (const MachO::Dylib& dylib : macho->dylibs()) 161 161 { 162 - std::cout << "\t" << name << std::endl; 162 + std::cout << "\t" << dylib.name << std::endl; 163 163 } 164 164 break; 165 165 }