Кросс-компиляция из OS X в ARM с ELLCC

Я пытаюсь кросс-компилировать проект C ++ (14) из OS X в ARM для запуска на чипе Cortex-M4. Проект ELLCC кажется, что это может быть использовано для этого, вот что я сделал:

  1. Настройте простой тестовый файл (main.cpp) следующее:

    #include <cstddef>
    
    int main() { }
    
  2. Загрузите последнюю версию ELLCC для OS X с http://ellcc.org/releases. Загрузка занимает некоторое время, но когда она закончится, я распаковываю полученный архив, и моя песочница выглядит так:

    sandbox/
    main.cpp
    ellcc/
    bin/
    examples/
    libecc/
    
  3. использование ecc++ (попытаться) сделать кросс-компиляцию:

    ./ellcc/bin/ecc++ -target arm-none-eabi main.cpp
    

К несчастью, ecc++ не может найти cstddef заголовок:

ldionne in ~/Desktop/ellcc-tests % ./ellcc/bin/ecc++ -v -target arm-none-eabi main.cpp
ecc 0.1.17 based on clang version 3.8.0 (trunk) (based on LLVM 3.8.0svn)
Target: arm-none--eabi
Thread model: posix
InstalledDir: /Users/ldionne/Desktop/ellcc-tests/./ellcc/bin
"/Users/ldionne/Desktop/ellcc-tests/ellcc/bin/ecc" -cc1 -triple armv4t-none--eabi -emit-obj -mrelax-all -disable-free -main-file-name main.cpp -mrelocation-model static -mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -target-cpu arm7tdmi -target-feature +soft-float-abi -target-feature +strict-align -target-abi aapcs -mfloat-abi soft -target-linker-version 253.3.3 -v -dwarf-column-info -resource-dir /Users/ldionne/Desktop/ellcc-tests/ellcc/bin/../libecc -fdeprecated-macro -fdebug-compilation-dir /Users/ldionne/Desktop/ellcc-tests -ferror-limit 19 -fmessage-length 181 -fallow-half-arguments-and-returns -fno-signed-char -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o /var/folders/hs/9ydnxpjd3plbjqsz34p9cxz00000gn/T/main-d365df.o -x c++ main.cpp
clang -cc1 version 3.8.0 based upon LLVM 3.8.0svn default target x86_64-apple-darwin14.5.0
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/Users/ldionne/Desktop/ellcc-tests/ellcc/bin/../libecc/include
/usr/include
End of search list.
main.cpp:1:10: fatal error: 'cstddef' file not found
#include <cstddef>
^
1 error generated.

Первый вопрос: что мне не хватает? Разве это не должно работать из коробки?

Пытаясь обойти проблему с отсутствующим заголовком, я вручную настраиваю заголовок
путь поиска компилятора путем добавления -isystem ellcc/libecc/include/c++,
ecc++ сейчас находит <cstddef>, но он не может найти bits/alltypes.h:

ldionne in ~/Desktop/ellcc-tests % ./ellcc/bin/ecc++ -v -target arm-none-eabi -isystem ${PWD}/ellcc/libecc/include/c++ main.cpp
[snip]
"/Users/ldionne/Desktop/ellcc-tests/ellcc/bin/ecc" -cc1 -triple armv4t-none--eabi -emit-obj -mrelax-all -disable-free -main-file-name main.cpp -mrelocation-model static -mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -target-cpu arm7tdmi -target-feature +soft-float-abi -target-feature +strict-align -target-abi aapcs -mfloat-abi soft -target-linker-version 253.3.3 -v -dwarf-column-info -resource-dir /Users/ldionne/Desktop/ellcc-tests/ellcc/bin/../libecc -isystem /Users/ldionne/Desktop/ellcc-tests/ellcc/libecc/include/c++ -fdeprecated-macro -fdebug-compilation-dir /Users/ldionne/Desktop/ellcc-tests -ferror-limit 19 -fmessage-length 181 -fallow-half-arguments-and-returns -fno-signed-char -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o /var/folders/hs/9ydnxpjd3plbjqsz34p9cxz00000gn/T/main-9cd9a7.o -x c++ main.cpp
[snip]
#include <...> search starts here:
/Users/ldionne/Desktop/ellcc-tests/ellcc/libecc/include/c++
/usr/local/include
/Users/ldionne/Desktop/ellcc-tests/ellcc/bin/../libecc/include
/usr/include
End of search list.
In file included from main.cpp:1:
In file included from /Users/ldionne/Desktop/ellcc-tests/ellcc/libecc/include/c++/cstddef:43:
/Users/ldionne/Desktop/ellcc-tests/ellcc/bin/../libecc/include/stddef.h:17:10: fatal error: 'bits/alltypes.h' file not found
#include <bits/alltypes.h>
^
1 error generated.

