2015-12-06 8 views
5

मैं एक .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 

उत्तर

11

Yosemite पर काम करता था मेरी मूल पोस्ट में कोड। एल कैपिटन पर, यह काम नहीं करता है। dyld डॉक्स से

#define _GNU_SOURCE 
#include <dlfcn.h> 
#include <stdio.h> 
#include <stdlib.h> 


#define DYLD_INTERPOSE(_replacment,_replacee) \ 
__attribute__((used)) static struct{ const void* replacment; const void* replacee; } _interpose_##_replacee \ 
__attribute__ ((section ("__DATA,__interpose"))) = { (const void*)(unsigned long)&_replacment, (const void*)(unsigned long)&_replacee }; 


void* pMalloc(size_t size) //would be nice if I didn't have to rename my function.. 
{ 
    printf("Allocated: %zu\n", size); 
    return malloc(size); 
} 

DYLD_INTERPOSE(pMalloc, malloc); 
+2

आपके उत्तर के लिए बहुत बहुत धन्यवाद :) –

+1

ऐसा लगता है कि यह उत्तर http://stackoverflow.com/a/20717262/1027966 से आया है। –

+3

बंद करें, लेकिन यह वहां से नहीं आया था। मैं देख रहा था कि "ओएसएक्स पर फ़ंक्शन कैसे करें" और एलडी_PRELOAD और DYLD_INSERT_LIBRARIES में आया और चूंकि न तो काम किया, मैंने देखा कि ओएसएक्स पर 'कोड इंजेक्शन' कैसे करें और 'DYLD_INTERPOSE' के लिए Google फ़ोरम पोस्ट में आया। काफी मजेदार, यह तब तक काम नहीं करता जब तक कि मैं दोनों विचारों को संयुक्त नहीं करता। – Brandon

1

:

DYLD_INSERT_LIBRARIES यह लोड करने के लिए गतिशील पुस्तकालयों का एक बृहदान्त्र अलग की गई सूची वाले कार्यक्रम में विनिर्दिष्ट से पहले है मैं निम्नलिखित दृष्टिकोण (DYLD_INTERPOSE + DYLD_INSERT_LIBRARIES) कर समाप्त हो गया । यह आपको मौजूदा गतिशील साझा पुस्तकालयों के नए मॉड्यूल का परीक्षण करने देता है जो कि केवल नए मॉड्यूल के साथ अस्थायी गतिशील साझा लाइब्रेरी लोड करके फ्लैट-नेमस्पेस छवियों में उपयोग किए जाते हैं। ध्यान दें कि इसका कोई प्रभाव नहीं है, जब तक कि DYLD_FORCE_FLAT_NAMESPACE का उपयोग नहीं किया जाता है, तब तक गतिशील साझा लाइब्रेरी का उपयोग करके दो-स्तर वाली नामस्थान छवियों का निर्माण किया जाता है।

DYLD_FORCE_FLAT_NAMESPACE प्रोग्राम में सभी छवियों को फ्लैट-नेमस्पेस छवियों के रूप में जोड़ने के लिए मजबूर करें और किसी भी दो-स्तर के नामस्थान बाइंडिंग को अनदेखा करें। यह प्रोग्रामों को को एक बहुगुणित परिभाषित प्रतीक त्रुटि के साथ निष्पादित करने का कारण बन सकता है यदि छवियों को गुणा परिभाषित प्रतीकों को गुणा करने के लिए दो-स्तरीय नामस्थान छवियों का उपयोग किया जाता है।

तो आपके कोड को DYLD_FORCE_FLAT_NAMESPACE = 1 की आवश्यकता है। वैसे भी, my implementation केवल इस विकल्प के साथ /usr/local/bin/git के लिए काम करता है।

+0

सिवाय इसके कि आप अपने कार्यक्रम पर परीक्षण कर रहे हैं।इसे सफारी या किसी भी प्रोग्राम पर प्रयोग करें जो/सिस्टम/लाइब्रेरी से फ़ंक्शंस का उपयोग करता है और किसी भी फ़ंक्शन को प्रतिस्थापित करता है। गारंटी है कि यह काम नहीं करेगा। http://apple.stackexchange.com/questions/193368/what-is-the-rootless-feature-in-el-capitan-really – Brandon

+0

यह कोशिश करते समय, मुझे बल्ले से एक सीगफॉल्ट मिलता है। –

1

आप पुन: संयोजित कर सकते हैं निष्पादन झुका जा रहा है, तो मुझे लगता है कि एक सरल समाधान -force_flat_namespace के साथ निष्पादन योग्य पुन: संयोजित करने के लिए है:

➜ clang slow_leak.c -force_flat_namespace -o slow_leak 
➜ DYLD_INSERT_LIBRARIES=malloc_hook.dylib ./slow_leak 
leaking 
in hooked malloc 

More info। यह ओएसएक्स 10.12.2 मैकोज सिएरा पर है।

संबंधित मुद्दे