Files
docview/docs/PDFIUM-SOURCE-CORRESPONDENCE.md
2026-09-21 13:41:40 +09:00

120 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PDFium配布物と固定ソースの対応
2026-09-19、DocViewが固定するPDFium **155.0.8057.0**について、配布元・ビルド手順・依存pin・同梱告知の対応を調査した。これは技術的な出所確認であり、法的適合性の認定、全対応ソースの収集完了、再現ビルドの成功を意味しない。製品ソース、PDFium lock、配布アーカイブは変更していない。
**後続の収集状況:** [固定Gitソースの追加記録](../tests/results/source-archives/PDFIUM.md)で、本体と27依存、FreeType内の追加参照dlgを取得した。Git objectとアーカイブ全payloadを検査し、先行取得原文31件、パッチ後の全公開ヘッダー24件、同梱告知15件の一致を確認した。Linux3件・Windows4件のパッチを専用コピーへ適用済み。以下の「未取得・未適用」は先行調査時点の範囲を記録したもので、現在の取得状況は追加記録を参照する。コンパイラー/sysroot等の全入力と再現ビルドは引き続き未完了。
機械可読の結果は[report.json](../tests/results/source-correspondence/pdfium/report.json)、取得URL・時刻・元応答と保存内容のSHA-256は各`*.retrieval.json`、全保存物の一覧は[manifest.json](../tests/results/source-correspondence/pdfium/manifest.json)にある。保存物は小規模なメタデータ・レシピ・patch・告知原文であり、巨大ソースarchive、依存checkout、ビルドは取得・実行していない。
## 配布物からレシピへの対応
| 対象 | 確認した固定値 |
|---|---|
| PDFium upstream commit | `a5a7089234f121990b336b3841008009dca143bf` |
| provider tag | `bblanchon/pdfium-binaries`の`chromium/8057` |
| provider recipe commit | `f2e9a1c45bb17b85b540abf1af30146ef65416ac` |
| GitHub release ID | `388577209`、公開APIの`immutable=true` |
| build workflow run | `34853011437`、attempt 1、`workflow_dispatch`、`success` |
| Linux x64 archive SHA-256 | `7788fa57a2996ebd21afc4090eb0a42b9f95ef3a72e7ef4c0756f1ea703c0415` |
| Windows x64 archive SHA-256 | `e307d519e42f2e69b1b531f0c2a32dffcdf3891ec0eba60328ba51a57cec01ed` |
上のarchive digestは、既存[lock](../cmake/pdfium.lock.json)、[GitHub release API](https://api.github.com/repos/bblanchon/pdfium-binaries/releases/tags/chromium/8057)、releaseに同梱されたattestationのsubjectで一致した。今回archive本体は再取得していない。
[タグAPI](https://api.github.com/repos/bblanchon/pdfium-binaries/git/ref/tags/chromium/8057)、releaseの`target_commitish`、[workflow run](https://github.com/bblanchon/pdfium-binaries/actions/runs/34853011437)、attestation payloadの`resolvedDependencies`は、同じprovider commitを示す。Linux x64 / Build(job `104005424482`)とWindows x64 / Build(job `104005424089`)の成功も公開job metadataで確認した。
[attestation原文](../tests/results/source-correspondence/pdfium/provider/attestation.json)のSHA-256は`3928dc9e52ebda1b200d9cb2dcbd971aee57b08190a49ea3e6cd7c31ee445719`で、release assetのdigestと一致する。DSSE payloadは[読取り用JSON](../tests/results/source-correspondence/pdfium/provider/attestation-payload.json)へbase64展開した。**Sigstore署名・証明書・透明性ログの信頼検証は未実施**であり、payloadを読めたことを署名検証済みとは扱わない。payloadが固定するソースはprovider repositoryであり、PDFium本体のcheckout SHAや全依存は列挙していない。
PDFiumの[固定commit](https://pdfium.googlesource.com/pdfium/+/a5a7089234f121990b336b3841008009dca143bf)と調査時点の`refs/heads/chromium/8057`は一致した。ただしproviderは`gclient sync -r origin/chromium/8057`で取得するため、現在のbranch参照とversionだけで当時の全checkout状態を暗号学的に証明したことにはならない。
## レシピと適用patch
固定commitの[レシピ一式](https://github.com/bblanchon/pdfium-binaries/tree/f2e9a1c45bb17b85b540abf1af30146ef65416ac)から、6 workflow、`build.sh`、11段階の`steps`、全`patches`、README、LICENSEの計44ファイルを保存した。全ファイルのGit blob SHA-1を固定commitのtreeと照合し、個別SHA-256も記録している。別OS用・static版用を含むpatch集合全体を保持し、対象に適用する集合とは区別した。
| 対象 | `steps/03-patch.sh`の分岐が選ぶpatch |
|---|---|
| Linux x64、shared、V8無効 | `shared_library.patch`、`public_headers.patch`、`clang_rt.patch` |
| Windows x64、shared、V8無効 | 上記3件+`win/build.patch`。別途`win/resources.rc`をversion/yearで展開 |
`shared_library.patch`はPDFium targetを共有library化し、Windows resourcesを追加する。`public_headers.patch`はexport条件と公開C++ headerの相対includeを調整する。`clang_rt.patch`はChromium build側の未対応platform分岐を調整し、`win/build.patch`はresource compilerの呼出しを変更する。これらは公開元のpatchをそのまま保存したもので、今回新規に適用してビルドしたものではない。
[checkout手順](../tests/results/source-correspondence/pdfium/provider/recipe/steps/02-checkout.sh)はV8無効時に`checkout_configuration=minimal`を使う。[configure手順](../tests/results/source-correspondence/pdfium/provider/recipe/steps/05-configure.sh)と既存Linux配布物の[args.gn](../tests/results/source-correspondence/pdfium/packaged/args.gn)は、Release、standalone、shared、x64、V8/XFA/partition allocator無効と整合する。配布物の`args.gn`には指定した値のみがあり、全GN既定値の展開結果ではない。
## 依存ソースのpin
[固定PDFium DEPS](https://pdfium.googlesource.com/pdfium/+/a5a7089234f121990b336b3841008009dca143bf/DEPS)はSHA-256 `55e7f4ecba645a748d99b91df6ff8ed9133faa08a07d39a6c0324a717926b44e`。Pythonとして実行せず、定数・文字列連結・`Var`参照だけを読取り、56依存のURL/revision、条件、CIPD version、GCS object hash/generationを[dependency-pins.json](../tests/results/source-correspondence/pdfium/dependency-pins.json)へ保存した。
明示された`recursedeps`は3件で、いずれもその固定revisionのDEPSを取得した。そこからさらに`recursedeps`は宣言されていない。
| recursive dependency | 固定revision | 宣言された追加依存 |
|---|---|---:|
| Chromium build | `2cd94c0abeada712aeea6906d99021913c9fc28d` | 9 sysroot |
| Chromium buildtools | `6f6a5dbf04b734214f3b1f386567d101ec9d607e` | 4 formatter package |
| instrumented_libraries | `d15c278eed5d38d9acf2d8054cf37baba93cef8e` | 1条件付きbinary集合 |
これはgclientが宣言する取得グラフであり、全てが今回のlibraryへリンクされるという意味ではない。条件は評価せず原文を保持する。固定`build_overrides/pdfium.gni`ではBrotli、Skia、Fontations、Rust BMP/JPEG/PNGが無効。V8無効のminimal checkout、partition allocator無効というrecipeの設定も別に記録した。CIPDのversion文字列からinstance IDへの解決、toolchain/sysroot archiveの取得、実際の最終`build.ninja`との照合は未実施。
## 同梱15告知とソース原文
対象は既存Linux配布物のトップレベル`LICENSE`と`licenses/`の14ファイル。providerの[収集手順](../tests/results/source-correspondence/pdfium/provider/recipe/steps/08-licenses.sh)とstage手順の指定を、データ変換として再現した。**15件全てが同梱ファイルとbyte単位で一致**した。各原文URL・固定revision・原文hash・変換後hash・同梱hashは[license-correspondence.json](../tests/results/source-correspondence/pdfium/license-correspondence.json)にある。
| 同梱ファイル | ソース所在/固定revision | 対応方法 |
|---|---|---|
| `LICENSE` | provider `f2e9a1c45bb17b85b540abf1af30146ef65416ac` | LICENSEへ第三者告知の案内を追記 |
| `pdfium.txt` | PDFium `a5a7089234f121990b336b3841008009dca143bf` | LICENSEの先頭`//`を除去 |
| `agg23.txt` | 同PDFium内`third_party/agg23` | `agg_array.h`冒頭の告知を抽出 |
| `lcms.txt` | 同PDFium内`third_party/lcms` | `include/lcms2.h`冒頭の告知を抽出 |
| `libopenjpeg.txt` | 同PDFium内`third_party/libopenjpeg` | `openjpeg.c`冒頭の告知を抽出 |
| `freetype.txt` | PDFium内FTL.TXT。実ソースpin `4800589f76dc62fbe523a74a59e0d4850a5dd7df` | 原文と一致 |
| `abseil.txt` | `435e7d977fb36fb47854a4c552c0706dad0bd7cf` | LICENSEと一致 |
| `fast_float.txt` | `34164f547b7df3f5d794ff67e9f885c36819ebfc` | LICENSE-MITと一致 |
| `icu.txt` | `8cc91d9b6ab9991802fd208ee03a69714fd0251c` | LICENSEと一致 |
| `libjpeg_turbo.md` | `640f254ad0fa03f6b1f29f89b7dd9366f2f6e533` | LICENSE.mdと一致 |
| `libjpeg_turbo.ijg` | 同libjpeg-turbo revision | README.ijgと一致 |
| `libpng.txt` | `6d5341764ef4e38cbc07d35514a8aa73de50de8a` | LICENSEと一致 |
| `llvm-libc.txt` | `320824188c37e5c28738b9652a0ca8087c934bc9` | LICENSE.TXTと一致 |
| `simdutf.txt` | `f7356eed293f8208c40b3c1b344a50bd70971983` | LICENSEと一致 |
| `zlib.txt` | `285e94b8fa95ad3b7d16b80798ec8dce6febb8c8` | zlib.h冒頭の告知を抽出 |
AGG、Little CMS、OpenJPEGはPDFium内へ取り込まれた変更済みソースである。保存したREADMEにはAGG 2.3 hard fork、Little CMS 2.19の原revision `b76633e60c8387a77268fb3359277ca25b5fd75c`、OpenJPEG 2.5.4の原revision `6c4a29b00211eb0430fa0e5e890f1ce5c80f409f`とローカル変更が記載される。対応ソースとしては元のreleaseだけでなく、上表の固定PDFium treeが必要になる。
fast_floatのREADMEはversion 7.0.0/`cb1d42aaa1e14b09e1452cfdef373d051b8c02a4`を記載する一方、DEPSのcheckout pinは`34164f5…`である。この差を推測で統一せず、checkoutの特定にはDEPSの完全なrevisionを採用した。
## 追加告知の技術的根拠
15件の一致は告知一式の網羅性を証明しない。providerの収集処理は`build.ninja`の`third_party`名を英小文字・数字・`_`・`-`の範囲で抽出するため、`libc++`と`libc++abi`は`libc`へ切り詰められ、そのcaseは収集対象から除かれる。
固定Chromiumの`config/c++/c++.gni`は`use_custom_libcxx=true`を既定にし、配布Linux `args.gn`にはその無効化がない。加えて、実`libpdfium.so`(SHA-256 `08f6ea53a64f6fbb9f5ba8d9c02e0051987c6a9175f3fb5ba25f219174731aaa`)から次の小規模な証拠を保存した。
- [DT_NEEDED](../tests/results/source-correspondence/pdfium/local-readelf-dynamic.txt)は`libpthread`、`libm`、`libgcc_s`、`libc`、dynamic loaderで、外部`libstdc++`/`libc++`依存はない。この観測だけで標準libraryの実装までは決定しない。
- [公開symbol](../tests/results/source-correspondence/pdfium/local-readelf-cxx-symbols.txt)には、定義済みの`std::__Cr::__libcpp_verbose_abort`がある。
- [読取り文字列](../tests/results/source-correspondence/pdfium/local-cxx-string-indicators.txt)には`third_party/libc++abi/src/src/private_typeinfo.cpp`、`fallback_malloc.cpp`と`libc++abi:`がある。
これらを合わせると、libc++/libc++abiの告知を追加する技術的根拠がある。取得済みの固定原文は次の通り。`llvm-libc`とは別のcomponentである。
| 追加候補 | DEPS固定revision | 原文SHA-256 |
|---|---|---|
| [libc++ LICENSE.TXT](../tests/results/source-correspondence/pdfium/dependencies/third_party/libc++/src/LICENSE.TXT) | `97b436da4c33663581d394f4ee0a5977fc38c2f4` | `539dd7aed86e8a4f12cbdd0e6c50c189c7d74847e4fecc64ce2c6ee3a01da38b` |
| [libc++abi LICENSE.TXT](../tests/results/source-correspondence/pdfium/dependencies/third_party/libc++abi/src/LICENSE.TXT) | `fc1897a2c12aa27e703c3ed48b62eba8abf4ce19` | `e2b35be49f7284a45b7baca8fc7b3ab7440e7902392b2528a457816b5bb2a15c` |
調査後、固定原文を`resources/licenses/pdfium-supplemental/`へ追加し、Linuxのinstallと
開発パッケージへ反映した。[配布検証記録](../tests/results/linux-development-package/source-notices-record.json)は
2件の告知・出典metadataの追加、全553ファイルの整合、従来版とのバイナリー一致を記録する。
configureとpackagerはPDFium版・commit・library hash・告知hashを照合する。
新しい[provenance](../tests/results/dependency-provenance/notices-final/provenance.json)は、
repository原本・package内metadata・実告知の対応も検査する。
## 未証明の範囲と再確認
現段階で得たのは固定レシピ、patch集合、宣言された依存pin、既存15告知の原文対応である。全ソースの保管、全linked componentの一覧、compiler runtimeとsysrootを含む対応ソース、再現ビルド、Windows archiveの告知照合は未完了。providerの初期`depot_tools`取得は無指定のcloneであり、GitHub Actionsも`@v6`等の可変tagを使う。root DEPS内の`depot_tools_revision`を、その前に使用したbootstrap cloneのrevisionと同一視しない。
レシピの解釈と公開API metadataだけから、全入力のbit単位再現性や配布条件の充足を宣言しない。G-DISTRIBUTIONの完了判定には、これらの不足を対象に追加確認が必要である。
オフラインで再確認する場合はrepository rootから以下を実行できる。取得済みmetadataだけを読み、元PDFiumのビルドスクリプトは実行しない。
```sh
python3 tests/results/source-correspondence/pdfium/check_correspondence.py
python3 tests/results/source-correspondence/pdfium/summarize.py
```
再取得URLは`provider-plan.json`、`upstream-plan.json`、`supplement-plan.json`と各retrieval sidecarに保持する。1件の`README.pdfium` HTTP 404は[失敗記録](../tests/results/source-correspondence/pdfium/retrieval-failures.json)に残し、固定treeで確認した`README.md`を取得した。全source cloneや巨大archive取得へ置き換えていない。