libfaketime 不适用于 golang
libfaketime doesn't work with golang
我希望我的 go 程序在 ubuntu 服务器 (14.04) 上运行,由主管守护,使用假服务器时间。
在我的主管配置中,我使用这个作为执行命令:
"faketime 'last Friday 5 pm' /home/user/main"
程序运行,但显示当前时间。
根据这篇文章:
Changing what time a process thinks it is with libfaketime
libfaketime cannot be used with statically linked or setuid programs, because LD_PRELOAD is not available to such programs.
有没有办法让我编译的go程序使用faketime?
问题是 faketime
使用 LD_PRELOAD
环境变量来指示程序的动态加载程序在启动时加载 libfaketime
。 libfaketime
将执行所谓的 "interpositioning" - 用它自己的例程副本替换普通的动态库例程 - 这样当将来进行动态库调用时,libfaketime
可以影响发生的事情。特别是,libfaketime
插入与时间相关的调用,因此它能够 return 向程序伪造值。
这适用于大多数程序的原因是它们使用 libc
进行系统调用。 libc
提供与系统调用交互的高级函数,使系统编程更容易。在大多数使用 libc
的语言中,二进制文件是动态链接的,这意味着 libc
实际上并未包含在二进制文件中,而是预期 libc
的编译版本(称为"object file") 当二进制文件为运行时,系统中就会存在,此时可以加载动态库。这种动态加载是通过 LD_PRELOAD
指令使 faketime
成为可能的原因,它改变了加载程序的行为。
然而,Go 在两个方面有所不同。首先,它是静态链接的,因此没有加载程序可以关注 LD_PRELOAD
。其次,它不使用 libc
,所以即使它是动态链接的,并且 LD_PRELOAD
技巧起作用了,libc
也永远不会被调用,所以它仍然不会真正完成欺骗程序使用假时间函数的预期目标。
我希望我的 go 程序在 ubuntu 服务器 (14.04) 上运行,由主管守护,使用假服务器时间。
在我的主管配置中,我使用这个作为执行命令:
"faketime 'last Friday 5 pm' /home/user/main"
程序运行,但显示当前时间。
根据这篇文章: Changing what time a process thinks it is with libfaketime
libfaketime cannot be used with statically linked or setuid programs, because LD_PRELOAD is not available to such programs.
有没有办法让我编译的go程序使用faketime?
问题是 faketime
使用 LD_PRELOAD
环境变量来指示程序的动态加载程序在启动时加载 libfaketime
。 libfaketime
将执行所谓的 "interpositioning" - 用它自己的例程副本替换普通的动态库例程 - 这样当将来进行动态库调用时,libfaketime
可以影响发生的事情。特别是,libfaketime
插入与时间相关的调用,因此它能够 return 向程序伪造值。
这适用于大多数程序的原因是它们使用 libc
进行系统调用。 libc
提供与系统调用交互的高级函数,使系统编程更容易。在大多数使用 libc
的语言中,二进制文件是动态链接的,这意味着 libc
实际上并未包含在二进制文件中,而是预期 libc
的编译版本(称为"object file") 当二进制文件为运行时,系统中就会存在,此时可以加载动态库。这种动态加载是通过 LD_PRELOAD
指令使 faketime
成为可能的原因,它改变了加载程序的行为。
然而,Go 在两个方面有所不同。首先,它是静态链接的,因此没有加载程序可以关注 LD_PRELOAD
。其次,它不使用 libc
,所以即使它是动态链接的,并且 LD_PRELOAD
技巧起作用了,libc
也永远不会被调用,所以它仍然不会真正完成欺骗程序使用假时间函数的预期目标。