<?xml version="1.0" encoding="UTF-8" ?>

<bugzilla version="5.2"
          urlbase="https://bugzilla.altlinux.org/"
          
          maintainer="jenya@basealt.ru"
>

    <bug>
          <bug_id>35018</bug_id>
          
          <creation_ts>2018-06-11 03:58:01 +0300</creation_ts>
          <short_desc>Статические библиотеки libclang*.a не содержат ELF объектов, а содержат LLVM IR bitcode</short_desc>
          <delta_ts>2018-06-13 05:57:31 +0300</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>4</classification_id>
          <classification>Development</classification>
          <product>Sisyphus</product>
          <component>clang6.0-devel-static</component>
          <version>unstable</version>
          <rep_platform>x86_64</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>CLOSED</bug_status>
          <resolution>DUPLICATE</resolution>
          <dup_id>34801</dup_id>
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P3</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>35026</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Vitaly Chikunov">vt</reporter>
          <assigned_to name="Konstantin A Lepikhov (L.A. Kostis)">lakostis</assigned_to>
          <cc>glebfm</cc>
    
    <cc>ldv</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>171816</commentid>
    <comment_count>0</comment_count>
    <who name="Vitaly Chikunov">vt</who>
    <bug_when>2018-06-11 03:58:01 +0300</bug_when>
    <thetext>При сборке bcc выяснилось, что GNU ld не может линковать с библиотеками /usr/lib64/libclang*.a так как не понимает объектов внутри них.

[ 52%] Linking CXX shared library libbcc.so
/usr/lib64/gcc/x86_64-alt-linux/7/../../../../lib64/libclangFrontend.a: member /usr/lib64/gcc/x86_64-alt-linux/7/../../../../lib64/libclangFrontend.a(ASTConsumers.cpp.o) in archive is not an object
collect2: error: ld returned 1 exit status

[builder@localhost t]$ ar xv /usr/lib64/gcc/x86_64-alt-linux/7/../../../../lib64/libclangFrontend.a ASTConsumers.cpp.o
x - ASTConsumers.cpp.o

[builder@localhost t]$ file ASTConsumers.cpp.o
ASTConsumers.cpp.o: data

[builder@localhost t]$ objdump -x ASTConsumers.cpp.o
objdump: ASTConsumers.cpp.o: File format not recognized

[builder@localhost t]$ xxd ASTConsumers.cpp.o|head -2
00000000: 4243 c0de 3514 0000 0500 0000 620c 3024  BC..5.......b.0$
00000010: 4959 bea6 eed3 3e2d 4401 3205 0000 0000  IY....&gt;-D.2.....

[builder@localhost t]$ ld CoverageMapping.cpp.o
CoverageMapping.cpp.o: file not recognized: File format not recognized

[builder@localhost t]$ ld --whole-archive /usr/lib64/libclangFrontend.a
/usr/lib64/libclangFrontend.a: member /usr/lib64/libclangFrontend.a(ASTConsumers.cpp.o) in archive is not an object


Для сравнения, file с дебиана распознает такой файл как &quot;LLVM IR bitcode&quot;. В то время как аналогичный файл на дебиане (из /usr/lib/llvm-3.9/lib/libclangFrontend.a из пакета libclang-3.9-dev) это ELF:

debian9:~/x$ ar xv /usr/lib/llvm-3.9/lib/libclangFrontend.a ASTConsumers.cpp.o
x - ASTConsumers.cpp.o

debian9:~/x$ file ASTConsumers.cpp.o
ASTConsumers.cpp.o: ELF 64-bit LSB relocatable, x86-64, version 1 (GNU/Linux), not stripped

debian9:~/x$ ld CoverageMapping.cpp.o  ... и ...
debian9:~/x$ ld --whole-archive /usr/lib/llvm-3.9/lib/libclangFrontend.a
...пишут кучу ошибок линковки, следовательно, ld понимает этот архив.

ps. К слову, с библиотеками libLLVM*.a то же самое:

[builder@localhost t]$ ld --whole-archive /usr/lib64/libLLVMCoverage.a
/usr/lib64/libLLVMCoverage.a: member /usr/lib64/libLLVMCoverage.a(CoverageMapping.cpp.o) in archive is not an object</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171821</commentid>
    <comment_count>1</comment_count>
    <who name="Vitaly Chikunov">vt</who>
    <bug_when>2018-06-11 12:55:04 +0300</bug_when>
    <thetext>Приходится обходить проблему сборки под gcc+ld таким трюком:

