From: "H.J. Lu" <hjl.tools@gmail.com>
To: Cary Coutant <ccoutant@gmail.com>
Cc: "Sriraman Tallam" <tmsriram@google.com>,
gnu-gabi@sourceware.org, binutils <binutils@sourceware.org>,
"Xinliang David Li" <davidxl@google.com>,
"Sterling Augustine" <saugustine@google.com>,
"Paul Pluzhnikov" <ppluzhnikov@google.com>,
"Ian Lance Taylor" <iant@google.com>,
"Rahul Chaudhry" <rahulchaudhry@google.com>,
"Luis Lozano" <llozano@google.com>,
"Rafael Espíndola" <rafael.espindola@gmail.com>,
"Peter Collingbourne" <pcc@google.com>,
"Rui Ueyama" <ruiu@google.com>
Subject: Re: Reducing code size of Position Independent Executables (PIE) by shrinking the size of dynamic relocations section
Date: Sun, 01 Jan 2017 00:00:00 -0000 [thread overview]
Message-ID: <CAMe9rOrvwKmWLr5x1V-9s8hukGAkOaZoRyzWMNr8-2_GNJqvuA@mail.gmail.com> (raw)
In-Reply-To: <CAJimCsFzz1qy9qCcvaMRtgcRv9oNE7C-+3Ku9JcjBGOvqtWrVg@mail.gmail.com>
On Tue, Apr 25, 2017 at 9:06 PM, Cary Coutant <ccoutant@gmail.com> wrote:
>> Idea A: Shrinking the size of the dynamic relocations
>
> 4. Evaluate some alternate representations to improve upon the simple
> list of addresses. An idea I've been considering is emitting a bitmap
> -- an alternating series of pairs (starting address, bits), where
> "bits" is just a fixed-size bit vector describing each word starting
> at the given starting address. The "bits" field could be, say, 128 or
> 256 bits in length, or could begin with a byte that defines its
> length. I think this would work well, as the relocations are often
> clustered, but haven't yet done any testing of that hypothesis. A
> simple run-length encoding, as previously suggested, would also work,
> of course. I'm not in favor of using a general-purpose compression
> algorithm on the relocations.
>
On x86, the last 2/3 bits are always zero. We can use it to encode the
next value. Offsets are represented by
1. A base offset and followed by consecutive deltas.
2. Encode the size of next delta in the unused bits.
static size_t
encode_offsets (uintptr_t *original, char *encoded, size_t n)
{
size_t i;
int current_bytes, next_bytes;
size_t encoded_size;
uintptr_t offset, next, current;
offset = original[0];
if ((offset & (sizeof (uintptr_t) - 1)) != 0)
abort ();
next = original[1] - offset;
if (next == 0)
abort ();
next_bytes = sizeof (uintptr_t) - __builtin_clzl (next) / 8;
if (next_bytes > sizeof (uintptr_t))
abort ();
/* Encode number of bytes of the next delta in the unused bits. */
offset |= next_bytes - 1;
memcpy (encoded, &offset, sizeof (uintptr_t));
encoded_size = sizeof (uintptr_t);
encoded += encoded_size;
for (i = 1; i < n; i++)
{
current = next;
current_bytes = next_bytes;
if ((i + 1) < n)
{
offset = original[i];
if ((offset & (sizeof (uintptr_t) - 1)) != 0)
abort ();
next = original[i + 1] - offset;
if (next == 0)
abort ();
next_bytes = sizeof (uintptr_t) - __builtin_clzl (next) / 8;
if (next_bytes > sizeof (uintptr_t))
abort ();
/* Encode number of bytes of the next delta in the unused bits. */
current |= next_bytes - 1;
}
/* FIXME: Only works for little endian. */
memcpy (encoded, ¤t, current_bytes);
encoded_size += current_bytes;
encoded += current_bytes;
}
return encoded_size;
}
On x86-64, I got
Total : 1471 offsets
Before: 11768 bytes
After : 1479 bytes
--
H.J.
next prev parent reply other threads:[~2017-04-26 16:04 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-01 0:00 Sriraman Tallam
2017-01-01 0:00 ` H.J. Lu
2017-01-01 0:00 ` Sriraman Tallam
2017-01-01 0:00 ` Rafael Espíndola
2017-01-01 0:00 ` Sriraman Tallam
2017-01-01 0:00 ` Cary Coutant
2017-01-01 0:00 ` Markus Trippelsdorf
2017-01-01 0:00 ` Florian Weimer
2017-01-01 0:00 ` Alan Modra
2017-01-01 0:00 ` H.J. Lu [this message]
2017-01-01 0:00 ` Sriraman Tallam
[not found] <CAGWvnynFwXFGLj3tAVgDatn0zmuHcWHyRNuDvR+wRZCXLnar_A@mail.gmail.com>
2017-01-01 0:00 ` Rafael Avila de Espindola
2017-01-01 0:00 ` David Edelsohn
2017-01-01 0:00 ` Suprateeka R Hegde
2017-01-01 0:00 ` Florian Weimer
2017-01-01 0:00 ` Suprateeka R Hegde
2017-01-01 0:00 ` Sriraman Tallam via gnu-gabi
2017-01-01 0:00 ` Rahul Chaudhry via gnu-gabi
2017-01-01 0:00 ` Florian Weimer
2017-01-01 0:00 ` Sriraman Tallam via gnu-gabi
2017-01-01 0:00 ` Rahul Chaudhry via gnu-gabi
[not found] ` <CAORpzuMftCGpXUObOyoFY0=jorMBDWEDbQJ23DifTNW3v-WA6Q@mail.gmail.com>
2017-01-01 0:00 ` Rahul Chaudhry via gnu-gabi
2017-01-01 0:00 ` Cary Coutant
2017-01-01 0:00 ` Rahul Chaudhry via gnu-gabi
[not found] ` <CAORpzuPYsSBJtypm3NDcfcgRzos3WO4JjkvgiqpyBYBhoqLVFA@mail.gmail.com>
2018-01-01 0:00 ` Florian Weimer
2017-01-01 0:00 ` Cary Coutant
2017-01-01 0:00 ` Rahul Chaudhry via gnu-gabi
2017-01-01 0:00 ` Rahul Chaudhry via gnu-gabi
2017-01-01 0:00 ` Ian Lance Taylor via gnu-gabi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAMe9rOrvwKmWLr5x1V-9s8hukGAkOaZoRyzWMNr8-2_GNJqvuA@mail.gmail.com \
--to=hjl.tools@gmail.com \
--cc=binutils@sourceware.org \
--cc=ccoutant@gmail.com \
--cc=davidxl@google.com \
--cc=gnu-gabi@sourceware.org \
--cc=iant@google.com \
--cc=llozano@google.com \
--cc=pcc@google.com \
--cc=ppluzhnikov@google.com \
--cc=rafael.espindola@gmail.com \
--cc=rahulchaudhry@google.com \
--cc=ruiu@google.com \
--cc=saugustine@google.com \
--cc=tmsriram@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).