From 373c03447df44b5a5508e94fa897369b41b18f48 Mon Sep 17 00:00:00 2001 From: Olivier Chafik Date: Thu, 5 Jan 2017 09:38:37 +0000 Subject: [PATCH] Prefer using LC_SYMTAB over LC_DYLD_INFO / LC_DYLD_INFO_ONLY in macho parser --- src/main/cpp/bridj/dyncall.diff | 113 ++++++++++-------- .../bridj/lib/darwin_universal/libbridj.dylib | Bin 112964 -> 113004 bytes 2 files changed, 65 insertions(+), 48 deletions(-) diff --git a/src/main/cpp/bridj/dyncall.diff b/src/main/cpp/bridj/dyncall.diff index 5f99e208..2edb2178 100644 --- a/src/main/cpp/bridj/dyncall.diff +++ b/src/main/cpp/bridj/dyncall.diff @@ -1,6 +1,6 @@ diff -r bbefb8b8e74c dynload/dynload_syms_mach-o.c --- a/dynload/dynload_syms_mach-o.c Thu Nov 24 23:47:31 2016 +0000 -+++ b/dynload/dynload_syms_mach-o.c Sun Dec 25 20:36:56 2016 +0100 ++++ b/dynload/dynload_syms_mach-o.c Thu Jan 05 09:36:39 2017 +0000 @@ -29,6 +29,7 @@ dynamic symbol resolver for Mach-O @@ -27,7 +27,7 @@ diff -r bbefb8b8e74c dynload/dynload_syms_mach-o.c struct DLLib_ { char* libPath; -@@ -58,11 +60,139 @@ +@@ -58,11 +60,143 @@ struct DLSyms_ { @@ -37,6 +37,10 @@ diff -r bbefb8b8e74c dynload/dynload_syms_mach-o.c uint32_t symbolCount; }; ++const struct load_command* get_next_command(const struct load_command* cmd) { ++ return (const struct load_command*)(((char*)cmd) + cmd->cmdsize); ++} ++ +int isSameMacImageName(const char* libPath, const char* systemLibPath) { + if (!libPath || !systemLibPath) + return 0; @@ -167,7 +171,7 @@ diff -r bbefb8b8e74c dynload/dynload_syms_mach-o.c DLSyms* dlSymsInit(const char* libPath) { -@@ -71,27 +201,61 @@ +@@ -71,37 +205,71 @@ for (iImage = 0, nImages = _dyld_image_count(); iImage < nImages; iImage++) { const char* name = _dyld_get_image_name(iImage); @@ -193,57 +197,70 @@ diff -r bbefb8b8e74c dynload/dynload_syms_mach-o.c uint32_t iCmd, nCmds = pHeader->ncmds; const struct load_command* cmd = (const struct load_command*)(pBase + sizeof(struct MACH_HEADER_TYPE)); ++ // First, try and find a LC_SYMTAB ++ for (iCmd = 0; iCmd < nCmds; iCmd++) ++ { ++ if (cmd->cmd == LC_SYMTAB) ++ { ++ const struct symtab_command* scmd = (const struct symtab_command*)cmd; ++ ++ pSyms = (DLSyms*)( dlAllocMem(sizeof(DLSyms)) ); ++ //memset(pSyms, sizeof(DLSyms), 0); ++ pSyms->decompressedSymbols = NULL; ++ pSyms->symbolCount = scmd->nsyms; ++ pSyms->pStringTable = pBase + scmd->stroff; ++ pSyms->pSymbolTable = (struct NLIST_TYPE*)(pBase + scmd->symoff); ++ ++ return pSyms; ++ } ++ cmd = get_next_command(cmd); ++ } ++ ++ // Then, try and use LC_DYLD_INFO_ONLY or LC_DYLD_INFO and parse their trie. for (iCmd = 0; iCmd < nCmds; iCmd++) { - if (cmd->cmd == LC_SYMTAB) - { -+ if (!cmd) continue; -+ +- const struct symtab_command* scmd = (const struct symtab_command*)cmd; +- +- pSyms = (DLSyms*)( dlAllocMem(sizeof(DLSyms)) ); +- pSyms->symbolCount = scmd->nsyms; +- pSyms->pStringTable = pBase + scmd->stroff; +- pSyms->pSymbolTable = (struct NLIST_TYPE*)(pBase + scmd->symoff); +- +- return pSyms; +- } +- cmd = (const struct load_command*)(((char*)cmd) + cmd->cmdsize); + if (cmd->cmd == LC_DYLD_INFO_ONLY || cmd->cmd == LC_DYLD_INFO) { -+ const struct dyld_info_command* dcmd = (const struct dyld_info_command*)cmd; -+ const unsigned char* trie = (pBase + dcmd->export_off); -+ -+ pSyms = (DLSyms*)( dlAllocMem(sizeof(DLSyms)) ); -+ -+ // First, get the number of symbols -+ pSyms->symbolCount = visitTrie(trie, trie, trie + dcmd->export_size, NULL, NULL, 0, NULL, 0); -+ -+ if (pSyms->symbolCount) { -+ // Now revisit and copy symbols to their destination -+ DCString s; -+ size_t decompSize = pSyms->symbolCount * sizeof(char*) * 2; -+ pSyms->decompressedSymbols = dlAllocMem(decompSize); -+ memset(pSyms->decompressedSymbols, decompSize, 0); -+ initString(&s, 1024); -+ visitTrie(trie, trie, trie + dcmd->export_size, &s, CopyToNthString, 0, pSyms->decompressedSymbols, 0); -+ freeString(&s); -+ } -+ -+ return pSyms; -+ } -+ -+ if (cmd->cmd & LC_REQ_DYLD) { -+ return NULL; // "unknown load command required for execution"; -+ } -+ if (cmd->cmd == LC_SYMTAB) -+ { - const struct symtab_command* scmd = (const struct symtab_command*)cmd; - - pSyms = (DLSyms*)( dlAllocMem(sizeof(DLSyms)) ); -+ //memset(pSyms, sizeof(DLSyms), 0); -+ pSyms->decompressedSymbols = NULL; - pSyms->symbolCount = scmd->nsyms; - pSyms->pStringTable = pBase + scmd->stroff; - pSyms->pSymbolTable = (struct NLIST_TYPE*)(pBase + scmd->symoff); -@@ -101,7 +265,6 @@ - cmd = (const struct load_command*)(((char*)cmd) + cmd->cmdsize); ++ const struct dyld_info_command* dcmd = (const struct dyld_info_command*)cmd; ++ const unsigned char* trie = (pBase + dcmd->export_off); ++ ++ pSyms = (DLSyms*)( dlAllocMem(sizeof(DLSyms)) ); ++ ++ // First, get the number of symbols ++ pSyms->symbolCount = visitTrie(trie, trie, trie + dcmd->export_size, NULL, NULL, 0, NULL, 0); ++ ++ if (pSyms->symbolCount) { ++ // Now revisit and copy symbols to their destination ++ DCString s; ++ size_t decompSize = pSyms->symbolCount * sizeof(char*) * 2; ++ pSyms->decompressedSymbols = dlAllocMem(decompSize); ++ memset(pSyms->decompressedSymbols, decompSize, 0); ++ initString(&s, 1024); ++ visitTrie(trie, trie, trie + dcmd->export_size, &s, CopyToNthString, 0, pSyms->decompressedSymbols, 0); ++ freeString(&s); ++ } ++ ++ return pSyms; ++ } ++ cmd = get_next_command(cmd); } } - break; } } return NULL; -@@ -113,6 +276,18 @@ +@@ -113,6 +281,18 @@ if (!pSyms) return; @@ -262,7 +279,7 @@ diff -r bbefb8b8e74c dynload/dynload_syms_mach-o.c dlFreeMem(pSyms); } -@@ -133,6 +308,11 @@ +@@ -133,6 +313,11 @@ if (nl->n_un.n_strx <= 1) return NULL; // would be empty string anyway @@ -274,7 +291,7 @@ diff -r bbefb8b8e74c dynload/dynload_syms_mach-o.c //TODO skip more symbols based on nl->n_desc and nl->n_type ? return nl; } -@@ -140,6 +320,12 @@ +@@ -140,6 +325,12 @@ const char* dlSymsName(DLSyms* pSyms, int index) { @@ -287,7 +304,7 @@ diff -r bbefb8b8e74c dynload/dynload_syms_mach-o.c const struct NLIST_TYPE* nl = get_nlist(pSyms, index); if (!nl) return NULL; -@@ -150,6 +336,12 @@ +@@ -150,6 +341,12 @@ void* dlSymsValue(DLSyms* pSyms, int index) { @@ -302,7 +319,7 @@ diff -r bbefb8b8e74c dynload/dynload_syms_mach-o.c return NULL; diff -r bbefb8b8e74c dynload/dynload_unix.c --- a/dynload/dynload_unix.c Thu Nov 24 23:47:31 2016 +0000 -+++ b/dynload/dynload_unix.c Sun Dec 25 20:36:56 2016 +0100 ++++ b/dynload/dynload_unix.c Thu Jan 05 09:36:39 2017 +0000 @@ -41,7 +41,7 @@ DLLib* dlLoadLibrary(const char* libPath) @@ -314,7 +331,7 @@ diff -r bbefb8b8e74c dynload/dynload_unix.c diff -r bbefb8b8e74c dynload/dynload_windows.c --- a/dynload/dynload_windows.c Thu Nov 24 23:47:31 2016 +0000 -+++ b/dynload/dynload_windows.c Sun Dec 25 20:36:56 2016 +0100 ++++ b/dynload/dynload_windows.c Thu Jan 05 09:36:39 2017 +0000 @@ -41,7 +41,9 @@ DLLib* dlLoadLibrary(const char* libPath) { diff --git a/src/main/resources/org/bridj/lib/darwin_universal/libbridj.dylib b/src/main/resources/org/bridj/lib/darwin_universal/libbridj.dylib index d065afdc05d76bd96144d4a41d23583fef838651..097739d851c979313e89cc8918a75034b9c26180 100755 GIT binary patch delta 23718 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 delta 23705 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 F{{T8F4Qv1a