Spec-Zone.ru › GCC 13

3.23.3 Интерфейс скомпилированного модуля

CMI — дополнительный артефакт при компиляции именованных интерфейсов модулей, разделов или заголовочных файлов. Они считываются при импорте. Содержимое CMI зависит от реализации и, в случае GCC, привязано к версии компилятора. Рассматривайте их как кешируемый артефакт, который можно пересобрать, а не как дистрибутивный объект.

При создании выходного CMI все отсутствующие компоненты каталогов создаются безопасным способом для одновременных сборок, создающих несколько различных CMI в общей подкаталожной структуре.

Содержимое CMI записывается во временный файл, который затем атомарно переименовывается. Наблюдатели либо видят старое содержимое (если файл уже существует), либо полностью новое. Они не наблюдают за CMI во время его создания. Это отличается от записи файлов объектного кода, которые могут наблюдаться внешним процессом.

CMI считываются лениво, если операционная система хоста предоставляет mmap функциональность. В целом блоки считываются при поиске имени или подстановке шаблонов. Для предотвращения этого можно использовать опцию -fno-module-lazy.

Параметр --param lazy-modules=n управляет ограничением на количество одновременно открытых файлов модулей во время ленивой загрузки. Если требуется импортировать больше модулей, для определения файлов, которые следует закрыть (пока они снова не понадобятся), используется алгоритм LRU. Это ограничение может быть превышено при глубоких иерархиях зависимостей модулей. В больших кодовых базах может быть больше импортов, чем предел процесса для дескрипторов файлов. По умолчанию ограничение на несколько меньше, чем жесткий предел дескрипторов файлов на процесс, если это определяемо.3

CMI GCC используют ELF32 как платформонезависимый механизм инкапсуляции. Вы можете использовать readelf для их проверки, хотя содержимое секций в значительной степени нечитаемо. Существует секция, названная .gnu.c++.README, которая содержит текст, читаемый человеком. За исключением первой строки, каждая строка состоит из tag: value кортежей.

> readelf -p.gnu.c++.README gcm.cache/foo.gcm

String dump of section '.gnu.c++.README':
  [     0]  GNU C++ primary module interface
  [    21]  compiler: 11.0.0 20201116 (experimental) [c++-modules revision 20201116-0454]
  [    6f]  version: 2020/11/16-04:54
  [    89]  module: foo
  [    95]  source: c_b.ii
  [    a4]  dialect: C++20/coroutines
  [    be]  cwd: /data/users/nathans/modules/obj/x86_64/gcc
  [    ee]  repository: gcm.cache
  [   104]  buildtime: 2020/11/16 15:03:21 UTC
  [   127]  localtime: 2020/11/16 07:03:21 PST
  [   14a]  export: foo:part1 foo-part1.gcm

В частности, это перечисляет исходный код, скомпилированный C++ диалект и импорты модуля.4 Отметка времени совпадает с предоставленной значениями макросов __DATE__ и __TIME__, и может быть явно указана с помощью переменной окружения SOURCE_DATE_EPOCH. Для получения дополнительной информации см. Переменные окружения, влияющие на GCC.

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

Содержимое .gnu.c++.README не влияет на целостность CMI и может быть удалено или изменено. Нумерация секций, имена которых не начинаются с .gnu.c++., или не являются строковой секцией, важна и не должна изменяться.

Примечания

(3)

При необходимости мягкий предел увеличивается до жесткого предела.

(4)

Точное содержимое этого вывода может измениться.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gcc/C_002b_002b-Compiled-Module-Interface.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API