CubicLouve

Spring_MTの技術ブログ

MacOSでLD_PRELOADを実現するには

LD_PRELOAD試そうとおもったらMacでうまくいかず。。。

MacにはLD_PRELOAD自体はなく、LD_PRELOAD相当のDYLD_INSERT_LIBRARIESがあるそうなのでそれを試してみる。

元の実行ファイル(hello.c)

#include <stdio.h>
int main() {                                                                                                                                      
  puts("hello world!!");
  return 0;
}

これをコンパイルしておく。

% clang -Wall -o hello hello.c
% ./hello
hello world!!

今度は上書きするためのファイル(preload_test.c)

#include <stdio.h>
int puts(const char *str) {
  printf("preloaded\n");
  printf(str);
  putchar('\n');
}

これをコンパイルする(dynamiclibオプションつける)

% clang -Wall -o preload_test.dylib -dynamiclib preload_test.c
preload_test.c:6:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
1 warning generated.

実行してみる。

% DYLD_FORCE_FLAT_NAMESPACE=1 DYLD_INSERT_LIBRARIES=./preload_test.dylib ./hello
preloaded
hello world!!

できた。

これを足がかりに色々してみたい。