我编写了一个小型库,它覆盖系统库函数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
中的额外代码不应该是问题。