[OE-core] glibc binary reproducibility

Douglas Royds douglas.royds at taitradio.com
Thu Sep 27 00:54:05 UTC 2018


The relocatable link is defined in glibc csu/Makefile line 125


On 27/09/18 12:18, Douglas Royds wrote:

> 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?
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openembedded.org/pipermail/openembedded-core/attachments/20180927/1b1f234d/attachment-0002.html>


More information about the Openembedded-core mailing list