14 KiB
PDFium配布物と固定ソースの対応
2026-09-19、DocViewが固定するPDFium 155.0.8057.0について、配布元・ビルド手順・依存pin・同梱告知の対応を調査した。これは技術的な出所確認であり、法的適合性の認定、全対応ソースの収集完了、再現ビルドの成功を意味しない。製品ソース、PDFium lock、配布アーカイブは変更していない。
後続の収集状況: 固定Gitソースの追加記録で、本体と27依存、FreeType内の追加参照dlgを取得した。Git objectとアーカイブ全payloadを検査し、先行取得原文31件、パッチ後の全公開ヘッダー24件、同梱告知15件の一致を確認した。Linux3件・Windows4件のパッチを専用コピーへ適用済み。以下の「未取得・未適用」は先行調査時点の範囲を記録したもので、現在の取得状況は追加記録を参照する。コンパイラー/sysroot等の全入力と再現ビルドは引き続き未完了。
機械可読の結果はreport.json、取得URL・時刻・元応答と保存内容のSHA-256は各*.retrieval.json、全保存物の一覧は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、GitHub release API、releaseに同梱されたattestationのsubjectで一致した。今回archive本体は再取得していない。
タグAPI、releaseのtarget_commitish、workflow run、attestation payloadのresolvedDependenciesは、同じprovider commitを示す。Linux x64 / Build(job 104005424482)とWindows x64 / Build(job 104005424089)の成功も公開job metadataで確認した。
attestation原文のSHA-256は3928dc9e52ebda1b200d9cb2dcbd971aee57b08190a49ea3e6cd7c31ee445719で、release assetのdigestと一致する。DSSE payloadは読取り用JSONへbase64展開した。Sigstore署名・証明書・透明性ログの信頼検証は未実施であり、payloadを読めたことを署名検証済みとは扱わない。payloadが固定するソースはprovider repositoryであり、PDFium本体のcheckout SHAや全依存は列挙していない。
PDFiumの固定commitと調査時点のrefs/heads/chromium/8057は一致した。ただしproviderはgclient sync -r origin/chromium/8057で取得するため、現在のbranch参照とversionだけで当時の全checkout状態を暗号学的に証明したことにはならない。
レシピと適用patch
固定commitのレシピ一式から、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手順はV8無効時にcheckout_configuration=minimalを使う。configure手順と既存Linux配布物のargs.gnは、Release、standalone、shared、x64、V8/XFA/partition allocator無効と整合する。配布物のargs.gnには指定した値のみがあり、全GN既定値の展開結果ではない。
依存ソースのpin
固定PDFium DEPSはSHA-256 55e7f4ecba645a748d99b91df6ff8ed9133faa08a07d39a6c0324a717926b44e。Pythonとして実行せず、定数・文字列連結・Var参照だけを読取り、56依存のURL/revision、条件、CIPD version、GCS object hash/generationを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の収集手順とstage手順の指定を、データ変換として再現した。15件全てが同梱ファイルとbyte単位で一致した。各原文URL・固定revision・原文hash・変換後hash・同梱hashは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は
libpthread、libm、libgcc_s、libc、dynamic loaderで、外部libstdc++/libc++依存はない。この観測だけで標準libraryの実装までは決定しない。 - 公開symbolには、定義済みの
std::__Cr::__libcpp_verbose_abortがある。 - 読取り文字列には
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 | 97b436da4c33663581d394f4ee0a5977fc38c2f4 |
539dd7aed86e8a4f12cbdd0e6c50c189c7d74847e4fecc64ce2c6ee3a01da38b |
| libc++abi LICENSE.TXT | fc1897a2c12aa27e703c3ed48b62eba8abf4ce19 |
e2b35be49f7284a45b7baca8fc7b3ab7440e7902392b2528a457816b5bb2a15c |
調査後、固定原文をresources/licenses/pdfium-supplemental/へ追加し、Linuxのinstallと
開発パッケージへ反映した。配布検証記録は
2件の告知・出典metadataの追加、全553ファイルの整合、従来版とのバイナリー一致を記録する。
configureとpackagerはPDFium版・commit・library hash・告知hashを照合する。
新しいprovenanceは、
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のビルドスクリプトは実行しない。
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は失敗記録に残し、固定treeで確認したREADME.mdを取得した。全source cloneや巨大archive取得へ置き換えていない。