[Libguestfs] [nbdkit] [filter/nozero] large binary size with GCC 9

Eric Blake eblake at redhat.com
Fri Jul 5 13:04:50 UTC 2019


On 7/4/19 1:38 PM, Thomas Weißschuh wrote:
> Hi all,
> 
> It seems GCC 9 does not put read-only zero-initialized variables into the BSS
> section anymore; instead it is put into RODATA.
> (See the thread at [0], especially [1])
> 

Thanks for the pointers.

> In filter/nozero a 64M large, static, zeroed, read-only array is declared.
> The new behavior of GCC puts this array as-is into the binary inflating the
> size by a factor of around 10000.

Odd that you are only seeing this for the nozero filter, since we also
have the same sort of buffer in server/plugins.c.  Oh, I see a
difference between the two - one is function-local, the other is
file-local.  Does this patch make a difference? (I need to fire up a
rawhide VM to test it myself...)  If it doesn't, then removing the
'const' seems like the easiest trick to work around this compiler
pessimization (yes, I can see why the compiler writers argued that
sticking things in .rodata adds a bit more security against errant code
accidentally trying to corrupt the buffer; but as the buffer shouldn't
be escaping, it's already undefined behavior for such code to happen).

diff --git i/filters/nozero/nozero.c w/filters/nozero/nozero.c
index 16ec710b..21863707 100644
--- i/filters/nozero/nozero.c
+++ w/filters/nozero/nozero.c
@@ -45,7 +45,6 @@

 #define MAX_WRITE (64 * 1024 * 1024)

-static const char buffer[MAX_WRITE];
 static enum ZeroMode {
   NONE,
   EMULATE,
@@ -111,6 +110,8 @@ nozero_zero (struct nbdkit_next_ops *next_ops, void
*nxdata,

   while (count) {
     uint32_t size = MIN (count, MAX_WRITE);
+    static const char buffer[MAX_WRITE]; /* Always contains zeroes */
+
     if (next_ops->pwrite (nxdata, buffer, size, offs, flags, err) == -1)
       return -1;
     offs += size;


-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libguestfs/attachments/20190705/d31cb28e/attachment.sig>


More information about the Libguestfs mailing list