Как читать авторский курс и нормативные материалы
Это учебные материалы, а не заключение о соответствии конкретного продукта. Организационные модели курса отделяйте от терминов стандарта: ППК в опубликованном проекте — машиночитаемый перечень, а живой реестр его версий является практикой сопровождения. Термин OSA в разных материалах имеет разный охват. Статус и обязательность нормативного документа проверяются отдельно; проект КАПО опубликован как проект первой редакции.
pkg-config и файлы pc
Почему это важно для SCA/OSA
pkg-config и его .pc-файлы — это слой, через который Autotools-, Meson- и многие CMake-проекты узнают, как линковаться с библиотекой. .pc-файл — текстовый, читаемый и содержит ровно те поля, которых не хватает SCA: Version:, Requires:, Libs:, Cflags:. Для аудитора это не слепая зона, а наоборот — готовый источник evidence: по Version: и Requires: можно восстановить и версию компонента, и его прямые зависимости, не разбирая бинарь.
Но есть две тонкости. Поле Version: проставляет упаковщик дистрибутива вручную, и оно не обязано совпадать с реальной версией кода библиотеки (особенно у форков и пропатченных пакетов). И .pc различает Requires: и Requires.private: — второе нужно только при статической линковке, и его легко пропустить.
Как это проявляется
Типичный .pc-файл — это структурированное evidence:
# /usr/lib/x86_64-linux-gnu/pkgconfig/libssl.pc
Name: OpenSSL-libssl
Version: 3.0.13
Requires.private: libcrypto
Libs: -L${libdir} -lssl
Cflags: -I${includedir}
Как достать поля программно
pkg-config --modversion libssl # 3.0.13 — версия из .pc
pkg-config --print-requires libssl # прямые Requires
pkg-config --print-requires-private --static libssl # Requires.private (для .a)
pkg-config --variable=pcfiledir libssl
PKG_CONFIG_PATHуправляет тем, какой.pcнайдётся первым, — на сборочной машине это может быть не системный, а вендоренный.pcизthird_party/.
Поле .pc |
Что даёт SCA | Подвох |
|---|---|---|
Version: |
версия компонента | проставлена упаковщиком, может не совпадать с кодом |
Requires: |
прямые зависимости (динамика и статика) | — |
Requires.private: |
зависимости только для статической линковки | теряется без --static |
Libs.private: |
флаги линковки для статики | то же |
Слепая зона или приём
Здесь скорее приём, чем слепая зона: .pc — это harvestable-источник, который часто игнорируют. Но есть и риск — Version: из .pc нельзя принимать на веру для пропатченных и форкнутых пакетов: упаковщик мог оставить апстрим-версию, добавив свои патчи. И Requires.private: без флага --static не виден, а именно он закрывает транзитивные зависимости статически слинкованного кода.
Снимайте Requires вместе с Requires.private Всегда запрашивайте и публичные, и приватные зависимости (
--static). Версию из.pcсверяйте с реальным источником (changelog пакета,dpkg -s), особенно если библиотека пришла из вендоренного каталога, а не из дистрибутива.
Что делать на проекте
- Найдите все
.pc-файлы в путяхPKG_CONFIG_PATHи в дереве сборки; вендоренные.pcизthird_party/отметьте отдельно. - Соберите по каждому
Version:,Requires:,Requires.private:— это evidence по версии и прямым зависимостям. - Запросы делайте с
--static, иначе потеряетеRequires.privateстатической линковки. - Сверьте
Version:с реальной версией кода для форков/пропатченных пакетов; расхождение — повод понизить confidence. - Смаппьте имена из
.pcна пакеты дистрибутива (dpkg -S/rpm -qfпо пути.pc-файла). - Поля
.pcиспользуйте как дополнение кldd/readelf, а не вместо них:.pcотражает намерение сборки, бинарь — результат.
Связь
- Модуль: М09. C/C++ legacy
- Практики: П19. C C++ make build inventory · П22. ELF dynamic dependencies · П20. CMake dependency graph
- Нормативка: ГОСТ Р 56939-2024 · BSI TR-03183-2 v2.1.0 · NIST SP 800-218 SSDF
- Смежные заметки: ldd/readelf/objdump · dpkg/apt metadata · статическая линковка · ручные third_party каталоги