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. Дополнительные сведения см. в разделе Переменные среды.
Набор связанных CMI можно скопировать, при условии, что относительные имена путей сохранены.
Содержимое .gnu.c++.README не влияет на целостность CMI, и его можно удалить или изменить. Номера разделов секций, имена которых не начинаются с .gnu.c++., или не являются строковой секцией, значимы и не должны изменяться.
В случае необходимости мягкий предел увеличивается до жесткого предела.
Точное содержимое этого вывода может измениться.
Предыдущий: Предварительная обработка модулей C++, Вверх: Модули C++ [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/C_002b_002b-Compiled-Module-Interface.html