[oi-dev] Clang and GCC6 runtime

Alexander Pyhalov alp at sfedu.ru
Wed Jul 31 18:06:42 UTC 2019


OK
I have almost working Clang 8.0.1.

The only issue, it doesn't include G++ runpaths in resulting binary. But (suddenly), resulting binaries seem to work with either runtime (GCC4 or 6)...

С уважением,
Александр Пыхалов,
программист отдела телекоммуникационной инфраструктуры
управления информационно-коммуникационной инфраструктуры ЮФУ


________________________________________
От: Aurélien Larcher <aurelien.larcher at gmail.com>
Отправлено: 30 июля 2019 г. 18:40
Кому: Alexander Pyhalov
Тема: Re: Clang and GCC6 runtime

I also wonder what caused breakage of this component as I have used it for my research projects until last year, including compiled with gcc-8 in my build zone.

On Tue, Jul 30, 2019 at 4:36 PM Alexander Pyhalov <alp at sfedu.ru<mailto:alp at sfedu.ru>> wrote:
Hi.

I've looked at https://www.illumos.org/issues/11507, and first issue is clear, 01-openindiana.patch needs fixing.

diff --git a/components/developer/clang-40/patches/01-openindiana.patch b/components/developer/clang-40/patches/01-openindiana.patch
index cf4548b7e..f18920444 100644
--- a/components/developer/clang-40/patches/01-openindiana.patch
+++ b/components/developer/clang-40/patches/01-openindiana.patch
@@ -65,15 +65,15 @@ diff -ruN llvm-4.0.0.src/tools/clang/lib/Driver/ToolChains.cpp llvm-4.0.0.src.pa<http://llvm-4.0.0.src.pa>
 +  std::string GCCVersion = OPENINDIANA_GCC_VERSION;
    switch (Triple.getArch()) {
    case llvm::Triple::x86:
-+    GCCLibPath += ("i386-" + Triple.getVendorName() + "-" + Triple.getOSName()).str() + "/"+GCCVersion+"/";
++    GCCLibPath += ("/i386-" + Triple.getVendorName() + "-" + Triple.getOSName()).str() + "/"+GCCVersion+"/";
    case llvm::Triple::sparc:
      break;
    case llvm::Triple::x86_64:
-+    GCCLibPath += ("i386-" + Triple.getVendorName() + "-" + Triple.getOSName()).str() + "/"+GCCVersion+"/amd64";
++    GCCLibPath += ("/i386-" + Triple.getVendorName() + "-" + Triple.getOSName()).str() + "/"+GCCVersion+"/amd64";
      LibPath += "amd64/";
      break;
    case llvm::Triple::sparcv9:
-+    GCCLibPath += ("sparc-" + Triple.getVendorName() + "-" + Triple.getOSName()).str() + "/"+GCCVersion+"/sparcv9";
++    GCCLibPath += ("/sparc-" + Triple.getVendorName() + "-" + Triple.getOSName()).str() + "/"+GCCVersion+"/sparcv9";
      LibPath += "sparcv9/";
      break;
    default:


The second issue is worse. After applying this patch I see the following issues with simple c++ programs:

clang++ 1.cc -o 1
(or  clang++ 1.cc -Wl,-L/usr/gcc/6/lib -Wl,-R/usr/gcc/6/lib -o 1), doesn't matter much.

$ ./1
Segmentation Fault (core dumped)
$ pstack core
core 'core' of 18083:   ./1
 feee60d2 _ZNSo6sentryC1ERSo (8047b48, 8061480, 200, 40) + 22
 feee67c8 _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i (8061480, 8051181, 1, 30) + 28
 feee6c22 _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc (8061480, 8051181, 8047c1c, 805114f, 8061184, 8050e5e) + 32
 08051122 main     (1, 8047c1c, 8047c24, 8050f52, 0, 0) + 32
 08050f77 _start_crt (1, 8047c1c, fefcfed4, 0, 0, 0) + 96
 08050e4a _start   (1, 8047d10, 0, 8047d14, 8047d28, 8047d41) + 1a


Do I understand correctly that it's issue with GCC C++ ABI and we either have to use GCC 4 runntime libraries for clang or update clang ?


С уважением,
Александр Пыхалов,
программист отдела телекоммуникационной инфраструктуры
управления информационно-коммуникационной инфраструктуры ЮФУ



--
---
Praise the Caffeine embeddings


More information about the oi-dev mailing list