Доступ к идентификатору сборки во время выполнения - PullRequest
1 голос
/ 12 апреля 2019

Я пытаюсь выяснить, как получить доступ к идентификатору сборки, сгенерированному компоновщиком во время выполнения.

С этой страницы https://linux.die.net/man/1/ld

Когда я создаю тестовую программу, такую ​​как:

% gcc test.c -o test -Wl,--build-id=sha1

Я вижу, что идентификатор сборки присутствует в двоичном файле:

% readelf -n test

Displaying notes found in: .note.gnu.build-id
  Owner                 Data size   Description
  GNU                  0x00000014   NT_GNU_BUILD_ID (unique build ID bitstring)
    Build ID: 85aa97bd52ddc4dc2a704949c2545a3a9c69c6db

Я хотел бы напечатать это во время выполнения.

РЕДАКТИРОВАТЬ: Предположим, вы не можете получить доступ к файлу elf, из которого был загружен запущенный процесс (разрешения, встроенная / нет файловой системы и т. Д.).

РЕДАКТИРОВАТЬ: принятый ответ работает, но компоновщик не обязательно должен размещать переменную в конце раздела. Если бы был способ получить указатель на начало раздела, это было бы более надежным.

1 Ответ

1 голос
/ 13 апреля 2019

Разобрался.Вот рабочий пример,

#include <stdio.h>

//
// variable must have an initializer
//  https://gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/Variable-Attributes.html
//
// the linker places this immediately after the section data
// 
char build_id __attribute__((section(".note.gnu.build-id"))) = '!';

int main(int argc, char ** argv)
{
  const char * s;

  s = &build_id;

  // section data is 20 bytes in size
  s -= 20;

  // sha1 data continues for 20 bytes
  printf("  > Build ID: ");
  int x;
  for(x = 0; x < 20; x++) {
    printf("%02hhx", s[x]);
  }

  printf(" <\n");

  return 0;
}

Когда я запускаю это, я получаю вывод, который соответствует readelf,

0 % gcc -g main.c -o test -Wl,--build-id=sha1 && readelf -n test | tail -n 5 && ./test
Displaying notes found in: .note.gnu.build-id
  Owner                 Data size       Description
  GNU                  0x00000014       NT_GNU_BUILD_ID (unique build ID bitstring)
    Build ID: c5eca2cb08f4f5a31bb695955c7ebd2722ca10e9
  > Build ID: c5eca2cb08f4f5a31bb695955c7ebd2722ca10e9 <
...