[llvm-dev] LLD's default --build-id choice

Rui Ueyama via llvm-dev llvm-dev at lists.llvm.org
Wed Jun 1 15:41:08 PDT 2016

On Wed, Jun 1, 2016 at 3:32 PM, Rafael EspĂ­ndola <rafael.espindola at gmail.com
> wrote:

> On 1 June 2016 at 15:21, Rui Ueyama via llvm-dev
> <llvm-dev at lists.llvm.org> wrote:
> > Nico brought up this topic and made me think whether the current choice
> of
> > --build-id was the right one or not.
> >
> > Currently, we compute a FNV1 hash for an entire resulting file and store
> it
> > to .note.gnu.build-id section. It's one of the slowest parts of the
> linker
> > because reading every byte takes time. IIRC, it usually takes about 10%
> of
> > total link time.
> >
> > In the first place, I believe it was not a good decision to make GCC (and
> > therefore Clang) to pass --build-id option to the linker by default (it
> was
> > done in 2009). Build ID is sometimes useful, particularly when
> distributing
> > linked objects to users, but in most cases it is not needed. Spending 10%
> > more time on usual build-link-debug cycle is a waste of time. It should
> not
> > have been added that casually.
> >
> > Anyways, the option is there and passed to the linker, so we have to
> create
> > and add a build ID if --build-id option is given (we could ignore the
> option
> > but that's probably very confusing.)
> >
> > So here's my proposal.
> >
> >  - Make --build-id=uuid as default for --build-id
> >
> > --build-id=uuid sets build-id to a random unique value. It's very fast.
> > Instead, it breaks build reproducibility because every build has a unique
> > build ID. But if you want build reproducibility, you can explicitly pass
> > --build-id=sha1.
> Please don't, reproducible builds are *really* important.
> Note that you can disable build-id with -Wl,--build-id=none.
> Maybe make the default an even simpler hash? Or hash just parts of the
> file?

I think FNV1 is very fast hash function, so we cannot make it faster by
replacing it with some other hash function.

We could hash only some part of the file, say the first page of an
executable. In that way, there's a risk that two executables with the same
build ID are actually different if they have idential ELF headers, but is
it going to be a problem?

> I would also be open to just changing clang to not pass --build-id by
> default.

I'd be very happy if we do it.

> Cheers,
> Rafael
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160601/19d3fe76/attachment.html>

More information about the llvm-dev mailing list