[cfe-dev] Build Clang on x86_64 (ubuntu) with arm-linux-gnueabihf failed

Stephen Hines srhines at google.com
Wed Oct 9 08:58:03 PDT 2013


If you are using Android's NDK, you should be aware that it targets
soft-float for all ARM ABIs. Thus, if you are linking against any of the
NDK components, they are not going to match a hard-float piece that you
have built from scratch.

Steve


On Tue, Oct 8, 2013 at 11:41 AM, James Molloy <james at jamesmolloy.co.uk>wrote:

> Hi Anton,
>
> Ensure -mfloat-abi=hard is in your CFLAGS and CXXFLAGS. Also ensure you
> target a recent-ish processor or -march=armv7.
>
> I can't really give support on the android linker, but it does look like
> your resulting binary is soft-float.
>
> James
>
>
> On 8 October 2013 19:29, Anton Smirnov <dev at antonsmirnov.name> wrote:
>
>> Hi.
>>
>> I've succeed to compile clang for ARM using ubuntu ..gnueabihf..
>> packages, but libclang.so can't be stripped
>> using tool from ndk because of error:
>>
>> /softdev/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:
>> error:
>> /Users/asmirnov/Documents/dev/src/clang_jni/obj/local/armeabi/libclang.so
>> uses VFP register arguments, output does not
>>
>> Not sure what's wrong now since i've passed cpu and float (hard) as
>> parameters. Any suggestions?
>> BTW I'm going to use it on android devices which are ARM hard float.
>>
>> I'm going to try to compile it with linaro toolchain tomorrow on 32bit vm
>> as it does not work on 64bit (or i was not able just to find it for 64bit).
>>
>> Thanks,
>> Anton.
>>
>>
>> 2013/10/8 James Molloy <james at jamesmolloy.co.uk>
>>
>>> Anton,
>>>
>>> The compiler I'm using is this one:
>>> https://launchpad.net/gcc-linaro/+milestone/4.8-2013.08 . This just
>>> happens to be the latest linaro compiler installed on the central package
>>> database at ARM. I'd assume the ubuntu one would work just as well.
>>>
>>> Cheers,
>>>
>>> James
>>>
>>>
>>> On 8 October 2013 17:09, Anton Smirnov <dev at antonsmirnov.name> wrote:
>>>
>>>> I've noticed you've used linaro toolchain instead of ubuntu's
>>>> gcc-4.7-arm-linux-gnueabihf (and other packages from
>>>> http://llvm.org/docs/HowToCrossCompileLLVM.html).
>>>> Can you write what packages should be downloaded and installed from
>>>> http://www.linaro.org/downloads/ ?
>>>>
>>>> Thanks and regards,
>>>> Anton.
>>>>
>>>>
>>>> 2013/10/8 Anton Smirnov <dev at antonsmirnov.name>
>>>>
>>>>> Thanks, James.
>>>>>
>>>>> I will give it a try right now!
>>>>>
>>>>>
>>>>> 2013/10/8 James Molloy <james at jamesmolloy.co.uk>
>>>>>
>>>>>> Hi Anton,
>>>>>>
>>>>>> I'm very confused about your setup. The subject of these emails
>>>>>> suggests you want to use arm-linux-gnueabihf, but the CMake verbose output
>>>>>> you showed shows you've told it to use clang++ (/usr/local/bin/clang++
>>>>>> -target armv7a-linux-gnueabihf). The compiler flags also seem to be a
>>>>>> frankenmix of x86 and ARM ( -L/usr/lib/gcc/x86_64-linux-gnu/4.7 is never
>>>>>> gonna work!)
>>>>>>
>>>>>> I managed a build without any problems using:
>>>>>>
>>>>>> mkdir build; cd build; cmake ..
>>>>>> -DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc
>>>>>> -DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ -DCMAKE_SYSTEM_NAME=Linux
>>>>>>
>>>>>> As the CMake cross-compilation wiki says, "CMAKE_SYSTEM_NAME" is very
>>>>>> important as it tells CMake that it's cross compiling.
>>>>>>
>>>>>> I also went and looked at the wiki page you quoted, and went and
>>>>>> tried it out. That page is written for someone who wants to cross compile
>>>>>> *with clang*. You want to cross-compile with gcc, so there are some changes
>>>>>> you need to make.
>>>>>>
>>>>>> You must remove the "-target" parameter. You must also remove the
>>>>>> "-ccc-gcc-name" parameter. You also still need the CMAKE_C_COMPILER and
>>>>>> CMAKE_CXX_COMPILER arguments. So the line becomes:
>>>>>>
>>>>>> cmake ..
>>>>>> -DCMAKE_C_COMPILER=/work/tools/linaro/gnueabi/2013.08-20130816/bin/arm-linux-gnueabihf-gcc
>>>>>> -DCMAKE_CXX_COMPILER=/work/tools/linaro/gnueabi/2013.08-20130816/bin/arm-linux-gnueabihf-g++
>>>>>> -DCMAKE_CROSSCOMPILING=True
>>>>>> -DLLVM_TABLEGEN=/work/llvm/build7/../build6/native/bin/llvm-tblgen
>>>>>> -DLLVM_DEFAULT_TARGET_TRIPLE=arm-linux-gnueabihf -DLLVM_TARGET_ARCH=ARM
>>>>>> -DLLVM_TARGETS_TO_BUILD=ARM -DCMAKE_CXX_FLAGS=' -mcpu=cortex-a9
>>>>>> -I/usr/arm-linux-gnueabihf/include/c++/4.7.2/arm-linux-gnueabihf/
>>>>>> -I/usr/arm-linux-gnueabihf/include/ -mfloat-abi=hard'
>>>>>>
>>>>>> Where '/work/llvm/build7/../build6/native/bin' is the location of a
>>>>>> previously-built x86 llvm-tblgen.
>>>>>>
>>>>>> Hopefully this has helped. My preference would be the first command
>>>>>> line I pasted - using -DCMAKE_SYSTEM_NAME=Linux. That seems the simplest
>>>>>> way to me, and it gets LLVM to auto-create its own native llvm-tblgen.
>>>>>>
>>>>>> Cheers,
>>>>>>
>>>>>> James
>>>>>>
>>>>>>
>>>>>>
>>>>>> On 8 October 2013 09:07, Anton Smirnov <dev at antonsmirnov.name> wrote:
>>>>>>
>>>>>>> I can confirm that after editing there is no -L/lib64 in invocation
>>>>>>> line,
>>>>>>> but the problem remains. I think previously compiled files were
>>>>>>> compiled/linked with -L/lib64 and this
>>>>>>> corrupts the build.
>>>>>>>
>>>>>>> How can it be fixed/walked-around?
>>>>>>>
>>>>>>>
>>>>>>> 2013/10/8 Anton Smirnov <dev at antonsmirnov.name>
>>>>>>>
>>>>>>>> As far as i understood, invocation line is saved in
>>>>>>>> CMakeFiles/llvm-tblgen.dir/link.txt.
>>>>>>>> I've edited it to remove -L/lib64 and invoked the last command line
>>>>>>>> manually but the problem remains.
>>>>>>>>
>>>>>>>> What can i do in order to avoid adding -L/lib64 ?
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Anton
>>>>>>>>
>>>>>>>>
>>>>>>>> 2013/10/8 Anton Smirnov <dev at antonsmirnov.name>
>>>>>>>>
>>>>>>>>> Hello.
>>>>>>>>>
>>>>>>>>> Similar question to what i asked few days ago but was not
>>>>>>>>> resolved.
>>>>>>>>>
>>>>>>>>> I've followed guide (
>>>>>>>>> http://llvm.org/docs/HowToCrossCompileLLVM.html) step-by-step.
>>>>>>>>> The only changes i've done is installed g++ package since i've
>>>>>>>>> received "no g++ found" on clear virtual machine (ubuntu 13.04_64).
>>>>>>>>>
>>>>>>>>> First i've compiled for host (to use tblgens), then for ARM.
>>>>>>>>> When cross-compiling for ARM (tried both ninja and autotools) i'm
>>>>>>>>> getting linker error:
>>>>>>>>>
>>>>>>>>> Linking CXX executable ../../bin/llvm-tblgen
>>>>>>>>> ../../lib/libLLVMSupport.a: could not read symbols: File format
>>>>>>>>> not recognized
>>>>>>>>> clang: error: linker command failed with exit code 1 (use -v to
>>>>>>>>> see invocation)
>>>>>>>>> make[2]: *** [bin/llvm-tblgen] Error 1
>>>>>>>>> make[1]: *** [utils/TableGen/CMakeFiles/llvm-tblgen.dir/all] Error
>>>>>>>>> 2
>>>>>>>>>
>>>>>>>>> Verbose output (make VERBOSE=1):
>>>>>>>>>
>>>>>>>>> cd /home/asmirnov/llvm_arm_cmake_build/utils/TableGen &&
>>>>>>>>> /usr/bin/cmake -E cmake_link_script CMakeFiles/llvm-tblgen.dir/link.txt
>>>>>>>>> --verbose=1
>>>>>>>>> /usr/local/bin/clang++   -target armv7a-linux-gnueabihf
>>>>>>>>> -mcpu=cortex-a9
>>>>>>>>> -I/usr/arm-linux-gnueabihf/include/c++/4.7.3/arm-linux-gnueabihf/
>>>>>>>>> -I/usr/arm-linux-gnueabihf/include/ -mfloat-abi=hard -ccc-gcc-name
>>>>>>>>> arm-linux-gnueabihf-gcc -Wall -W -Wno-unused-parameter -Wwrite-strings
>>>>>>>>> -Wmissing-field-initializers -pedantic -Wno-long-long
>>>>>>>>> -Wcovered-switch-default -Wnon-virtual-dtor -fno-rtti -O3 -DNDEBUG
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/AsmMatcherEmitter.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/AsmWriterEmitter.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/AsmWriterInst.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/CallingConvEmitter.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/CodeEmitterGen.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/CodeGenDAGPatterns.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/CodeGenInstruction.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/CodeGenMapTable.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/CodeGenRegisters.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/CodeGenSchedule.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/CodeGenTarget.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/DAGISelEmitter.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/DAGISelMatcherEmitter.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/DAGISelMatcherGen.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/DAGISelMatcherOpt.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/DAGISelMatcher.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/DFAPacketizerEmitter.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/DisassemblerEmitter.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/FastISelEmitter.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/FixedLenDecoderEmitter.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/InstrInfoEmitter.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/IntrinsicEmitter.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/OptParserEmitter.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/PseudoLoweringEmitter.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/RegisterInfoEmitter.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/SetTheory.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/SubtargetEmitter.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/TGValueTypes.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/TableGen.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/X86DisassemblerTables.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/X86ModRMFilters.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/X86RecognizableInstr.cpp.o
>>>>>>>>> CMakeFiles/llvm-tblgen.dir/CTagsEmitter.cpp.o  -o ../../bin/llvm-tblgen
>>>>>>>>> -L/usr/lib/gcc/x86_64-linux-gnu/4.7  -L/lib64  ../../lib/libLLVMTableGen.a
>>>>>>>>> ../../lib/libLLVMSupport.a -lrt -ldl -lpthread -lpthread
>>>>>>>>> ../../lib/libLLVMSupport.a: could not read symbols: File format
>>>>>>>>> not recognized
>>>>>>>>> clang: error: linker command failed with exit code 1 (use -v to
>>>>>>>>> see invocation)
>>>>>>>>> make[2]: *** [bin/llvm-tblgen] Error 1
>>>>>>>>> make[2]: Leaving directory `/home/asmirnov/llvm_arm_cmake_build'
>>>>>>>>> make[1]: *** [utils/TableGen/CMakeFiles/llvm-tblgen.dir/all] Error
>>>>>>>>> 2
>>>>>>>>> make[1]: Leaving directory `/home/asmirnov/llvm_arm_cmake_build'
>>>>>>>>> make: *** [all] Error 2
>>>>>>>>>
>>>>>>>>>  Can it be walked-around by invocation without -L/lib64 ?
>>>>>>>>>
>>>>>>>>> Anton
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> cfe-dev mailing list
>>>>>>> cfe-dev at cs.uiuc.edu
>>>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20131009/9a3f601f/attachment.html>


More information about the cfe-dev mailing list