Не сдаваясь, я вручную настраиваю путь поиска заголовка, добавив
-isystem ellcc/libecc/include/arm, Но теперь я получаю ошибку ссылки:

./ellcc/bin/ecc++ -v -target arm-none-eabi -isystem ${PWD}/ellcc/libecc/include/c++ -isystem ${PWD}/ellcc/libecc/include/arm main.cpp
[snip]
/usr/local/Cellar/gcc-arm-none-eabi-49/20150609/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/libc.a(lib_a-exit.o): In function `exit':
exit.c:(.text.exit+0x2c): undefined reference to `_exit'
collect2: error: ld returned 1 exit status
ecc: error: linker (via gcc) command failed with exit code 1 (use -v to see invocation)

Вывод довольно длинный, поэтому я включил здесь только соответствующий бит. Полный вывод Вот.

Второй вопрос: почему это не ссылка?

Обратите внимание, что у меня есть arm-none-eabi-gcc уже установлено, что я считаю, поэтому ecc++ использует его для ссылки вместо компоновщика, предоставляемого самим ELLCC.
Я не могу использовать arm-none-eabi-gcc в качестве внешнего интерфейса, потому что его поддержка C ++ 14 глючит, и я занимаюсь серьезным метапрограммированием.

Спасибо за любую помощь.

1

Решение

ELLCC предназначена для кросс-компиляторной цепочки инструментов. Конечная цель — разрешить кросс-компиляцию с любого хоста в несколько целевых сред. В настоящее время кросс-компиляция для Linux и Windows поддерживается «из коробки» с ограниченной поддержкой для систем «с нуля».

Обычно одна из конфигураций в ellcc / libecc / config используется для указания компилятору, где искать заголовочные файлы и библиотеки. Каждый из файлов в ellcc / libecc / config является текстовым файлом и читается, если он указан в качестве аргумента ecc (++) -цель вариант. Если вы посмотрите на эти файлы, вы увидите, как они устанавливают пути включения и т. Д. Цель thumb-linux-engeabi скомпилирует приложение linux, используя набор инструкций cortex-m3 (thumb).

ELLCC имеет предварительно скомпилированные библиотеки для целей Linux и Windows и (очень) ограниченную поддержку таких целей, как cortex-m4. В настоящее время более крупные ARM-чипы (A8, A9 и т. Д.) Имеют самую голую металлическую поддержку. Например, зайдите в ellcc / examples / elk type

[~/ellcc/examples/elk] Richards-Mac-mini% make arm-elk-engeabi
cat: config: No such file or directory
rm -f *.o elk elk.bin elk.log elkconfig.ld
Preprocessing elkconfig.cfg
Compiling main.c
Compiling test_commands.c
Linking elk
[~/ellcc/examples/elk] Richards-Mac-mini%

Это создаст исполняемый файл для A8. Вы можете запустить его:

[~/ellcc/examples/elk] Richards-Mac-mini% make run
Running elk
enter 'control-A x' to exit QEMU
elk started. Type "help" for a list of commands.
fragcnt = 1 size = 42 tx = 4608
got 'hello world
'
Try the command 'inetif'
elk %

Это работает под QEMU в режиме эмуляции системы без ОС. Он использует стандартные стандартные библиотеки C и C ++ для ARM Linux, но эмулирует системные вызовы Linux вместо того, чтобы делать это в Linux.

Я хочу, чтобы в конечном итоге у меня была похожая возможность для cortex-m4, но у меня ее пока нет (вмешательство в повседневную работу, семью и т. Д.) Я сделал небольшую предварительную работу, например, см. Мой пост составление для кортекса-м3.

Я знаю, что это на самом деле не отвечает на ваш вопрос, но я надеюсь, что это делает работу ELLCC немного понятнее.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]