Openembedded Core Discussions
 help / color / mirror / Atom feed
* glibc binary reproducibility
@ 2018-09-27  0:18 Douglas Royds
  2018-09-27  0:54 ` Douglas Royds
                   ` (4 more replies)
  0 siblings, 5 replies; 11+ messages in thread
From: Douglas Royds @ 2018-09-27  0:18 UTC (permalink / raw)
  To: OE Core mailing list

[-- Attachment #1: Type: text/plain, Size: 3529 bytes --]

When I build glibc in two different places, I get non-reproducible 
results - a 4-byte difference:

    $ cmp -l
    ~/workspace/upstream[12]/build/tmp/work/armv5e-tait-linux-gnueabi/glibc/2.28-r0/package/lib/libc-2.28.so
    1259181  71 172
    1259182  27 304
    1259183 152  77
    1259184 363 243

These 4 bytes are the checksum that objcopy --add-gnu-debuglink adds to 
the binary when the .debug info is split out at do_package time, see 
package.bbclass +416

So why is the debug info different? We add -fdebug-prefix-map to our 
CFLAGS, which ensures that all our intra-component debug paths are 
prefixed with /usr/src/debug/glibc/, for instance, but this isn't 
working in this case. The difference is happening in csu/crt1.o, which 
is being linked into libc.so (and others):

    $
    ../recipe-sysroot-native/usr/bin/arm-tait-linux-gnueabi/arm-tait-linux-gnueabi-objdump
    -t csu/crt1.o
    ...
    00000000 l    df *ABS*    00000000
    /home/douglas/workspace/upstream1/build/tmp/work/armv5e-tait-linux-gnueabi/glibc/2.28-r0/build-arm-tait-linux-gnueabi/csu/abi-note.o
    00000000 l    df *ABS*    00000000
    /home/douglas/workspace/upstream1/build/tmp/work/armv5e-tait-linux-gnueabi/glibc/2.28-r0/build-arm-tait-linux-gnueabi/csu/start.o

This abi-note.o symbol is finding its way into libc.so:

    $
    ../recipe-sysroot-native/usr/bin/arm-tait-linux-gnueabi/arm-tait-linux-gnueabi-objdump
    -t libc.so
    ...
    00000000 l    df *ABS*    00000000
    /home/douglas/workspace/upstream1/build/tmp/work/armv5e-tait-linux-gnueabi/glibc/2.28-r0/build-arm-tait-linux-gnueabi/csu/abi-note.o

So where does csu/crt1.o come from?

    $ arm-tait-linux-gnueabi-gcc  -march=armv5te -marm -mcpu=arm926ej-s
    --sysroot=/home/douglas/workspace/upstream1/build/tmp/work/armv5e-tait-linux-gnueabi/glibc/2.28-r0/recipe-sysroot
    -nostdlib -nostartfiles *-r -o
    /home/douglas/workspace/upstream1/build/tmp/work/armv5e-tait-linux-gnueabi/glibc/2.28-r0/build-arm-tait-linux-gnueabi/csu/crt1.o*/home/douglas/workspace/upstream1/build/tmp/work/armv5e-tait-linux-gnueabi/glibc/2.28-r0/build-arm-tait-linux-gnueabi/csu/start.o
    /home/douglas/workspace/upstream1/build/tmp/work/armv5e-tait-linux-gnueabi/glibc/2.28-r0/build-arm-tait-linux-gnueabi/csu/abi-note.o
    /home/douglas/workspace/upstream1/build/tmp/work/armv5e-tait-linux-gnueabi/glibc/2.28-r0/build-arm-tait-linux-gnueabi/csu/init.o
    /home/douglas/workspace/upstream1/build/tmp/work/armv5e-tait-linux-gnueabi/glibc/2.28-r0/build-arm-tait-linux-gnueabi/csu/static-reloc.o

Note the -r = --relocatable, an ld option, which, "Generate[s] 
relocatable output---i.e., generate[s] an output file that can in turn 
serve as input to ld.  This is often called partial linking", ie. the 
glibc build is just putting these .o files together for later convenience.

Regrettably, this command both ignores -fdebug-prefix-map (which ld 
doesn't accept) and puts the fully-qualified path to some of the input 
.o files in the resulting crt1.o. At package splitdebuginfo() time, 
although the fully-qualified path info is split off into the .debug 
files, a (relative) path to the .debug files plus a checksum is tacked 
onto libc.so by objcopy --add-gnu-debuglink ... and the checksum depends 
on the path to the build.

There is a work-around: turn off the debug packaging:

    INHIBIT_PACKAGE_DEBUG_SPLIT_pn-glibc = "1"

I don't have a solution for this. Suggestions?


[-- Attachment #2: Type: text/html, Size: 4472 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2018-10-03 20:55 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-09-27  0:18 glibc binary reproducibility Douglas Royds
2018-09-27  0:54 ` Douglas Royds
2018-09-27  8:37 ` Richard Purdie
2018-10-02 16:58 ` Richard Purdie
2018-10-03  2:37   ` Douglas Royds
2018-10-03  2:43     ` Douglas Royds
2018-10-03 11:25       ` Richard Purdie
2018-10-03 13:31         ` Khem Raj
2018-10-03 20:55         ` Douglas Royds
2018-10-03  4:26 ` [PATCH] glibc: Fix non-IA reproducibility for shared libraries Douglas Royds
2018-10-03  4:34 ` ✗ patchtest: failure for " Patchwork

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox