2017-04-20 10 views
2

clangを使って簡単なhello worldプログラムをコンパイルすると、elf64ファイルのコメントにGCCに関する情報があります。どうして?私はgccではなくclangを使用しています。clangがgccを使用しているようです

私はubuntu 16.04を使用しています。

[email protected]:~$ clang++ -stdlib=libc++ test.cpp 
[email protected]:~$ objdump --full-contents --section=.comment a.out 

a.out:  file format elf64-x86-64 

Contents of section .comment: 
0000 4743433a 20285562 756e7475 20352e34 GCC: (Ubuntu 5.4 
0010 2e302d36 7562756e 7475317e 31362e30 .0-6ubuntu1~16.0 
0020 342e3429 20352e34 2e302032 30313630 4.4) 5.4.0 20160 
0030 36303900 636c616e 67207665 7273696f 609.clang versio 
0040 6e20342e 302e3020 28746167 732f5245 n 4.0.0 (tags/RE 
0050 4c454153 455f3430 302f6669 6e616c29 LEASE_400/final) 
0060 00         .    
[email protected]:~$ 

TEST.CPPは次のとおりです。

#include <iostream> 

int main(int argc, char* argv[]) 
{ 
std::cout << argc << std::endl; 

return 0; 
} 

私も

[email protected]:~$ sudo update-alternatives --config c++ 
[sudo] password for username: 
There are 2 choices for the alternative c++ (providing /usr/bin/c++). 

    Selection Path      Priority Status 
------------------------------------------------------------ 
    0   /usr/bin/g++    20  auto mode 
* 1   /usr/bin/clang++-libc++ 5   manual mode 
    2   /usr/bin/g++    20  manual mode 

Press <enter> to keep the current choice[*], or type selection number: 
[email protected]:~$ 

を走ったこのOKですか?どうして?

+1

また、clangソースコードもチェックする必要があります。それはかなり面白いです;) – Igor

答えて

2

これは、GCCでビルドされたCランタイム(Glibc製)とリンクしているためです。リンカーは、これら2つをマージしているからです。

$ clang++ -c --stdlib=libc++ test.cpp 
$ objdump --full-contents --section=.comment test.o 

test.o:  file format elf64-x86-64 

Contents of section .comment: 
0000 00636c61 6e672076 65727369 6f6e2034 .clang version 4 
0010 2e302e30 20287461 67732f52 454c4541 .0.0 (tags/RELEA 
0020 53455f34 30302f66 696e616c 2900  SE_400/final). 
$ clang++ --verbose test.o 
"/usr/bin/ld" --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o a.out /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../lib64/crt1.o /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../lib64/crti.o /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/crtbegin.o -L/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1 -L/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../lib64 -L/usr/bin/../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../.. -L/usr/bin/../lib -L/lib -L/usr/lib test.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/crtend.o /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../lib64/crtn.o 
$ objdump --full-contents --section=.comment /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../lib64/crt1.o 

/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../lib64/crt1.o:  file format elf64-x86-64 

Contents of section .comment: 
0000 00474343 3a202847 4e552920 362e332e .GCC: (GNU) 6.3. 
0010 31203230 31373033 303600    1 20170306.  
$ objdump --full-contents --section=.comment a.out 

a.out:  file format elf64-x86-64 

Contents of section .comment: 
0000 4743433a 2028474e 55292036 2e332e31 GCC: (GNU) 6.3.1 
0010 20323031 37303330 3600636c 616e6720 20170306.clang 
0020 76657273 696f6e20 342e302e 30202874 version 4.0.0 (t 
0030 6167732f 52454c45 4153455f 3430302f ags/RELEASE_400/ 
0040 66696e61 6c2900      final).   

私のシステムはあなたとは少し異なるバージョンを持っていますが、あなたはクランにコンパイルされたオブジェクトが、それだけでクラン識別子を持っていることがわかります、Cランタイムオブジェクトは、その中のGCC識別子を持ち、最終的なバイナリを持っていますどちらも。

関連する問題