【问题标题】:What is the exact equivalent to LD_PRELOAD on OSX?OSX 上 LD_PRELOAD 的确切等价物是什么?
【发布时间】:2012-01-20 20:03:21
【问题描述】:

我正在使用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 上运行的每个步骤相当于什么?我已经用谷歌搜索了这个,但由于缺少某些步骤的信息,因此无法让它与提供的信息一起使用。

提前致谢!

【问题讨论】:

    标签: macos gcc linker ld-preload


    【解决方案1】:

    看看DYLD_INSERT_LIBRARIES。这就是您要查找的变量。

    另见this answer

    【讨论】:

    • 谢谢,我知道这么多:) 但它不仅仅是我发现的设置那么简单,我必须对我的源代码进行重大修改,编译步骤也不同。正是这些步骤的执行我不知道该怎么做:(
    • 你确定吗?我很确定我以前用过这个(但不是 100%——我只知道我看过它。:P)到底是什么不起作用?
    • 我应该使用哪一行来构建库,那一行(如上面的问题所示)不再起作用。我必须以任何方式修改我的源代码吗?我听说需要设置另一个FLAT_NAMESPACES 宏是什么意思,而DYLD_INTERPOSE 我知道这不仅仅是用DYLD_INSERT_LIBRARIES 代替LD_PRELOAD 的问题。
    • 嗯,如果我面前没有 Mac,我不确定。您是说构建它的行不再有效,即它不会构建,或者在使用 DYLD_INTERPOSE 时库的符号不优先?也许 OSX 上的 ruby​​ 是不同的?这些只是可能性,但我必须稍后再检查。虽然我确信在此期间会有其他人来救援。 :)
    • 嗨,我在 osx 上构建时将gcc 行更改为gcc -Wall -ldl -I/path/to/includes -o lib_overrides.dylib -dynamiclib ./raise_shim.c,我得到一堆符号查找错误,你知道吗?
    猜你喜欢
    • 1970-01-01
    • 2014-10-09
    • 2011-04-03
    • 2012-08-23
    • 2021-08-06
    • 2023-03-22
    • 2021-01-31
    • 2010-12-28
    • 1970-01-01
    相关资源
    最近更新 更多