Notes for nfft - reproducible builds result

Version annotated: 3.3.2~rc2-2
Comments: tl;dr: A floating-point constant has a different value.
.
Occurs on amd64 and i386 but not on armhf. This accords with
architecture-dependent dependencies (no pun intended) in d/control and
d/rules, specifically, libfftw3-long3 is not available on armhf.
.
The library is built three times, with (float | double | long double) as the type 'R'.
(Reminder: on amd64, the sizeof()s of these types are 4/8/16 respectively and they must be aligned to their size.)
.
The difference is always in the .rodata section, always right after the end of a string
literal and before what appears to be an array of small integers in 16-bit words; for
example, in the 'float' case:
.
│ │ │ │ │ 0x0004abe0 45252b2e 3145692c 00252b45 252b4569 E%+.1Ei,.%+E%+Ei
│ │ │ │ │ 0x0004abf0 2c0a0000 f037983c f304b539 0000f042 ,....7.<...9...B
│ │ │ │ │ - 0x0004ac00 e30c1b4f 286b6e4e 00000000 00000000 ...O(knN........
│ │ │ │ │ + 0x0004ac00 53eb264f 286b6e4e 00000000 00000000 S.&O(knN........
│ │ │ │ │ 0x0004ac10 00000000 00000000 00000000 00000000 ................
│ │ │ │ │ 0x0004ac20 01000000 00000000 03000000 00000000 ................
│ │ │ │ │ 0x0004ac30 07000000 00000000 09000000 00000000 ................
│ │ │ │ │ 0x0004ac40 0e000000 00000000 11000000 00000000 ................
.
The difference always occurs in the 4th sizeof(R)-block after the end of the string literal "%+E%+Ei,\n".
For example, in the 'float' case
the literal ends at 0x4abf2,
the next point a float can be aligned at is 0x4abf4,
and «(float*)(3 + (float*)0x4abf4)» is the word having a difference.
.
The same is true for the 'double' and 'long double' builds, mutatis mutandis
(substitute for 'float' the value of the type 'R' in that build).
.
Tracing the architecture-dependent part (d/rules → --enable-long-double
→ AC_DEFINE(NFFT_LDOUBLE, 1)) finds two global arrays of type 'R':
.
kernel/util/lambda.c|24 col 13| #if defined(NFFT_LDOUBLE)
kernel/util/bessel_i0.c|21 col 13| #if defined(NFFT_LDOUBLE)
.
These arrays would be stored in .rodata, although I couldn't find them in
the symbol table.
.
So, the hypothesis is that a const variable of type 'R' of static storage
duration has a different value between the two builds.
 

Our notes about issues affecting packages are stored in notes.git and are targeted at packages in Debian in 'unstable/amd64' (unless they say otherwise).