<div dir="ltr">@ Christophe: Oh wow yes adding these option to link command does indeed solve the problem. Thank you so much!<div>@ Peter: Yes I've found the samples. I should have look at these sooner. Thanks for the pointer!</div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">Son Tuan Vu</div></div></div>
<br><div class="gmail_quote">On Mon, Mar 12, 2018 at 4:42 PM, Christophe Lyon <span dir="ltr"><<a href="mailto:christophe.lyon@linaro.org" target="_blank">christophe.lyon@linaro.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 12 March 2018 at 16:35, Son Tuan VU via llvm-dev<br>
<span class=""><<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br>
> Thanks for your prompt reply.<br>
><br>
> I didn't build the libc at all, I downloaded a pre-built version of the<br>
> whole toolchain from<br>
> <a href="https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads" rel="noreferrer" target="_blank">https://developer.arm.com/<wbr>open-source/gnu-toolchain/gnu-<wbr>rm/downloads</a>, so I<br>
> guess it is an official version provided by ARM and should work? This<br>
> version targets ARM Cortex-M and Cortex-R family of processors...<br>
><br>
<br>
</span>I believe these GCC toolchains are multilib-enabled (that is, the libs are built<br>
multiple times, with different options, including thumb/arm).<br>
<br>
Since you already use the gcc driver to link your program,<br>
adding -mcpu=cortex-m3 -mthumb to your link line should do the trick.<br>
<br>
To see which multilibs are available in your GCC toolchain, use:<br>
arm-none-eabi-gcc --print-multi-lib<br>
<br>
HTH<br>
<span class="HOEnZb"><font color="#888888"><br>
Christophe<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
<br>
> Son Tuan Vu<br>
><br>
> On Mon, Mar 12, 2018 at 4:15 PM, Tim Northover <<a href="mailto:t.p.northover@gmail.com">t.p.northover@gmail.com</a>><br>
> wrote:<br>
>><br>
>> Hi,<br>
>><br>
>> On 12 March 2018 at 15:06, Son Tuan VU via llvm-dev<br>
>> <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br>
>> > But libc code is in ARM mode:<br>
>><br>
>> That's very bad, because Cortex-M doesn't support ARM mode. I think<br>
>> your libc is broken.<br>
>><br>
>> > As you can see, the call to srand is just a bl (Branch with Link), not a<br>
>> > blx<br>
>> > (Branch with Link and Exchange instruction set), so I think something is<br>
>> > going wrong here.<br>
>><br>
>> Yes, Cortex-M has no blx instruction.<br>
>><br>
>> > Can anyone kindly give me some pointers on how to debug this? Or at<br>
>> > least<br>
>> > tell me whether this is a bug?<br>
>><br>
>> You don't mention how you build libc, but that's what you need to fix.<br>
>><br>
>> > I am a bit lost now, I've tried to look up<br>
>> > for more information on this but cannot find out why Clang doesn't<br>
>> > generate<br>
>> > Thumb code for libc functions.<br>
>><br>
>> It'll be part of your libc's build system (Makefile?). Clang should<br>
>> simply refuse to produce ARM mode code if it knows it's targeting<br>
>> Cortex-M, so my guess is no -mcpu option is being specified. There<br>
>> might be subtle differences in how GCC has been compiled that means<br>
>> your version defaults to Thumb mode anyway, but Clang doesn't.<br>
>><br>
>> Cheers.<br>
>><br>
>> Tim.<br>
><br>
><br>
><br>
</div></div><div class="HOEnZb"><div class="h5">> ______________________________<wbr>_________________<br>
> LLVM Developers mailing list<br>
> <a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
><br>
</div></div></blockquote></div><br></div>