Как собрать двоичный файл пользовательского пространства FLAT для ucLinux на buildroot с набором инструментов arm2010q1

У меня система 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? Должен ли он быть скомпилирован в каждый двоичный исполняемый файл или я должен каким-то образом поместить его в систему?


person pulse    schedule 23.09.2014    source источник


Ответы (1)


Я связал свое приложение с неправильной библиотекой. Мне пришлось взять готовый из папки thumb2 внутри набора инструментов (для M3):

LIBS="-L$(TOPDIR)/../tools/arm-2010q1/arm-uclinuxeabi/libc/thumb2/usr/lib"

Просто исправление помогает. Поскольку у меня есть libc.a и libm.a в виде статических архивов, достаточно просто исправить LIBS. И никаких флагов типа -lm не требуется. Во время компиляции buildroot он берет необходимую часть статических библиотек и создает рабочий двоичный файл FLAT.

person pulse    schedule 24.09.2014