[llvm-dev] Embedding LLD version to executables

Hal Finkel via llvm-dev llvm-dev at lists.llvm.org
Tue Oct 18 21:43:02 PDT 2016


----- Original Message -----

> From: "Mehdi Amini" <mehdi.amini at apple.com>
> To: "Hal Finkel" <hfinkel at anl.gov>
> Cc: "llvm-dev" <llvm-dev at lists.llvm.org>, "Rui Ueyama"
> <ruiu at google.com>
> Sent: Tuesday, October 18, 2016 11:35:02 PM
> Subject: Re: [llvm-dev] Embedding LLD version to executables

> > On Oct 18, 2016, at 9:27 PM, Hal Finkel < hfinkel at anl.gov > wrote:
> 

> > ----- Original Message -----
> 

> > > From: "Mehdi Amini" < mehdi.amini at apple.com >
> > 
> 
> > > To: "Hal Finkel" < hfinkel at anl.gov >
> > 
> 
> > > Cc: "llvm-dev" < llvm-dev at lists.llvm.org >, "Rui Ueyama" <
> > > ruiu at google.com >
> > 
> 
> > > Sent: Tuesday, October 18, 2016 10:38:57 PM
> > 
> 
> > > Subject: Re: [llvm-dev] Embedding LLD version to executables
> > 
> 

> > > > On Oct 18, 2016, at 8:30 PM, Hal Finkel < hfinkel at anl.gov >
> > > > wrote:
> > > 
> > 
> 

> > > > ----- Original Message -----
> > > 
> > 
> 

> > > > > From: "Mehdi Amini via llvm-dev" < llvm-dev at lists.llvm.org >
> > > > 
> > > 
> > 
> 
> > > > > To: "Rui Ueyama" < ruiu at google.com >
> > > > 
> > > 
> > 
> 
> > > > > Cc: "llvm-dev" < llvm-dev at lists.llvm.org >
> > > > 
> > > 
> > 
> 
> > > > > Sent: Tuesday, October 18, 2016 10:22:00 PM
> > > > 
> > > 
> > 
> 
> > > > > Subject: Re: [llvm-dev] Embedding LLD version to executables
> > > > 
> > > 
> > 
> 

> > > > > > On Oct 18, 2016, at 6:44 PM, Rui Ueyama via llvm-dev
> > > > > 
> > > > 
> > > 
> > 
> 
> > > > > > < llvm-dev at lists.llvm.org > wrote:
> > > > > 
> > > > 
> > > 
> > 
> 

> > > > > > I'd like to make LLD embed version information so that we
> > > > > > can
> > > > > 
> > > > 
> > > 
> > 
> 
> > > > > > determine if an executable was created by LLD and if that's
> > > > > > the
> > > > > 
> > > > 
> > > 
> > 
> 
> > > > > > case which version of LLD.
> > > > > 
> > > > 
> > > 
> > 
> 

> > > > > Pardon my ignorance, but what’s the motivation?
> > > > 
> > > 
> > 
> 

> > > > > We don’t embed the clang version in every binary clang
> > > > > generates
> > > > > for
> > > > 
> > > 
> > 
> 
> > > > > instance.
> > > > 
> > > 
> > 
> 

> > > > We do. Clang outputs an "ident" comment with its version
> > > > information,
> > > > and that ends up in the object files (at least on Linux).
> > > 
> > 
> 

> > > Interesting, we don’t on Darwin:
> > 
> 

> > > $ echo "int main() {}" | clang -x c -o - - -S | grep clang
> > 
> 
> > > $ echo "int main() {}" | clang -x c -o - - -S -target
> > > x86_64-pc-linux-gnu | grep clang .ident "Apple LLVM version 8.0.0
> > > (clang-800.0.42.1)”
> > 
> 

> > > Dos it show up in the final binary?
> > 
> 
> > Yes
> 

> > > If yes, how does it behave when you mix-and-match versions in
> > > different .o?
> > 
> 
> > I see both versions in the final binary.
> 

> Pretty cool! Thanks for looking.

> Is there a trace in the binary the list of object files for each
> version? I guess that’d be more costly to store.
As far as I can tell, the version strings all get concatenated in the .comment section of the resulting executable. The strings are null-terminated, and so there is a null byte separating the strings. For example, objdump -x -s shows this from my test: 

