Проверьте встроенные флаги или параметры библиотеки (-frecord-g cc -switches) - PullRequest
1 голос
/ 26 мая 2020

Я хотел бы проверить исследуемую библиотеку, с какими флагами и параметрами были построены?

Я пытаюсь использовать компилятор g cc с опцией -frecord-gcc-switches, чтобы понять мою простую общую библиотеку, но безуспешно.

Ниже приведен фрагмент кода, который формирует общая библиотека:

#include "shared.h"
unsigned int add(unsigned int a, unsigned int b)
{
    printf("\n Inside add()\n");
    return (a+b);
}

shared.h выглядит так:

#include<stdio.h>
extern unsigned int add(unsigned int a, unsigned int b);

Я запускаю следующие команды для создания общей библиотеки:

gcc -c -Wall -Werror -fPIC -frecord-gcc-switches shared.c
gcc -shared -frecord-gcc-switches -o libshared.so shared.o

The readelf -n libshared.so дает мне

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

Как проверить, какие параметры / флаг или дополнительные библиотеки были использованы для создания итоговой библиотеки?

Кстати, я использую

$ gcc --version
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

1 Ответ

0 голосов
/ 26 мая 2020

Параметр -frecord-gcc-switches эффективен только при компиляции, но не при компоновке, поэтому вы можете опустить его из:

$ gcc -shared -frecord-gcc-switches -o libshared.so shared.o

По крайней мере, в объектных файлах ELF параметры компиляции записываются в виде списка строки в раздел объектного файла с именем .GCC.command.line. Параметры компиляции по умолчанию записываются, а также явно заданные.

Если несколько объектных файлов, содержащих этот раздел, связаны с общей библиотекой или программой, то все входные разделы .GCC.command.line объединяются в один выходной раздел с тем же именем , видимо, с дедупликацией строк. Поэтому, если разные исходные файлы были скомпилированы с разными параметрами, параметры, применяемые к каждому исходному файлу, могут быть неочевидными.

Чтобы получить записанные параметры из libshared.so, выполните:

$ readelf --string-dump=.GCC.command.line libshared.so

Вывод будет похож на:

String dump of section '.GCC.command.line':
  [     0]  -I .
  [     5]  -imultiarch x86_64-linux-gnu
  [    22]  -D_GNU_SOURCE
  [    30]  file1.cpp
  [    3a]  -mtune=generic
  [    49]  -march=x86-64
  [    57]  -Wextra
  [    5f]  -frecord-gcc-switches
  [    75]  -fasynchronous-unwind-tables
  [    92]  -fstack-protector-strong
  [    ab]  -Wformat
  [    b4]  -Wformat-security
  [    c6]  -fstack-clash-protection
  [    df]  -fcf-protection
  [    ef]  file2.cpp
  [    f9]  file3.cpp
  [   103]  -Wpedantic

Поскольку связывание ничего не добавляет к этой информации, имеет смысл получать ее прямо из объектных файлов, а не из программы или общей библиотеки, с которой они связаны:

$ readelf --string-dump=.GCC.command.line file.o

с тех пор невозможно ошибиться, к какой компиляции относятся записанные параметры.

Обратите внимание на это предостережение в руководстве

Это переключатель реализован только для некоторых целей, и точный формат записи зависит от целевого и двоичного формата файла

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