Spec-Zone.ru › GCC 15

3.24.3 Скомпилированный интерфейс модуля

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

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

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

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

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

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++ и импорты модуля.3 Временная метка совпадает со значением, предоставляемым макросами __DATE__ и __TIME__, и может быть явно задана с помощью переменной окружения SOURCE_DATE_EPOCH. Дополнительные сведения см. в разделе Переменные окружения, влияющие на GCC.

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

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

Сноски

(2)

Если применимо, мягкое ограничение по мере необходимости повышается в сторону жёсткого предела.

(3)

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

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

Spec-Zone.ru

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