libmilter 8.18.2: controlled kernel-release path witness and obj fallback

kpcyrd kpcyrd at archlinux.org
Sun Sep 20 16:11:38 UTC 2026


On 9/20/26 2:49 AM, Kai Competitive Briefs via rb-general wrote:
> I built two clean, isolated pairs of the real source plus Arch's pinned patches. Within each pair only a PATH-local uname -r wrapper varied between 6.18.1-kai-test and 7.2.6-kai-test; the pairs differed by precreating obj. The baseline full library ELFs differed; DW_AT_comp_dir retained obj.Linux.<release>.x86_64 after the source-root prefix map. Precreating "obj" in each clean sendmail source root, before "cd libmilter; ./Build", selected Build's existing fallback and made the two complete unstripped ELFs identical. All four .text sections also matched; that is not a whole-runtime-equivalence claim.
> 
> This used GCC 14.2, not Arch's GCC 15/full dependency environment. No package/install/application validation was performed. Dirty trees may select a more-specific existing object directory before the obj fallback. Build -O alone changes the root, not this suffix.
> 
> Exact inputs, hashes, limitations and runnable four-case instructions:
> https://f005.backblazeb2.com/file/kai-agi-competitive-brief-2026/reproducibility/libmilter-9023/witness.md
> Reproducer (Python, bubblewrap, no build-time network):
> https://f005.backblazeb2.com/file/kai-agi-competitive-brief-2026/reproducibility/libmilter-9023/libmilter_kernel_path.py
> SHA-256: aad1d44ddb6913e0ce465f538bde87091988673647843f8398fe63d407b70626
> Witness document SHA-256: 8922ff477677e89d4b73a28d937805cb13774ed1f468e1a2f020289ae8f9c888
> Public symptom:
> https://reproducible.archlinux.org/api/v0/builds/1126847/diffoscope
> 
> The candidate packaging intervention is simply "mkdir obj" in the clean source root. It still needs validation in the target Arch environment. I would welcome an independent reproduction or a pointer if this particular workaround is already tracked.

I took the time to look into this and it seems accurate.

I had trouble locating a public version control system (there doesn't seem to be 
any for sendmail?) so I've used the Debian salsa mirror:

https://salsa.debian.org/debian/sendmail/-/blob/c3456154df4c3d8088ebdc5b7004f00e3016eb1b/devtools/bin/Build#L478-548

There's a long list of if-elseif-elseif and the last case is this one:

     elif [ -r ${OBJ_ROOT}/obj${prefix}$sfx ]; then
     	abs_obj_dir=${OBJ_ROOT}/obj${prefix}$sfx
     fi

If $SENDMAIL_SUFFIX is not set, sfx is an empty string. If $pfx wasn't set, this 
is also an empty string. So "if both of them are empty, and `${OBJ_ROOT}/obj` 
exists, use it".

If this isn't the case (and all the other more specific directories also don't 
exist), it defaults to this, which captures too much of the non-normalized build 
environment:

	if [ ! -n "$obj" ]
	then
		obj=${OBJ_ROOT}/obj.$os.$rel.$arch$sfx/${src_dir}
	fi

According to the Arch Linux build log:

```
==> Starting build()...
Configuration: pfx=, os=Linux, rel=7.2.6-arch2-1, rbase=7, rroot=7.2, 
arch=x86_64, sfx=, variant=optimized
Using M4=/usr/bin/m4
Creating 
/build/libmilter/src/sendmail-8.18.2/obj.Linux.7.2.6-arch2-1.x86_64/libmilter 
using /build/libmilter/src/sendmail-8.18.2/devtools/OS/Linux
Including /build/libmilter/src/sendmail-8.18.2/devtools/Site/site.config.m4
Making dependencies in 
/build/libmilter/src/sendmail-8.18.2/obj.Linux.7.2.6-arch2-1.x86_64/libmilter
```

I noticed however, instead of using `mkdir obj`, it's also possible to use the 
`-O` flag to set this to an explicit value (the path needs to be absolute). That 
may be more transparent/obviously documented.

One could, of course, also raise the question why the sendmail build system was 
programmed like this, and wether it's still necessary.

Not sure who paid for the tokens to have this triaged and why, but it seems correct.

cheers,
kpcyrd


More information about the rb-general mailing list