Clang не может скомпилировать с -m32 в открытом SUSE Leap 15 - PullRequest
0 голосов
/ 11 июня 2018

У меня есть виртуальная машина SUSE Leap 15, и я установил clang5 от zypper, и я хочу скомпилировать программное обеспечение, которое должно быть скомпилировано в 32 бита, но кажется, что clang не скомпилирует простой пример с -m32.(необходимые 32-битные библиотеки установлены).

Я пытаюсь скомпилировать этот файл:

#include <iostream>                                                                                                                                                                                                                                                                                                                                                                                                                                                   
int main()                                                                                                                                                                                                                         
{                                                                                                                                                                                                                                  

  auto x = 2;                                                                                                                                                                                                                      
  std::cout << x << std::endl;                                                                                                                                                                                                     

} 

С помощью следующей команды (без -m32 все работает нормально):

clang ++ main.cpp -o alma -std = c ++ 17 -m32 -v

clang version 5.0.1 (tags/RELEASE_501/final 312548)
Target: i386-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib64/gcc/x86_64-suse-linux/7
Found candidate GCC installation: /usr/lib64/gcc/x86_64-suse-linux/7
Selected GCC installation: /usr/bin/../lib64/gcc/x86_64-suse-linux/7
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: 32;@m32
 "/usr/bin/clang-5.0.1" -cc1 -triple i386-unknown-linux-gnu -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -discard-value-names -main-file-name main.cpp -mrelocation-model static -mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -fuse-init-array -target-cpu i586 -v -dwarf-column-info -debugger-tuning=gdb -resource-dir /usr/lib64/clang/5.0.1 -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/7/../../../../include/c++/7 -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/7/../../../../include/c++/7/x86_64-suse-linux/32 -internal-isystem /usr/bin/../lib64/gcc/x86_64-suse-linux/7/../../../../include/c++/7/backward -internal-isystem /usr/local/include -internal-isystem /usr/lib64/clang/5.0.1/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -std=c++17 -fdeprecated-macro -fdebug-compilation-dir /home/martonka/test -ferror-limit 19 -fmessage-length 227 -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o /tmp/main-d5b20e.o -x c++ main.cpp
clang -cc1 version 5.0.1 based upon LLVM 5.0.1 default target x86_64-unknown-linux-gnu
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/bin/../lib64/gcc/x86_64-suse-linux/7/../../../../include/c++/7
 /usr/bin/../lib64/gcc/x86_64-suse-linux/7/../../../../include/c++/7/x86_64-suse-linux/32
 /usr/bin/../lib64/gcc/x86_64-suse-linux/7/../../../../include/c++/7/backward
 /usr/local/include
 /usr/lib64/clang/5.0.1/include
 /usr/include
End of search list.
 "/usr/bin/ld" -z relro --hash-style=gnu --hash-style=both --build-id --enable-new-dtags --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o alma /usr/bin/../lib64/gcc/x86_64-suse-linux/7/../../../crt1.o /usr/bin/../lib64/gcc/x86_64-suse-linux/7/../../../crti.o /usr/bin/../lib64/gcc/x86_64-suse-linux/7/32/crtbegin.o -L/usr/bin/../lib64/gcc/x86_64-suse-linux/7/32 -L/usr/bin/../lib64/gcc/x86_64-suse-linux/7 -L/usr/bin/../lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/lib -L/usr/bin/../lib64/gcc/x86_64-suse-linux/7/../../.. -L/usr/bin/../lib -L/lib -L/usr/lib /tmp/main-d5b20e.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/bin/../lib64/gcc/x86_64-suse-linux/7/32/crtend.o /usr/bin/../lib64/gcc/x86_64-suse-linux/7/../../../crtn.o
/usr/bin/ld: skipping incompatible /usr/bin/../lib64/gcc/x86_64-suse-linux/7/../../../libm.so when searching for -lm
/usr/bin/ld: skipping incompatible /usr/bin/../lib64/gcc/x86_64-suse-linux/7/../../../libc.so when searching for -lc
/usr/bin/ld: i386:x86-64 architecture of input file `/usr/bin/../lib64/gcc/x86_64-suse-linux/7/../../../crt1.o' is incompatible with i386 output
/usr/bin/ld: i386:x86-64 architecture of input file `/usr/bin/../lib64/gcc/x86_64-suse-linux/7/../../../crti.o' is incompatible with i386 output
/usr/bin/ld: i386:x86-64 architecture of input file `/usr/bin/../lib64/gcc/x86_64-suse-linux/7/../../../crtn.o' is incompatible with i386 output
clang-5.0.1: error: unable to execute command: Segmentation fault (core dumped)
clang-5.0.1: error: linker command failed due to signal (use -v to see invocation)

"g ++ main.cpp -o alma -std = c ++ 17 -m32" работает нормально.

Кажется, проблема в том, что clang передает 64-битные версии crtn.o, crti.o и crt1.o в ld.Если я просто скомпилирую объектный файл: clang ++ main.cpp -std = c ++ 17 -c -o alma.o, а затем выполню указанную выше команду компоновщика с фиксированными путями crtn.o, crti.o и crt1.o, то онработает.

Похоже, что Clang думает, что g ++ находится в / usr / lib / (что верно для ubuntu, centos, но не в suse), и он просто добавляет ../../../ для достижения32-битные библиотеки, что явно не так.

Как это можно исправить?

ОБНОВЛЕНИЕ: После еще немного поиска

здесь есть открытая ошибка suse для этого: bugzilla.suse.com / show_bug.cgi? id = 1051881 # c4

И открытая ошибка llvm: bugs.llvm.org/show_bug.cgi?id=12108

Во втором:Существует обходной путь:

cd /usr/lib64/gcc/x86_64-suse-linux/7/32
ln -s /usr/lib/crt1.o
ln -s /usr/lib/crti.o
ln -s /usr/lib/crtn.o

Но Clang по-прежнему выдает предупреждения:

/usr/bin/ld: skipping incompatible /usr/bin/../lib64/gcc/x86_64-suse-linux/7/../../../libm.so when searching for -lm
/usr/bin/ld: skipping incompatible /usr/bin/../lib64/gcc/x86_64-suse-linux/7/../../../libc.so when searching for -lc

Есть ли лучшее решение?

...