gpt4 book ai didi

ubuntu - libfaketime 不适用于 golang

转载 作者:IT王子 更新时间:2023-10-29 01:27:05 24 4
gpt4 key购买 nike

我希望我的 go 程序在 ubuntu 服务器 (14.04) 上运行,由主管守护,使用假的服务器时间。

在我的主管配置中,我使用它作为执行命令:

“假时间‘上周五下午 5 点’/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 环境变量来指示程序的动态加载器在启动时加载 libfaketimelibfaketime 将执行所谓的“插入”——用它自己的例程副本替换普通的动态库例程——这样当将来进行动态库调用时,libfaketime 可以影响什么发生。特别是,libfaketime 插入了与时间相关的调用,因此它能够向程序返回假值。

这适用于大多数程序的原因是它们使用 libc 进行系统调用。 libc 提供与系统调用交互的高级函数,使系统编程更容易。在大多数使用 libc 的语言中,二进制文件是动态链接的,这意味着 libc 实际上并不包含在二进制文件中,而是期望 的编译版本>libc(称为“目标文件”)将在二进制文件运行时存在于系统中,此时可以加载动态库。这种动态加载是通过 LD_PRELOAD 指令使 faketime 成为可能的原因,它改变了加载程序的行为。

但是,Go 在两个方面有所不同。首先,它是静态链接的,因此没有加载程序可以关注 LD_PRELOAD。其次,它不使用 libc,所以即使它是动态链接的,并且 LD_PRELOAD 技巧起作用,也永远不会调用 libc , 因此它实际上仍然无法实现欺骗程序使用假时间函数的预期目标。

关于ubuntu - libfaketime 不适用于 golang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36024872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com