Параметр -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
с тех пор невозможно ошибиться, к какой компиляции относятся записанные параметры.
Обратите внимание на это предостережение в руководстве
Это переключатель реализован только для некоторых целей, и точный формат записи зависит от целевого и двоичного формата файла