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!!
できた。
これを足がかりに色々してみたい。