Contents of section .comment: 
0000 4743433a 2028474e 55292034 2e382e35 GCC: (GNU) 4.8.5 
0010 20323031 35303632 33202852 65642048 20150623 (Red H 
0020 61742034 2e382e35 2d342900 636c616e at 4.8.5-4).clan 
0030 67207665 7273696f 6e20342e 302e3020 g version 4.0.0 
0040 28687474 703a2f2f 6c6c766d 2e6f7267 (http://llvm.org 
0050 2f676974 2f636c61 6e672e67 69742036 /git/clang.git 6 
0060 31653732 36613362 63633664 34633262 1e726a3bcc6d4c2b 
0070 35346330 30366337 61623762 31316133 54c006c7ab7b11a3 
0080 33613034 32613629 20286874 74703a2f 3a042a6) (http:/ 
0090 2f6c6c76 6d2e6f72 672f6769 742f6c6c /llvm.org/git/ll 
00a0 766d2e67 69742061 62383338 37303961 vm.git ab838709a 
00b0 63356330 35623262 36393031 65366630 c5c05b2b6901e6f0 
00c0 65303964 65613561 35356636 36333729 e09dea5a55f6637) 
00d0 00636c61 6e672076 65727369 6f6e2033 .clang version 3 
00e0 2e392e30 20286874 74703a2f 2f6c6c76 .9.0 (http://llv 
00f0 6d2e6f72 672f6769 742f636c 616e672e m.org/git/clang. 
0100 67697420 30373330 37663935 64356338 git 07307f95d5c8 
0110 32643435 33636463 35633233 66396363 2d453cdc5c23f9cc 
0120 64353364 35666637 35343236 29202868 d53d5ff75426) (h 
0130 7474703a 2f2f6c6c 766d2e6f 72672f67 ttp://llvm.org/g 
0140 69742f6c 6c766d2e 67697420 30333136 it/llvm.git 0316 
0150 66303235 64616234 36643737 36646565 f025dab46d776dee 
0160 37306433 62363935 65316130 37646235 70d3b695e1a07db5 
0170 33373163 2900 371c). 

-Hal 

>> Mehdi
> > > Also I’m still not sure why doing this?
> > 
> 

> > > —
> > 
> 
> > > Mehdi
> > 
> 

> > > > > > ld.bfd doesn't seem to embed any information, so we cannot
> > > > > > tell
> > > > > 
> > > > 
> > > 
> > 
> 
> > > > > > whether an executable was linked by ld.bfd or not easily.
> > > > > 
> > > > 
> > > 
> > 
> 

> > > > > > ld.gold embeds a string "GNU gold <version>" as
> > > > > 
> > > > 
> > > 
> > 
> 
> > > > > > ".note.gnu.gold-version" section contents.
> > > > > 
> > > > 
> > > 
> > 
> 

> > > > > > I'm wondering what we should do for LLD. The gold's way
> > > > > > seems
> > > > > 
> > > > 
> > > 
> > 
> 
> > > > > > almost right, but I think we don't want to use the same
> > > > > > section
> > > > > 
> > > > 
> > > 
> > 
> 
> > > > > > name because it contains "gold" as part of the section
> > > > > > name.
> > > > > 
> > > > 
> > > 
> > 
> 
> > > > > > However, at the same time, I don't believe we want to
> > > > > > create
> > > > > 
> > > > 
> > > 
> > 
> 
> > > > > > ".note.gnu.lld-version", because if we do, all programs
> > > > > > that
> > > > > 
> > > > 
> > > 
> > 
> 
> > > > > > determine linker version need to look at
> > > > > 
> > > > 
> > > 
> > 
> 
> > > > > > ".note.gnu.<linker-name>-version" for all known linkers.
> > > > > > That's
> > > > > 
> > > > 
> > > 
> > 
> 
> > > > > > absurd. (Also, our product is not GNU, so ".gnu" part is
> > > > > > probably
> > > > > 
> > > > 
> > > 
> > 
> 
> > > > > > irrelevant.)
> > > > > 
> > > > 
> > > 
> > 
> 

> > > > > > I'm leaning towards ".note.linker-version" in hope that
> > > > > > other
> > > > > 
> > > > 
> > > 
> > 
> 
> > > > > > linkers follow it.
> > > > > 
> > > > 
> > > 
> > 
> 

> > > > > At least that would look much better than a .gnu.xxxx
> > > > 
> > > 
> > 
> 

> > > > I agree.
> > > 
> > 
> 

> > > > -Hal
> > > 
> > 
> 

> > > > > —
> > > > 
> > > 
> > 
> 
> > > > > Mehdi
> > > > 
> > > 
> > 
> 

> > > > > _______________________________________________
> > > > 
> > > 
> > 
> 
> > > > > LLVM Developers mailing list
> > > > 
> > > 
> > 
> 
> > > > > llvm-dev at lists.llvm.org
> > > > 
> > > 
> > 
> 
> > > > > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> > > > 
> > > 
> > 
> 

> > > > --
> > > 
> > 
> 
> > > > Hal Finkel
> > > 
> > 
> 
> > > > Lead, Compiler Technology and Programming Languages
> > > 
> > 
> 
> > > > Leadership Computing Facility
> > > 
> > 
> 
> > > > Argonne National Laboratory
> > > 
> > 
> 
> > --
> 

> > Hal Finkel
> 
> > Lead, Compiler Technology and Programming Languages
> 
> > Leadership Computing Facility
> 
> > Argonne National Laboratory
> 

-- 

Hal Finkel 
Lead, Compiler Technology and Programming Languages 
Leadership Computing Facility 
Argonne National Laboratory 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20161018/308f3d03/attachment-0001.html>


More information about the llvm-dev mailing list