2011-12-15 12 views
7

मैं लाइब्रेरी फ़ंक्शन को हुक करने के लिए LD_PRELOAD का उपयोग कर रहा हूं, और लिनक्स में यह पूरी तरह से काम करता है। लेकिन मैं यह नहीं समझ सकता कि ओएसएक्स में समकक्ष कैसे किया जाए।ओएसएक्स पर एलडी_PRELOAD के बराबर सटीक क्या है?

कोड है::

#include <stdio.h> 
#include <dlfcn.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <ruby.h> 

void 
rb_raise(unsigned long exc, const char *fmt, ...) 
{ 
    static void (*libruby_rb_raise) 
    (unsigned long exc, const char *fmt, ...) = NULL; 

    void * handle; 
    char * error; 

    if (!libruby_rb_raise) { 
    handle = dlopen("/path/to/libruby.so", 
        RTLD_LAZY); 
    if (!handle) { 
     fputs(dlerror(), stderr); 
     exit(1); 
    } 
    libruby_rb_raise = dlsym(handle, "rb_raise"); 
    if ((error = dlerror()) != NULL) { 
     fprintf(stderr, "%s\n", error); 
     exit(1); 
    } 
    } 

    // ...code... 

    return Qnil; 
} 

कौन सा मैं तो साथ संकलन:

:

gcc -Wall -O2 -fpic -shared -ldl -g -I/path/to/includes/ -o raise_shim.so raise_shim.c 

मैं तो साथ निष्पादित

सेटअप मैं लिनक्स पर है इस प्रकार है

LD_PRELOAD=./raise_shim.so ruby 

अल लिनक्स पर उपर्युक्त कार्यों में से एल, ओएसएक्स पर काम करने के लिए प्रत्येक चरण के बराबर क्या है? मैंने इसे गुमराह किया है और इसे प्रदान की गई जानकारी के साथ काम करने में सक्षम नहीं हुआ है क्योंकि कुछ चरणों की जानकारी गायब है।

अग्रिम धन्यवाद!

उत्तर

9

DYLD_INSERT_LIBRARIES पर एक नज़र डालें। यही वह चर है जिसे आप ढूंढ रहे हैं।

this answer भी देखें।

+0

धन्यवाद, मुझे यह बहुत कुछ पता था :) लेकिन यह मुझे जितना आसान लगता है उतना आसान नहीं है, मुझे अपने स्रोत में प्रमुख संशोधन करना है, और संकलन चरण भी अलग है। यह इन चरणों का निष्पादन है, मैं यह नहीं समझ सकता कि कैसे करना है :( – horseyguy

+0

क्या आप निश्चित हैं? मुझे पूरा यकीन है कि मैंने पहले इसका उपयोग किया है (लेकिन 100% नहीं - मुझे पता है कि मैंने इसे देखा है।: पी) वास्तव में क्या काम नहीं कर रहा है? –

+1

लाइब्रेरी बनाने के लिए मुझे किस लाइन का उपयोग करना चाहिए, एक (ऊपर दिए गए प्रश्न में दिखाया गया) अब काम नहीं करता है। क्या मुझे अपने स्रोत कोड को किसी भी तरह से संशोधित करना है? यह क्या है एक और 'FLAT_NAMESPACES' मैक्रो सेट करने की आवश्यकता के बारे में सुनें, और' DYLD_INTERPOSE' के बारे में कुछ मुझे पता है कि यह 'LD_PRELOAD' के लिए' DYLD_INSERT_LIBRARIES' को प्रतिस्थापित करने का विषय नहीं है। – horseyguy

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