注入库OS X DYLD_INSERT_LIBRARIES的性能下降

时间:2016-08-24 21:48:30

标签: macos dll shared-libraries code-injection

我编写了一个小型库,它覆盖系统库函数gettimeofday(),稍微不同,它返回时间减去硬编码的偏移量。

我将DYLD_INSERT_LIBRARIES注入到应用程序中(旧的3D工具在日期> 2014年崩溃)。然而,在注入库的情况下,与没有它的情况相比,性能大约是一半。

我对OSX和动态库的工作原理并不是很了解,我在阅读了大量的教程和反复试验之后才开始工作。

我无法相信性能下降是由于只添加了微小的代码更改引起的,但我读到它可能与命名空间展平有关,我不明白。

我能做些什么来摆脱性能开销吗?

#include <sys/time.h>

//compile:
//clang -c interpose.c
//clang -dynamiclib -o interpose.dylib -install_name interpose.dylib interpose.o

#define DYLD_INTERPOSE(_replacment,_replacee) \
  __attribute__((used)) static struct{ const void* replacment; const void* replacee; } _interpose_##_replacee \
  __attribute__ ((section ("__DATA,__interpose"))) = { (const void*)(unsigned long)&_replacment, (const void*)(unsigned long)    &_replacee };

int mygettimeofday(struct timeval *restrict tp, void *restrict tzp);

DYLD_INTERPOSE(mygettimeofday, gettimeofday)

int mygettimeofday(struct timeval *restrict tp, void *restrict tzp)
{
    int ret = gettimeofday(tp, tzp);
    tp->tv_sec -= 123123;
    return ret;
}

编辑:

我还写了一个很小的测试工具,除了调用gettimeofday() 100000000次之外什么都不做,并且在有和没有lib的情况下运行它。没有它一直需要2.9 seconds,注入库需要3.0 seconds,因此mygettimeofday中的额外代码不应该是问题。

0 个答案:

没有答案