<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><br></div><div class="gmail_quote">On Wed, Jun 1, 2016 at 3:32 PM, Rafael Espíndola <span dir="ltr"><<a href="mailto:rafael.espindola@gmail.com">rafael.espindola@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">On 1 June 2016 at 15:21, Rui Ueyama via llvm-dev<br>
<div><div class="gmail-h5"><<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br>
> Nico brought up this topic and made me think whether the current choice of<br>
> --build-id was the right one or not.<br>
><br>
> Currently, we compute a FNV1 hash for an entire resulting file and store it<br>
> to .note.gnu.build-id section. It's one of the slowest parts of the linker<br>
> because reading every byte takes time. IIRC, it usually takes about 10% of<br>
> total link time.<br>
><br>
> In the first place, I believe it was not a good decision to make GCC (and<br>
> therefore Clang) to pass --build-id option to the linker by default (it was<br>
> done in 2009). Build ID is sometimes useful, particularly when distributing<br>
> linked objects to users, but in most cases it is not needed. Spending 10%<br>
> more time on usual build-link-debug cycle is a waste of time. It should not<br>
> have been added that casually.<br>
><br>
> Anyways, the option is there and passed to the linker, so we have to create<br>
> and add a build ID if --build-id option is given (we could ignore the option<br>
> but that's probably very confusing.)<br>
><br>
> So here's my proposal.<br>
><br>
>  - Make --build-id=uuid as default for --build-id<br>
><br>
> --build-id=uuid sets build-id to a random unique value. It's very fast.<br>
> Instead, it breaks build reproducibility because every build has a unique<br>
> build ID. But if you want build reproducibility, you can explicitly pass<br>
> --build-id=sha1.<br>
<br>
</div></div>Please don't, reproducible builds are *really* important.<br>
<br>
Note that you can disable build-id with -Wl,--build-id=none.<br>
<br>
Maybe make the default an even simpler hash? Or hash just parts of the file?<br></blockquote><div><br></div><div>I think FNV1 is very fast hash function, so we cannot make it faster by replacing it with some other hash function.</div><div><br></div><div>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?</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<br>
I would also be open to just changing clang to not pass --build-id by default.<br></blockquote><div><br></div><div>I'd be very happy if we do it.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<br>
Cheers,<br>
Rafael<br>
</blockquote></div><br></div></div>