2016-07-10 15 views
1

Ich versuche CrossCompile Hallo Welt für ARM und ich bin fest mit der Verknüpfung. Der Befehl clang-3.8 -target thumbv7em-none--eabi main.c scheint mein System gcc Toolchain zu holen ... Und ich denke, es ist nicht, dass ichMit Clam zu ARM: falscher Linker

➜ /tmp clang-3.8 -target thumbv7em-none--eabi main.c -v 
clang version 3.8.0-2ubuntu3 (tags/RELEASE_380/final) 
Target: thumbv7em-none--eabi 
Thread model: posix 
InstalledDir: /usr/bin 
"/usr/lib/llvm-3.8/bin/clang" -cc1 -triple thumbv7em-none--eabi -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name main.c -mrelocation-model static -mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -target-cpu cortex-m4 -target-feature +soft-float -target-feature +soft-float-abi -target-feature -neon -target-feature -crypto -target-feature +strict-align -target-abi aapcs -msoft-float -mfloat-abi soft -v -dwarf-column-info -debugger-tuning=gdb -resource-dir /usr/lib/llvm-3.8/bin/../lib/clang/3.8.0 -fdebug-compilation-dir /tmp -ferror-limit 19 -fmessage-length 190 -fallow-half-arguments-and-returns -fno-signed-char -fobjc-runtime=gcc -fdiagnostics-show-option -fcolor-diagnostics -o /tmp/main-755f88.o -x c main.c 
clang -cc1 version 3.8.0 based upon LLVM 3.8.0 default target x86_64-pc-linux-gnu 
#include "..." search starts here: 
#include <...> search starts here: 
/usr/local/include 
/usr/lib/llvm-3.8/bin/../lib/clang/3.8.0/include 
/usr/include 
End of search list. 
"/usr/bin/gcc" -v -o a.out /tmp/main-755f88.o 
Using built-in specs. 
COLLECT_GCC=/usr/bin/gcc 
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper 
Target: x86_64-linux-gnu 
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.3.1-14ubuntu2.1' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu 
Thread model: posix 
gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2.1) 
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/ 
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../:/lib/:/usr/lib/ 
COLLECT_GCC_OPTIONS='-v' '-o' 'a.out' '-mtune=generic' '-march=x86-64' 
/usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/cckaORlW.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o a.out /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. /tmp/main-755f88.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o 
/usr/bin/ld: /tmp/main-755f88.o: Relocations in generic ELF (EM: 40) 
/tmp/main-755f88.o: error adding symbols: File in wrong format 
collect2: error: ld returned 1 exit status 

`` `

Einig fellas im Internet will call linker manually wirklich, aber es wird groß sein, zu vermeiden, das ...

Die anderen empfehlen --gcc-toolchain=path Option. Ich habe mehrere Wege versucht (/usr/bin/arm-none-eabi-gcc, /usr/lib/gcc/arm-none-eabi/4.9.), aber diese Option betrifft nicht alles.

Auch ich lese, dass Clang die Toolchain verwendet, die während llvm Compilation angegeben wurde. Aber es macht keinen Sinn, wenn wir Cross-Compiling machen, oder?

Irgendwelche Ideen, wie man Querverknüpfungen mit Hilfe von Clang-Optionen spezifiziert?

+0

Gibt es einen Grund, nicht einfach das 'arm-none-eabi' Ziel mit' -march = armv7e-m-mthumb' zu verwenden? – Notlikethat

+0

@Notlikethat Ich repariere ein Projekt zur Unterstützung der Kompilierung mit clang und gcc. Ich habe ld verwandten Fehler, wenn ich Compiler und etwas festen Optionen geändert .. So entschied ich Helloworld zu kompilieren und ich bin fest – Kakadu

+0

OK, na ja, offensichtlich ist Ihr GCC für das Arm-None-Eabi Ziel und nicht thumbv7em-none-eabi (was ich immer noch nicht ganz überzeugt bin, ist ein echtes Ziel, da "thumbv7em" keine echte Architektur ist), das scheint nur meine ursprüngliche Frage _reinforce_ ... – Notlikethat

Antwort

0

clang hat eine Option -fuse-ld, mit der Sie einen anderen Linker auswählen können, zum Beispiel mit -fuse-ld=lld. Obwohl diese Option von clang --help nicht erwähnt wird, scheint es zu funktionieren.

Die Option wird in der LLD documentation erwähnt.