mkdir -p /usr/src/bin
cat &gt; /usr/src/bin/ld &lt;&lt;&apos;EOF&apos;
#!/bin/bash
if [[ &quot;$*&quot; =~ (libclang|libLLVM)[^\ ]*.a ]]; then
       o=${@//--push-state}
       o=${o//--pop-state}
       set -- $o
       exec /usr/bin/ld.lld &quot;$@&quot;
else
       exec /usr/bin/ld &quot;$@&quot;
fi
EOF
chmod a+x /usr/src/bin/ld

%cmake_build</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171825</commentid>
    <comment_count>2</comment_count>
    <who name="Konstantin A Lepikhov (L.A. Kostis)">lakostis</who>
    <bug_when>2018-06-11 23:54:01 +0300</bug_when>
    <thetext>см. пример с castxml. GNU ld это неправильный выбор в случае статической линковки с clang-devel-static. Либо используйте lld либо линкуйтесь динамически.

*** This bug has been marked as a duplicate of bug 34801 ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171827</commentid>
    <comment_count>3</comment_count>
    <who name="Vitaly Chikunov">vt</who>
    <bug_when>2018-06-12 00:01:01 +0300</bug_when>
    <thetext>lld не поддерживает опции --push-state --pop-state которые шлет gcc. Кроме того, вылазит ошибка &quot;error: bcc.o: string table non-null terminated&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171829</commentid>
    <comment_count>4</comment_count>
    <who name="Konstantin A Lepikhov (L.A. Kostis)">lakostis</who>
    <bug_when>2018-06-12 00:46:01 +0300</bug_when>
    <thetext>(In reply to comment #3)
&gt; lld не поддерживает опции --push-state --pop-state которые шлет gcc. Кроме
&gt; того, вылазит ошибка &quot;error: bcc.o: string table non-null terminated&quot;.

У вас есть пример кода и проект, где есть реальная потребность использовать clang static libs специфические флаги gcc?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171830</commentid>
    <comment_count>5</comment_count>
    <who name="Vitaly Chikunov">vt</who>
    <bug_when>2018-06-12 01:41:54 +0300</bug_when>
    <thetext>Не понял вопроса. Флаги (опции) шлёт gcc линкеру, не я. Кроме того, при линковке lld на некоторых файлах ошибка &quot;error: bcc.o: string table non-null terminated&quot;. То есть, ни чистым ld, ни чистым lld пакет bcc собрать нельзя. Пакет я собрал с враппером из Comment #1, который вызывает то ld, то lld в зависимости от того что линкуется. (Я попробую переделать сборку на clang, позже.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171831</commentid>
    <comment_count>6</comment_count>
    <who name="Konstantin A Lepikhov (L.A. Kostis)">lakostis</who>
    <bug_when>2018-06-12 01:54:36 +0300</bug_when>
    <thetext>(In reply to comment #5)
&gt; Не понял вопроса. Флаги (опции) шлёт gcc линкеру, не я. Кроме того, при
&gt; линковке lld на некоторых файлах ошибка &quot;error: bcc.o: string table non-null
&gt; terminated&quot;. То есть, ни чистым ld, ни чистым lld пакет bcc собрать нельзя.
&gt; Пакет я собрал с враппером из Comment #1, который вызывает то ld, то lld в
&gt; зависимости от того что линкуется. (Я попробую переделать сборку на clang,
&gt; позже.)

Вы какой-то пакет собираете? Можно узнать какой или это секрет?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171832</commentid>
    <comment_count>7</comment_count>
    <who name="Vitaly Chikunov">vt</who>
    <bug_when>2018-06-12 01:57:07 +0300</bug_when>
    <thetext>bcc http://git.altlinux.org/tasks/208269/gears/200/git</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171838</commentid>
    <comment_count>8</comment_count>
    <who name="Vitaly Chikunov">vt</who>
    <bug_when>2018-06-13 03:54:07 +0300</bug_when>
    <thetext>Update. Использование clang вместо gcc никак не влияет на результат.

1. При использовании ld сборка обрывается на:

[ 69%] Linking CXX shared library libbcc.so
cd /usr/src/RPM/BUILD/bcc-v0.5.0/BUILD/src/cc &amp;&amp; /usr/bin/cmake -E cmake_link_script CMakeFiles/bcc-shared.dir/link.txt --verbose=1
/usr/bin/clang++ -fPIC -pipe -Wall -g -O2 -Wall  -fno-rtti -fPIC -DBCC_PROG_TAG_DIR=&apos;&quot;/var/tmp/bcc&quot;&apos; -DLLVM_MAJOR_VERSION=6 -O2 -g -DNDEBUG   -Wl,--exclude-lib
s=libclangFrontend.a -Wl,--exclude-libs=libclangSerialization.a -Wl,--exclude-libs=libclangDriver.a -Wl,--exclude-libs=libclangParse.a -Wl,--exclude-libs=libcl
angSema.a -Wl,--exclude-libs=libclangCodeGen.a -Wl,--exclude-libs=libclangAnalysis.a -Wl,--exclude-libs=libclangRewrite.a -Wl,--exclude-libs=libclangEdit.a -Wl
,--exclude-libs=libclangAST.a -Wl,--exclude-libs=libclangLex.a -Wl,--exclude-libs=libclangBasic.a  -Wl,--exclude-libs=libLLVMBPFDisassembler.a -Wl,--exclude-li
bs=libLLVMBPFAsmParser.a -Wl,--exclude-libs=libLLVMCoroutines.a -Wl,--exclude-libs=libLLVMCoverage.a -Wl,--exclude-libs=libLLVMLTO.a -Wl,--exclude-libs=libLLVM
X86CodeGen.a -Wl,--exclude-libs=libLLVMX86Desc.a -Wl,--exclude-libs=libLLVMX86Info.a -Wl,--exclude-libs=libLLVMMCDisassembler.a -Wl,--exclude-libs=libLLVMX86AsmPrinter.a -Wl,--exclude-libs=libLLVMX86Utils.a -Wl,--exclude-libs=libLLVMGlobalISel.a -Wl,--exclude-libs=libLLVMPasses.a -Wl,--exclude-libs=libLLVMipo.a -Wl,--exclude-libs=libLLVMVectorize.a -Wl,--exclude-libs=libLLVMInstrumentation.a -Wl,--exclude-libs=libLLVMOption.a -Wl,--exclude-libs=libLLVMObjCARCOpts.a -Wl,--exclude-libs=libLLVMMCJIT.a -Wl,--exclude-libs=libLLVMExecutionEngine.a -Wl,--exclude-libs=libLLVMRuntimeDyld.a -Wl,--exclude-libs=libLLVMLinker.a -Wl,--exclude-libs=libLLVMIRReader.a -Wl,--exclude-libs=libLLVMAsmParser.a -Wl,--exclude-libs=libLLVMDebugInfoDWARF.a -Wl,--exclude-libs=libLLVMBPFCodeGen.a -Wl,--exclude-libs=libLLVMSelectionDAG.a -Wl,--exclude-libs=libLLVMBPFDesc.a -Wl,--exclude-libs=libLLVMBPFInfo.a -Wl,--exclude-libs=libLLVMBPFAsmPrinter.a -Wl,--exclude-libs=libLLVMAsmPrinter.a -Wl,--exclude-libs=libLLVMDebugInfoCodeView.a -Wl,--exclude-libs=libLLVMDebugInfoMSF.a -Wl,--exclude-libs=libLLVMCodeGen.a -Wl,--exclude-libs=libLLVMTarget.a -Wl,--exclude-libs=libLLVMScalarOpts.a -Wl,--exclude-libs=libLLVMInstCombine.a -Wl,--exclude-libs=libLLVMTransformUtils.a -Wl,--exclude-libs=libLLVMBitWriter.a -Wl,--exclude-libs=libLLVMAnalysis.a -Wl,--exclude-libs=libLLVMProfileData.a -Wl,--exclude-libs=libLLVMObject.a -Wl,--exclude-libs=libLLVMMCParser.a -Wl,--exclude-libs=libLLVMMC.a -Wl,--exclude-libs=libLLVMBitReader.a -Wl,--exclude-libs=libLLVMCore.a -Wl,--exclude-libs=libLLVMBinaryFormat.a -Wl,--exclude-libs=libLLVMSupport.a -Wl,--exclude-libs=libLLVMDemangle.a -shared -Wl,-soname,libbcc.so.0 -o libbcc.so.v0.5.0 CMakeFiles/bcc-shared.dir/link_all.cc.o CMakeFiles/bcc-shared.dir/bpf_common.cc.o CMakeFiles/bcc-shared.dir/bpf_module.cc.o CMakeFiles/bcc-shared.dir/exported_files.cc.o CMakeFiles/bcc-shared.dir/bcc_debug.cc.o CMakeFiles/bcc-shared.dir/table_storage.cc.o CMakeFiles/bcc-shared.dir/shared_table.cc.o CMakeFiles/bcc-shared.dir/bpffs_table.cc.o CMakeFiles/bcc-shared.dir/json_map_decl_visitor.cc.o CMakeFiles/bcc-shared.dir/bcc_syms.cc.o CMakeFiles/bcc-shared.dir/bcc_elf.c.o CMakeFiles/bcc-shared.dir/bcc_perf_map.c.o CMakeFiles/bcc-shared.dir/bcc_proc.c.o CMakeFiles/bcc-shared.dir/ns_guard.cc.o CMakeFiles/bcc-shared.dir/common.cc.o frontends/b/libb_frontend.a frontends/clang/libclang_frontend.a libbpf.a -Wl,--whole-archive -Wl,-Bstatic -lclangFrontend -lclangSerialization -lclangDriver -lclangParse -lclangSema -lclangCodeGen -lclangAnalysis -lclangRewrite -lclangEdit -lclangAST -lclangLex -lclangBasic /usr/lib64/libLLVMBPFDisassembler.a /usr/lib64/libLLVMBPFAsmParser.a /usr/lib64/libLLVMCoroutines.a /usr/lib64/libLLVMCoverage.a /usr/lib64/libLLVMLTO.a /usr/lib64/libLLVMX86CodeGen.a /usr/lib64/libLLVMX86Desc.a /usr/lib64/libLLVMX86Info.a /usr/lib64/libLLVMMCDisassembler.a /usr/lib64/libLLVMX86AsmPrinter.a /usr/lib64/libLLVMX86Utils.a /usr/lib64/libLLVMGlobalISel.a /usr/lib64/libLLVMPasses.a /usr/lib64/libLLVMipo.a /usr/lib64/libLLVMVectorize.a /usr/lib64/libLLVMInstrumentation.a /usr/lib64/libLLVMOption.a /usr/lib64/libLLVMObjCARCOpts.a /usr/lib64/libLLVMMCJIT.a /usr/lib64/libLLVMExecutionEngine.a /usr/lib64/libLLVMRuntimeDyld.a /usr/lib64/libLLVMLinker.a /usr/lib64/libLLVMIRReader.a /usr/lib64/libLLVMAsmParser.a /usr/lib64/libLLVMDebugInfoDWARF.a /usr/lib64/libLLVMBPFCodeGen.a /usr/lib64/libLLVMSelectionDAG.a /usr/lib64/libLLVMBPFDesc.a /usr/lib64/libLLVMBPFInfo.a /usr/lib64/libLLVMBPFAsmPrinter.a /usr/lib64/libLLVMAsmPrinter.a /usr/lib64/libLLVMDebugInfoCodeView.a /usr/lib64/libLLVMDebugInfoMSF.a /usr/lib64/libLLVMCodeGen.a /usr/lib64/libLLVMTarget.a /usr/lib64/libLLVMScalarOpts.a /usr/lib64/libLLVMInstCombine.a /usr/lib64/libLLVMTransformUtils.a /usr/lib64/libLLVMBitWriter.a /usr/lib64/libLLVMAnalysis.a /usr/lib64/libLLVMProfileData.a /usr/lib64/libLLVMObject.a /usr/lib64/libLLVMMCParser.a /usr/lib64/libLLVMMC.a /usr/lib64/libLLVMBitReader.a /usr/lib64/libLLVMCore.a /usr/lib64/libLLVMBinaryFormat.a /usr/lib64/libLLVMSupport.a /usr/lib64/libLLVMDemangle.a -Wl,-Bdynamic -Wl,--no-whole-archive -lelf -Wl,--whole-archive api/libapi-static.a -Wl,--no-whole-archive usdt/libusdt-static.a -lz -lrt -ldl -ltinfo -lpthread -lm
/usr/bin/../lib64/gcc/x86_64-alt-linux/7/../../../../lib64/libclangFrontend.a: member /usr/bin/../lib64/gcc/x86_64-alt-linux/7/../../../../lib64/libclangFrontend.a(ASTConsumers.cpp.o) in archive is not an object
clang-6.0: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [src/cc/CMakeFiles/bcc-shared.dir/build.make:361: src/cc/libbcc.so.v0.5.0] Error 1

Очень быстрые библиотеки не собираются медленным ld.

2. При использовании ld.lld сборка обрывается на:

cd /usr/src/RPM/BUILD/bcc-v0.5.0/BUILD/src/lua &amp;&amp; /usr/bin/cmake -E cmake_link_script CMakeFiles/bcc-lua.dir/link.txt --verbose=1
/usr/bin/clang -pipe -Wall -g -O2 -Wall -O2 -g -DNDEBUG  -fuse-ld=lld -rdynamic CMakeFiles/bcc-lua.dir/src/main.c.o bcc.o  -o bcc-lua -lluajit-5.1 -nopie
/usr/bin/ld.lld: error: bcc.o: string table non-null terminated
clang-6.0: error: linker command failed with exit code 1 (use -v to see invocation)

Перезапуск с -v:

/usr/bin/clang -pipe -Wall -g -O2 -Wall -O2 -g -DNDEBUG  -fuse-ld=lld -rdynamic CMakeFiles/bcc-lua.dir/src/main.c.o bcc.o  -o bcc-lua -lluajit-5.1 -nopie -v
clang version 6.0.0
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/i586-alt-linux/7
Found candidate GCC installation: /usr/bin/../lib64/gcc/x86_64-alt-linux/7
Found candidate GCC installation: /usr/lib/gcc/i586-alt-linux/7
Found candidate GCC installation: /usr/lib64/gcc/x86_64-alt-linux/7
Selected GCC installation: /usr/bin/../lib64/gcc/x86_64-alt-linux/7
Candidate multilib: .;@m64
Selected multilib: .;@m64
 &quot;/usr/bin/ld.lld&quot; -export-dynamic --eh-frame-hdr -m elf_x86_64 -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o bcc-lua /usr/bin/../lib64/gcc/x86_64-alt-linux/7/../../../../lib64/crt1.o /usr/bin/../lib64/gcc/x86_64-alt-linux/7/../../../../lib64/crti.o /usr/bin/../lib64/gcc/x86_64-alt-linux/7/crtbegin.o -L/usr/bin/../lib64/gcc/x86_64-alt-linux/7 -L/usr/bin/../lib64/gcc/x86_64-alt-linux/7/../../../../lib64 -L/usr/bin/../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/bin/../lib64/gcc/x86_64-alt-linux/7/../../.. -L/usr/bin/../lib -L/lib -L/usr/lib CMakeFiles/bcc-lua.dir/src/main.c.o bcc.o -lluajit-5.1 -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/bin/../lib64/gcc/x86_64-alt-linux/7/crtend.o /usr/bin/../lib64/gcc/x86_64-alt-linux/7/../../../../lib64/crtn.o
/usr/bin/ld.lld: error: bcc.o: string table non-null terminated
clang-6.0: error: linker command failed with exit code 1 (use -v to see invocation)

builder@localhost:~/RPM/BUILD/bcc-v0.5.0/BUILD/src/lua$ llvm-objdump -s -section=.strtab bcc.o

bcc.o: file format ELF64-x86-64

Contents of section .strtab:
 0000 006c7561 4a49545f 42435f62 6363      .luaJIT_BC_bcc

Баг в luajit: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=223688</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>171840</commentid>
    <comment_count>9</comment_count>
    <who name="Vitaly Chikunov">vt</who>
    <bug_when>2018-06-13 05:57:31 +0300</bug_when>
    <thetext>В итоге, lld не может собрать только один таргет: bcc-lua. Это я обошел без ld враппера, так:

export CC=clang
export CXX=clang++
export LDFLAGS=-fuse-ld=lld
%cmake \
        -DCMAKE_BUILD_TYPE=RelWithDebInfo \
        -DREVISION_LAST=%version \
        -DREVISION=%version \
        -DLLVM_DIR=$(llvm-config --cmakedir) \
        -DUSINGISYSTEM:BOOL=no \
        %{?lua_config}
subst s/-fuse-ld=lld/-fuse-ld=ld/ BUILD/src/lua/CMakeFiles/bcc-lua.dir/link.txt
%cmake_build</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>