【问题标题】:Embedding compile time information into binary将编译时间信息嵌入二进制文件
【发布时间】:2015-09-13 20:43:38
【问题描述】:

假设我有一个在源代码中用 extern 定义的变量 date,即 extern date; 然后我想在链接时为它分配一个值,从编译它的计算机获取时间并分配给日期变量。 有没有办法做到这一点,例如在 gcc 中?

【问题讨论】:

    标签: c gcc time linker


    【解决方案1】:

    __TIME____DATE__ 是您要找的吗?

    如果编译和链接是您方案中的一个步骤,您可以让编译器和链接器将这些宏替换为日期和时间。如果您一天编译并链接另一天,这将不起作用,因为编译器(更好:预处理器)决定插入哪个值。

    查看 this 或 stackoverflow 上的其他帖子。

    【讨论】:

    • 否则可以只使用-D选项传递符号定义,其值从外部shell命令格式化,如date
    • @EugeneSh。那更容易。我误解了这个问题,并认为 Eral 希望能够看到二进制文件中的值(例如,在执行 hexdump 时)。在这种情况下,需要另一个宏来将符号转换为字符串(字符数组)
    • 我不太确定我明白你的意思。两种方法都应该给出相同的结果。但在你的它将由预处理器自己定义符号来完成,在我的它将在外部完成。但在这两种情况下,我们最终都会得到定义当前时间的符号
    • @EugeneSh。没关系,因为我走错了路 ;-) 但就像你说的:两种方法都可以交付日期,但你的方法更灵活
    【解决方案2】:

    可以在链接命令之前将带有 date 命令输出的日期变量通过管道传输到 gcc 中,因此变量 date 包含当前链接的日期和时间。 gcc 从管道中读取 C 源代码的选项是-xc -

    /* hello.c */
    #include <stdio.h>
    
    int main(void)
    {
        extern char const date[];
    
        printf("Hello, link date is %s\n", date);
        return 0;
    }
    

    $ gcc -c hello.c
    $ echo "char const date[] =\"`date`\";" | gcc -c -xc - -o date.o;gcc hello.o date.o
    $ ./a.out
    Hello, link date is Sat Jun 27 11:59:19 CEST 2015
    $ 
    

    【讨论】:

    • 这也可以,但越简单越好。不过谢谢
    • @eral 这种方法适用于Marged 在他的回答中解释的情况。如果您在某一天编译并链接另一天,则此方法将起作用。
    • 是的,但不是我的情况,我只是按下按钮,IDE 会在一分钟内完成所有操作。这意味着在预处理和链接之间最多有 1 分钟的时间,没关系。
    • @eral 考虑如果程序包含多个文件,您将获得包含日期变量的文件的预处理时间。如果您更改另一个文件并再次链接程序,则日期仍为旧值。
    • 是的,你说得对。但是添加 touch 参数作为预构建步骤,以便始终编译此宏所在的文件,可以解决此问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多