--defsym链接器标志如何将值传递给源代码?

时间:2018-11-12 21:59:48

标签: c++ c gcc casting linker

LJ post中,使用--defsym标志将构建日期传递到源代码中:

#include <stdio.h>

extern char __BUILD_DATE;

void main(void) {
    printf("Build date: %u\n", (unsigned long) &__BUILD_DATE);
}

通过链接以下标志:

gcc example.c -Xlinker --defsym -Xlinker __BUILD_DATE=$(date +%Y%m%d)

根据ld manual

  

--defsym symbol=expression在输出文件中创建一个全局符号,其中包含表达式给出的绝对地址。

我试图了解以下内容:

  1. 构建日期(YYYYmmdd + \0)的9个字符的字符串如何存储在内存中?
  2. 如果--defsym创建了一个包含地址的符号,为什么将__BUILD_DATE定义为字符而不是指针或整数类型?
  3. 为什么__BUILD_DATE被定义为char而不是unsigned long,如果最终将其转换为unsigned long呢?

1 个答案:

答案 0 :(得分:2)

链接器将全局变量视为地址(指向“实际”全局变量而不是实际全局变量的指针-即使实际全局变量在该地址不存在)。 from pymongo import MongoClient import time import random from pprint import pprint #Step 1: Connect to MongoDB - Note: Change connection string as needed client = MongoClient(port=27017) arr = [] db = client.one mycol = client["coll"] cursor = db.mycol.find() while True: for document in cursor: print(document['num']) 设置地址-Xlinker --defsym -Xlinker __BUILD_DATE=$(date +%Y%m%d)而不是值。当of __BUILD_DATE链接器实体具有地址但没有值时,可以通过将该实体声明为任何东西,然后获取该地址来获取该地址。

在:

__BUILD_DATE

三个声明中的任何一个都应该起作用。只是不要尝试使用该(伪)全局值。就像取消引用无效的指针一样。

应该回答2和3。要回答1,#include <stdio.h> //extern long __BUILD_DATE[128]; //extern int __BUILD_DATE; extern char __BUILD_DATE; int main(void) { printf("Build date: %lu\n", (unsigned long)&__BUILD_DATE); } -Xlinker --defsym -Xlinker __BUILD_DATE=$(date +%Y%m%d)返回的数字(stdout)存储为$(date %Y%m%d)的地址。它不存储字符串。