diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2017-05-31T14·10+0200 |
---|---|---|
committer | Eelco Dolstra <edolstra@gmail.com> | 2017-05-31T14·10+0200 |
commit | 5ea8161b552ad79b7caf9b68b3c7d6daab203266 (patch) | |
tree | 43063cc0e3a7cbe8d3940656cfb0c6581ddacb82 /src/resolve-system-dependencies | |
parent | c368e079ca27195aa7dbed1e834479ab17ccae73 (diff) |
resolve-system-dependencies: Misc fixes
This fixes Could not find any mach64 blobs in file ‘/usr/lib/libSystem.B.dylib’, continuing...
Diffstat (limited to 'src/resolve-system-dependencies')
-rw-r--r-- | src/resolve-system-dependencies/resolve-system-dependencies.cc | 42 |
1 files changed, 20 insertions, 22 deletions
diff --git a/src/resolve-system-dependencies/resolve-system-dependencies.cc b/src/resolve-system-dependencies/resolve-system-dependencies.cc index aadfdc9476b9..63e557ec5f1c 100644 --- a/src/resolve-system-dependencies/resolve-system-dependencies.cc +++ b/src/resolve-system-dependencies/resolve-system-dependencies.cc @@ -28,12 +28,6 @@ std::set<string> readCacheFile(const Path & file) return tokenizeString<set<string>>(readFile(file), "\n"); } -std::string findDylibName(bool should_swap, ptrdiff_t dylib_command_start) -{ - struct dylib_command *dylc = (struct dylib_command*)dylib_command_start; - return std::string((char*)(dylib_command_start + DO_SWAP(should_swap, dylc->dylib.name.offset))); -} - std::set<std::string> runResolver(const Path & filename) { AutoCloseFD fd = open(filename.c_str(), O_RDONLY); @@ -54,22 +48,20 @@ std::set<std::string> runResolver(const Path & filename) return {}; } - void *obj = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd.get(), 0); + char* obj = (char*) mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd.get(), 0); if (!obj) throw SysError("mmapping ‘%s’", filename); ptrdiff_t mach64_offset = 0; - uint32_t magic = ((struct mach_header_64*) obj)->magic; + uint32_t magic = ((mach_header_64*) obj)->magic; if (magic == FAT_CIGAM || magic == FAT_MAGIC) { bool should_swap = magic == FAT_CIGAM; - uint32_t narches = DO_SWAP(should_swap, ((struct fat_header*)obj)->nfat_arch); - - for (uint32_t iter = 0; iter < narches; iter++) { - ptrdiff_t header_offset = (ptrdiff_t)obj + sizeof(struct fat_header) * (iter + 1); - struct fat_arch* arch = (struct fat_arch*)header_offset; + uint32_t narches = DO_SWAP(should_swap, ((fat_header *) obj)->nfat_arch); + for (uint32_t i = 0; i < narches; i++) { + fat_arch* arch = (fat_arch*) (obj + sizeof(fat_header) + sizeof(fat_arch) * i); if (DO_SWAP(should_swap, arch->cputype) == CPU_TYPE_X86_64) { - mach64_offset = (ptrdiff_t)DO_SWAP(should_swap, arch->offset); + mach64_offset = (ptrdiff_t) DO_SWAP(should_swap, arch->offset); break; } } @@ -84,20 +76,19 @@ std::set<std::string> runResolver(const Path & filename) return {}; } - ptrdiff_t mach_header_offset = (ptrdiff_t)obj + mach64_offset; - struct mach_header_64 *m_header = (struct mach_header_64 *)mach_header_offset; + mach_header_64 * m_header = (mach_header_64 *) (obj + mach64_offset); bool should_swap = magic == MH_CIGAM_64; - ptrdiff_t cmd_offset = mach_header_offset + sizeof(struct mach_header_64); + ptrdiff_t cmd_offset = mach64_offset + sizeof(mach_header_64); std::set<string> libs; - for(uint32_t i = 0; i < DO_SWAP(should_swap, m_header->ncmds); i++) { - struct load_command *cmd = (struct load_command*)cmd_offset; + for (uint32_t i = 0; i < DO_SWAP(should_swap, m_header->ncmds); i++) { + load_command * cmd = (load_command *) (obj + cmd_offset); switch(DO_SWAP(should_swap, cmd->cmd)) { case LC_LOAD_UPWARD_DYLIB: case LC_LOAD_DYLIB: case LC_REEXPORT_DYLIB: - libs.insert(findDylibName(should_swap, cmd_offset)); + libs.insert(std::string((char *) cmd + ((dylib_command*) cmd)->dylib.name.offset)); break; } cmd_offset += DO_SWAP(should_swap, cmd->cmdsize); @@ -185,8 +176,15 @@ int main(int argc, char ** argv) auto store = openStore(); - auto drv = store->derivationFromPath(Path(argv[1])); - Strings impurePaths = tokenizeString<Strings>(get(drv.env, "__impureHostDeps")); + StringSet impurePaths; + + if (std::string(argv[1]) == "--test") + impurePaths.insert(argv[2]); + else { + auto drv = store->derivationFromPath(Path(argv[1])); + impurePaths = tokenizeString<StringSet>(get(drv.env, "__impureHostDeps")); + impurePaths.insert("/usr/lib/libSystem.dylib"); + } std::set<string> allPaths; |