Что такое точный эквивалент LD_PRELOAD в OSX?

Я использую LD_PRELOAD для подключения библиотечной функции, и в Linux она работает отлично. Но я не могу понять, как сделать эквивалент в OSX.

У меня в Linux установка такая:

Код:

#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

Все вышеперечисленное хорошо работает в Linux, что эквивалентно каждому шагу, чтобы заставить это работать в OSX? Я погуглил это и не смог заставить его работать с предоставленной информацией, поскольку информация для некоторых шагов отсутствует.

Заранее спасибо!


person horseyguy    schedule 15.12.2011    source источник


Ответы (1)


Взгляните на DYLD_INSERT_LIBRARIES. . Это переменная, которую вы ищете.

См. также этот ответ.

person Dan Fego    schedule 15.12.2011
comment
Спасибо, я знал это :) Но это не так просто, как настройка, которую я нашел, мне нужно внести серьезные изменения в мой исходный код, и этап компиляции тоже отличается. Это выполнение этих шагов, я не могу понять, как это сделать :( - person horseyguy; 15.12.2011
comment
Уверены ли вы? Я почти уверен, что использовал это раньше (но не на 100% - я просто знаю, что просмотрел его. :P) Что именно не работает? - person Dan Fego; 15.12.2011
comment
Какую именно строку я должен использовать для сборки библиотеки, та (показанная в вопросе выше) больше не работает. мне нужно каким-либо образом изменить исходный код? Что это, я слышал о необходимости установить еще один макрос FLAT_NAMESPACES, и что-то о DYLD_INTERPOSE я знаю, что это не просто замена DYLD_INSERT_LIBRARIES на LD_PRELOAD. - person horseyguy; 15.12.2011
comment
Хм, я не уверен без Mac передо мной. Вы говорите, что строка для его сборки больше не работает, то есть она не будет строиться, или что символ библиотеки не имеет приоритета при использовании DYLD_INTERPOSE? Возможно, ruby ​​на OSX отличается? Это всего лишь варианты, но я проверю позже. Хотя я уверен, что кто-то еще придет на помощь тем временем. :) - person Dan Fego; 15.12.2011
comment
Привет, я изменил строку gcc при сборке на osx на gcc -Wall -ldl -I/path/to/includes -o lib_overrides.dylib -dynamiclib ./raise_shim.c, и я получаю кучу ошибок поиска символов, есть идеи? - person horseyguy; 16.12.2011