[llvm-dev] ARM baremetal linking
Goran Mekić via llvm-dev
llvm-dev at lists.llvm.org
Mon Oct 8 12:48:11 PDT 2018
On Mon, Oct 08, 2018 at 05:47:11PM +0100, Peter Smith wrote:
> By default I think that Clang looks for compiler-rt in the resource
> directory, this is usually relative to the clang executable, something
> like ../lib/clang/6.0.0/lib/baremetal/libclang_rt.builtins-armv7m.a
> for a --target=armv7-m-none-eabi. You can find out where this is with
> --print-resource-dir
Strange:
clang60 -target arm-none-eabi -march=armv7-m -mcpu=cortex-m4 -print-resource-dir
/usr/local/llvm60/lib/clang/6.0.1
clang60 -target arm-none-eabi -march=armv7-m -mcpu=cortex-m4 -print-libgcc-file-name
/usr/local/llvm60/lib/clang/6.0.1/lib/libclang_rt.builtins-arm.a
> If there is a SIGINT on push {r7, lr} that might indicate that the
> stack pointer register isn't set correctly. Depending on how your
> libraries work you may have to do this yourself prior to entering
> __start. Will be worth seeing what SP (R13) is in your debugger at
> that point.
I made a mistake when I said it's not breaking on entrypoint. I just
didn't enable debug build, so the lldb output was different. For
completenes, this is the linker command now:
ld.lld60 -m armelf --entry=__start -T/usr/home/meka/repos/nuttx/nuttx/configs/nucleo-f4x1re/scripts/f401re.ld -L"/usr/home/meka/repos/nuttx/nuttx/staging" -L"/usr/home/meka/repos/nuttx/nuttx/arch/arm/src/board" -o "/usr/home/meka/repos/nuttx/nuttx/nuttx" --start-group -lsched -ldrivers -lconfigs -lc -lmm -larch -lxx -lapps -lfs -lbinfmt -lxx -lboard /usr/local/lib/baremetal/libclang_rt.builtins-arm.a --end-group
This is what debugger says when -g is added to CFLAGS:
lldb nuttx
(lldb) target create "nuttx"
Current executable set to 'nuttx' (arm).
(lldb) gdb-remote 3333 Process 1 stopped
* thread #1, stop reason = signal SIGTRAP
frame #0: 0x08000188 nuttx`__start at stm32_start.c:274
271 ****************************************************************************/
272
273 void __start(void)
-> 274 {
275 const uint32_t *src;
276 uint32_t *dest;
277
(lldb) register read
General Purpose Registers:
r0 = 0x00000000
r1 = 0x00000000
r2 = 0x00000000
r3 = 0x00000000
r4 = 0x00000000
r5 = 0x00000000
r6 = 0x00000000
r7 = 0x00000000
r8 = 0x00000000
r9 = 0x00000000
r10 = 0x00000000
r11 = 0x00000000
r12 = 0x00000000
sp = 0x200016c8
lr = 0xffffffff
pc = 0x08000188 nuttx`__start at stm32_start.c:274
cpsr = 0x00000000
(lldb)
In other words, it does break on entrypoint.
> Adding -mfpu=none -mfloat-abi=soft to the CMAKE_C_FLAGS and
> CMAKE_ASM_FLAGS should prevent any use of floating point. There is a
> check in the CMake files to remove the VFP sources if a particular
> macro isn't defined with the compilation flags so this should make it
> unnecessary to manual edit the CMakeLists.txt file.
I compiled without hardware FPU now. I also added
-DCMAKE_BUILD_TYPE=Debug
GCC build readelf (without debug): https://pastebin.com/vJwCkD09
Clang build readelf (with debug): https://pastebin.com/t75WQQvG
When I diff'ed those two, what I noticed is this:
- Tag_ARM_ISA_use: Yes
+ Tag_ARM_ISA_use: No
Of course, there's tons of differences there, but this one is a bit funky.
Regards,
meka
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20181008/61ad0a41/attachment.sig>
More information about the llvm-dev
mailing list