मैं एक .dylib फ़ाइल बनाएं और उसे संकलन:DYLD_LIBRARY_PATH और DYLD_INSERT_LIBRARIES काम नहीं कर रहा
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
static void* (*real_malloc)(size_t);
void *malloc(size_t size)
{
void *p = NULL;
fprintf(stderr, "malloc(%zd) = ", size);
p = real_malloc(size);
fprintf(stderr, "%p\n", p);
return p;
}
void __attribute((constructor))init()
{
real_malloc = (decltype(real_malloc))dlsym(RTLD_NEXT, "malloc");
if (NULL == real_malloc) {
fprintf(stderr, "Error in `dlsym`: %s\n", dlerror());
return;
}
}
तो मैं एक परीक्षण कार्यक्रम है कि malloc
कॉल पैदा करते हैं। मैंने सुनिश्चित किया कि मॉलोक को कॉल अनुकूलित नहीं किया गया है।
DYLD_PRINT_LIBRARIES=1 X=1 DYLD_INSERT_LIBRARIES=./libTestHook.dylib ./malloctest
यह लोड लेकिन यह बिल्कुल समारोह हुक नहीं है .. कोई भी विचार:
अगला मैं निम्नलिखित भाग गया? मैंने एल कैपिटन अपग्रेड से पहले इस कोड को आजमाया और यह काम करता था .. मैंने मॉलोक को यह भी देखने के लिए अपवाद फेंक दिया कि यह कहलाया जा रहा है या नहीं। यह।
मुझे क्या याद आ रही है?
परिणाम थे:
sh-3.2# DYLD_PRINT_LIBRARIES=1 X=1 DYLD_INSERT_LIBRARIES=./libTestHook.dylib ./malloctest clear
dyld: loaded: /Users/Brandon/Desktop/./malloctest
dyld: loaded: ./libTestHook.dylib
dyld: loaded: /usr/lib/libc++.1.dylib
dyld: loaded: /usr/lib/libSystem.B.dylib
dyld: loaded: /usr/lib/libc++abi.dylib
dyld: loaded: /usr/lib/system/libcache.dylib
dyld: loaded: /usr/lib/system/libcommonCrypto.dylib
dyld: loaded: /usr/lib/system/libcompiler_rt.dylib
dyld: loaded: /usr/lib/system/libcopyfile.dylib
dyld: loaded: /usr/lib/system/libcorecrypto.dylib
dyld: loaded: /usr/lib/system/libdispatch.dylib
dyld: loaded: /usr/lib/system/libdyld.dylib
dyld: loaded: /usr/lib/system/libkeymgr.dylib
dyld: loaded: /usr/lib/system/liblaunch.dylib
dyld: loaded: /usr/lib/system/libmacho.dylib
dyld: loaded: /usr/lib/system/libquarantine.dylib
dyld: loaded: /usr/lib/system/libremovefile.dylib
dyld: loaded: /usr/lib/system/libsystem_asl.dylib
dyld: loaded: /usr/lib/system/libsystem_blocks.dylib
dyld: loaded: /usr/lib/system/libsystem_c.dylib
dyld: loaded: /usr/lib/system/libsystem_configuration.dylib
dyld: loaded: /usr/lib/system/libsystem_coreservices.dylib
dyld: loaded: /usr/lib/system/libsystem_coretls.dylib
dyld: loaded: /usr/lib/system/libsystem_dnssd.dylib
dyld: loaded: /usr/lib/system/libsystem_info.dylib
dyld: loaded: /usr/lib/system/libsystem_kernel.dylib
dyld: loaded: /usr/lib/system/libsystem_m.dylib
dyld: loaded: /usr/lib/system/libsystem_malloc.dylib
dyld: loaded: /usr/lib/system/libsystem_network.dylib
dyld: loaded: /usr/lib/system/libsystem_networkextension.dylib
dyld: loaded: /usr/lib/system/libsystem_notify.dylib
dyld: loaded: /usr/lib/system/libsystem_platform.dylib
dyld: loaded: /usr/lib/system/libsystem_pthread.dylib
dyld: loaded: /usr/lib/system/libsystem_sandbox.dylib
dyld: loaded: /usr/lib/system/libsystem_secinit.dylib
dyld: loaded: /usr/lib/system/libsystem_trace.dylib
dyld: loaded: /usr/lib/system/libunc.dylib
dyld: loaded: /usr/lib/system/libunwind.dylib
dyld: loaded: /usr/lib/system/libxpc.dylib
dyld: loaded: /usr/lib/libobjc.A.dylib
dyld: loaded: /usr/lib/libauto.dylib
dyld: loaded: /usr/lib/libDiagnosticMessagesClient.dylib
A
B
C
D
आपके उत्तर के लिए बहुत बहुत धन्यवाद :) –
ऐसा लगता है कि यह उत्तर http://stackoverflow.com/a/20717262/1027966 से आया है। –
बंद करें, लेकिन यह वहां से नहीं आया था। मैं देख रहा था कि "ओएसएक्स पर फ़ंक्शन कैसे करें" और एलडी_PRELOAD और DYLD_INSERT_LIBRARIES में आया और चूंकि न तो काम किया, मैंने देखा कि ओएसएक्स पर 'कोड इंजेक्शन' कैसे करें और 'DYLD_INTERPOSE' के लिए Google फ़ोरम पोस्ट में आया। काफी मजेदार, यह तब तक काम नहीं करता जब तक कि मैं दोनों विचारों को संयुक्त नहीं करता। – Brandon