Как работает флаг компоновщика `--defsym` для передачи значений в исходный код? - PullRequest
0 голосов
/ 13 ноября 2018

В посте LJ флаг --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 ,

--defsym symbol=expression Создать глобальный символ в выходном файле, содержащий абсолютный адрес, заданный выражением.

Я пытаюсь понять следующее:

  1. Как строка из 9 символов для даты сборки (YYYYmmdd + \0) хранится в памяти?
  2. Если --defsym создает символ, содержащий адрес, почему __BUILD_DATE определяется как символ, а не как указатель или как целочисленный тип?
  3. Почему __BUILD_DATE определяется как charа не unsigned long, если он в конечном итоге приведен к unsigned long?

1 Ответ

0 голосов
/ 13 ноября 2018

Линкеры видят глобальные переменные как адреса (указатели на «фактический» глобальный объект, а не на фактический глобальный объект, даже если фактический глобальный объект не существует по этому адресу). -Xlinker --defsym -Xlinker __BUILD_DATE=$(date +%Y%m%d) устанавливает адрес of __BUILD_DATE, а не значение. Когда у объекта компоновщика __BUILD_DATE есть адрес, но нет значения, вы можете получить адрес, объявив объект как что-либо, а затем взяв адрес этого.

В

#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);
}

Любое из трех объявлений должно работать. Только не пытайтесь использовать значение этого (псевдо) глобального. Это было бы как разыменование неверного указателя.

Это должно ответить на 2 и 3. Для ответа 1 -Xlinker --defsym -Xlinker __BUILD_DATE=$(date +%Y%m%d) сохраняет число, возвращаемое (стандартный вывод) под $(date %Y%m%d), как адрес __BUILD_DATE. Он не хранит строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...