[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

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

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 {
@@ -111,6 +110,8 @@ nozero_zero (struct nbdkit_next_ops *next_ops, void

   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

Attachment: signature.asc
Description: OpenPGP digital signature

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]