У меня система buildroot для cortex-M3 без MMU на базе ядра ucLinux 2.6.33. Поддержка FLAT, ZFLAT, SHARED_FLAT включена в ядре. Внутри buildroot все настроено на M3 и т. д. У меня есть рабочая система с работающим ядром и busybox (который работает только в бинарном виде в пользовательском пространстве). В системе нет ни uClibc, ни каких-либо других библиотек. Я пытаюсь создать простейшее приложение для пользовательского пространства, например: main(){}
Пробовал с разными флагами. Последняя комбинация была такой:
^[[7m>>> zpm_t 1.0 Building^[[27m /usr/bin/make -j5 FLAGS="-c -mthumb -march=armv7 -mfix-cortex-m3-ldrd" EXTRA_LDFLAGS="-Wl,-elf2flt , --static" CC="/mnt/repos/repos/github/nocturn_buildroot/output/host/usr/bin/ccache /mnt/repos/repos/github/nocturn_buildroot/output/host/usr/bin/arm-uclinuxeabi -gcc" LD="/mnt/repos/repos/github/nocturn_buildroot/output/host/usr/bin/arm-uclinuxeabi-ld" HEADERS="-I/mnt/repos/repos/github/nocturn_buildroot/output/target /usr/include/SDL" LIBS="-L/mnt/repos/repos/github/nocturn_buildroot/../nocturn_tools/arm-2010q1/arm-uclinuxeabi/libc/usr/lib" -C /mnt/repos/repos /github/nocturn_buildroot/output/build/zpm_t-1.0 all make[1]: Вход в каталог /mnt/repos/repos/github/nocturn_buildroot/output/build/zpm_t-1.0'
/mnt/repos/repos/github/nocturn_buildroot/output/host/usr/bin/ccache /mnt/repos/repos/github/nocturn_buildroot/output/host/usr/bin/arm-uclinuxeabi-gcc -c -mthumb -march=armv7 -mfix-cortex-m3-ldrd -I/mnt/repos/repos/github/nocturn_buildroot/output/target/usr/include/SDL t.c
/mnt/repos/repos/github/nocturn_buildroot/output/host/usr/bin/ccache /mnt/repos/repos/github/nocturn_buildroot/output/host/usr/bin/arm-uclinuxeabi-gcc -Wl,-elf2flt,--static t.o -L/mnt/repos/repos/github/nocturn_buildroot/../nocturn_tools/arm-2010q1/arm-uclinuxeabi/libc/usr/lib -o t
make[1]: Leaving directory
/mnt/repos/repos/github/nocturn_buildroot/output/build/zpm_t-1.0'
плоский файл кажется в порядке:
$ arm-uclinuxeabi-flthdr output/target/opt/t
output/target/opt/t
Magic: bFLT
Rev: 4
Build Date: Wed Sep 24 00:28:31 2014
Entry: 0x45
Data Start: 0x1f00
Data End: 0x1f70
BSS End: 0x1fa0
Stack Size: 0x1000
Reloc Start: 0x1f70
Reloc Count: 0x29
Flags: 0x1 ( Load-to-Ram )
Но в системе у меня всегда есть segfault, который не так информативен:
/opt # ./t
[ 23.200000]
[ 23.200000]
[ 23.200000] t: fault at 0xa0501dd4 [pc=0xa0501dd4, sp=0xa0503f28]
[ 23.200000] Invalid ISA state
[ 23.200000]
SEGV
Что я пропустил? Это должно быть что-то очень простое. Также - что делать с uClibc? Должен ли он быть скомпилирован в каждый двоичный исполняемый файл или я должен каким-то образом поместить его в систему?