【问题标题】:libfaketime doesn't work with golanglibfaketime 不适用于 golang
【发布时间】:2016-03-16 00:41:19
【问题描述】:

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

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

"faketime 'last Friday 5 pm' /home/user/main"

程序运行,但显示当前时间。

根据这篇文章: Changing what time a process thinks it is with libfaketime

libfaketime 不能用于静态链接或 setuid 程序,因为此类程序无法使用 LD_PRELOAD。

有没有办法让我编译的 go 程序使用 faketime?

【问题讨论】:

    标签: ubuntu go supervisord


    【解决方案1】:

    问题在于faketime 使用LD_PRELOAD 环境变量来指示程序的动态加载器在启动时加载libfaketimelibfaketime 将做所谓的“插入”——用这些例程自己的副本替换普通的动态库例程——这样当将来进行动态库调用时,libfaketime 可以影响发生的事情。特别是,libfaketime 插入了与时间相关的调用,因此它能够向程序返回假值。

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

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

    【讨论】:

    • Go 编译器默认生成动态链接的二进制文件(除非另有说明)。只需执行ldd,您将看到二进制文件链接到libc.so(在Linux 上测试)。不同之处在于它所依赖的 go 包是捆绑在二进制文件中的。但不是系统库。
    猜你喜欢
    • 1970-01-01
    • 2023-02-05
    • 2014-10-20
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多