2011-12-15 40 views
7

Tôi đang sử dụng LD_PRELOAD để móc chức năng thư viện và trong Linux nó hoạt động hoàn hảo. Nhưng tôi không thể tìm ra cách làm tương đương trong OSX.Tương đương chính xác với LD_PRELOAD trên OSX là gì?

Các thiết lập tôi có trên Linux như sau:

Mã này là:

#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; 
} 

Mà tôi sau đó biên dịch với:

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

sau đó tôi thực hiện với:

LD_PRELOAD=./raise_shim.so ruby 

Al l của các công trình trên cũng tốt trên Linux, tương đương với mỗi bước để có được điều này làm việc trên OSX là gì? Tôi đã googled này và đã không thể làm cho nó làm việc với các thông tin được cung cấp như là thông tin cho một số các bước là mất tích.

Cảm ơn trước!

Trả lời

9

Hãy xem DYLD_INSERT_LIBRARIES. Đó là biến bạn đang tìm kiếm.

Xem thêm this answer.

+0

Cảm ơn, tôi biết điều này nhiều :) Nhưng nó không đơn giản như thiết lập mà tôi tìm thấy, tôi phải sửa đổi lớn nguồn của mình, và bước biên dịch cũng khác nhau. Nó là việc thực hiện các bước này tôi không thể tìm ra cách để làm: ( – horseyguy

+0

Bạn có chắc chắn? Tôi khá chắc chắn tôi đã sử dụng này trước (nhưng không phải 100% - Tôi chỉ biết tôi đã nhìn vào nó.: P) Chính xác những gì không hoạt động? –

+1

Dòng chính xác nào tôi nên sử dụng để xây dựng thư viện, một dòng (được hiển thị trong câu hỏi trên) không còn hoạt động nữa, tôi có phải sửa đổi mã nguồn của mình theo bất kỳ cách nào không? nghe về việc cần thiết lập một macro 'FLAT_NAMESPACES' khác, và một cái gì đó về' DYLD_INTERPOSE'I biết nó không chỉ đơn giản là thay thế 'DYLD_INSERT_LIBRARIES' cho' LD_PRELOAD'. – horseyguy

Các vấn đề liên quan