aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-05-31 16:10:10 +0200
committerEelco Dolstra <edolstra@gmail.com>2017-05-31 16:10:10 +0200
commit5ea8161b552ad79b7caf9b68b3c7d6daab203266 (patch)
tree43063cc0e3a7cbe8d3940656cfb0c6581ddacb82
parentc368e079ca27195aa7dbed1e834479ab17ccae73 (diff)
resolve-system-dependencies: Misc fixes
This fixes Could not find any mach64 blobs in file ‘/usr/lib/libSystem.B.dylib’, continuing...
-rw-r--r--src/resolve-system-dependencies/resolve-system-dependencies.cc42
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 aadfdc947..63e557ec5 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;