Проблемы с установкой кросс-компилятора mips - PullRequest
1 голос
/ 06 января 2012

Я делаю магистерскую диссертацию, и у меня возникают проблемы с настройкой кросс-компилятора.Я прочитал много статей, часто задаваемых вопросов, учебных пособий и т. Д., Но я все еще думаю, что что-то упускаю, может быть, очень глупый и простой, но без этого у меня не может быть четкого видения всего, и я не могузаставить все это работать ... так что, пожалуйста, не стесняйтесь объяснить мне все.Давайте перейдем к проблеме.

Я использую SoClib для разработки NoC с большим количеством MIPS и большим количеством RAM, и я хочу загрузить различные приложения в каждую RAM, чтобы каждая MIPS считывала только из одной RAM.Мне удалось сделать это с помощью очень простых приложений (например, привет слова с прерываниями ...), поэтому теперь я пытался реализовать декодер JPEG для более интенсивного использования MIPS.Проблема в том, что используемый кросс-компилятор не может найти основные функции stdio и поэтому не может скомпилировать приложение для mips.В общем, мне не удалось установить работающий полный кросс-компилятор.

1) Начнем с кросс-компилятора, установленного с SoClib: вот руководство, которому я следовал, чтобы установить его: http://www.soclib.fr/trac/dev/wiki/CrossCompiler Теперь из того, что я прочитал, это не полный кросс-компилятор.Я установил только первый этап gcc, который может генерировать эльфийский код для mips, но не может использовать любую функцию Си.После этого я должен скомпилировать библиотеку C, чтобы создать новый кросс-компилятор.Так что это нормально, что он не работает, хотя это не отвечает на вопрос: почему «Hello world» работал, если он использует printf и включает stdio.h?Ответ должен состоять в том, что я видел, что SoClib имеет свой заголовок stdio.h с очень немногими реализованными функциями (там есть printf), поэтому я не могу использовать стандартную библиотеку C с этим компилятором.

2) Из-за этого я решил установить полный кросс-компилятор и прочитал так много руководств, что опубликую только два, которые я использовал на практике: http://www.cse.iitb.ac.in/grc/gcc-workshop-11/downloads/slides/gccw11-config-build.pdf изстр. 108 (до этого объясняются проблемы с кросс-компиляцией) Используется EGLIBC.Разница лишь в том, что я использовал в качестве цели «мипсел-эльф».Если я правильно понял, этот метод требует трехэтапного кросс-компилятора, потому что eglibc не может быть полностью скомпилирован с помощью первого кросс-компилятора.Теперь проблема в том, что мне не удается установить eglibc с помощью кросс-компилятора первого этапа (он не работает на стр. 122).Я приложил журнал.Я думаю, что проблемы начинаются, когда он говорит: «mipsel-elf-gcc: ошибка: нераспознанная опция ´-V´» и «mipsel-elf-gcc: фатальная ошибка: компиляция входных файлов не прекращена».Кажется, у меня есть некоторые проблемы с компилятором, и все заканчивается на неподдерживаемой платформе… но это должно работать, потому что я скопировал каталог eglibc / ports, как сказано в руководстве…

3) Я попробовал другойруководство, которое использует newlib вместо eglibc: http://www(dot)cygwin(dot)com/ml/crossgcc/2005-08/msg00114/l-cross-ltr.pdf Это руководство создает только двухэтапный кросс-компилятор.Я думаю, это потому, что newlib может быть полностью скомпилирован с помощью компилятора первого этапа ... я прав?Во всяком случае, у меня та же проблема.Я не могу скомпилировать newlib и получаю похожие ошибки (журнал прилагается).

Так что это моя проблема, и здесь я поставил некоторые сомнения, которые у меня были, пытаясь ее решить.

4Может ли проблема быть целью = мипсель-эльф?Из документации gnu я знаю, что имя для настройки gnu должно быть: cpu-Manufacturer-OS (или cpu-Manufacturer-kernel-OS), но я прочитал, что mipsel-elf принимается.Эльф должен быть потому, что я не хочу загружать ОС на своей платформе NoC, и здесь второе сомнение ...

5) Может ли проблема быть в ОС?В руководствах используются заголовки ядра Linux ... может быть, с целью mipsel-elf, я не должен настраивать binutils -with-sysroot?Но звучит мне странно ... что должно измениться?

6) Еще один, наверное, глупый вопрос.Функции stdio и вообще C, разве не нужна ОС, верно?Потому что все эти проблемы заставляют меня усомниться в основах ... поэтому я должен иметь возможность запускать приложение C для декодирования JPEG с кросс-компилятором mipsel-elf, верно?

Будут оценены все соображения, советы и помощь.Если у вас есть сБолее подробную информацию об этих аргументах, пожалуйста, дайте мне знать, я хотел бы узнать и стать более уверенным в этой области.Спасибо

eglibc log:

configure:2426: $? = 0
configure:2433: /home/bertone/programmazione/crosscompiler/mips/install/bin/mipsel-elf-gcc -v >&5
Using built-in specs.
COLLECT_GCC=/home/bertone/programmazione/crosscompiler/mips/install/bin/mipsel-elf-gcc
COLLECT_LTO_WRAPPER=/home/bertone/programmazione/crosscompiler/mips/install/libexec/gcc/mipsel-elf/4.6.2/lto-wrapper
Target: mipsel-elf
Configured with: ../../../../../Scaricati/src/gcc-4.6.2/configure --target=mipsel-elf --prefix=/home/bertone/programmazione/crosscompiler/mips/install --without-headers --with-newlib --disable-shared --disable-threads --disable-libssp --disable-libgomp --disable-libmudflap --enable-languages=c --disable-werror
Thread model: single
gcc version 4.6.2 (GCC) 
configure:2437: $? = 0
configure:2444: /home/bertone/programmazione/crosscompiler/mips/install/bin/mipsel-elf-gcc -V >&5
mipsel-elf-gcc: error: unrecognized option '-V'
mipsel-elf-gcc: fatal error: no input files
compilation terminated.
configure:2448: $? = 1
configure:2452: checking for suffix of object files
configure:2478: /home/bertone/programmazione/crosscompiler/mips/install/bin/mipsel-elf-gcc -c   conftest.c >&5
configure:2482: $? = 0
configure:2507: result: o
configure:2511: checking whether we are using the GNU C compiler
configure:2540: /home/bertone/programmazione/crosscompiler/mips/install/bin/mipsel-elf-gcc -c   conftest.c >&5
configure:2547: $? = 0
configure:2564: result: yes
configure:2573: checking whether /home/bertone/programmazione/crosscompiler/mips/install/bin/mipsel-elf-gcc accepts -g
configure:2603: /home/bertone/programmazione/crosscompiler/mips/install/bin/mipsel-elf-gcc -c -g  conftest.c >&5
configure:2610: $? = 0
configure:2711: result: yes
configure:2728: checking for /home/bertone/programmazione/crosscompiler/mips/install/bin/mipsel-elf-gcc option to accept ISO C89
configure:2802: /home/bertone/programmazione/crosscompiler/mips/install/bin/mipsel-elf-gcc  -c -g -O2  conftest.c >&5
conftest.c:9:19: fatal error: stdio.h: No such file or directory
compilation terminated.
configure:2809: $? = 1
configure: failed program was:
| /* confdefs.h.  */
| #define PACKAGE_NAME "GNU C Library"
| #define PACKAGE_TARNAME "glibc"
| #define PACKAGE_VERSION "(see version.h)"
| #define PACKAGE_STRING "GNU C Library (see version.h)"
| #define PACKAGE_BUGREPORT "http://sourceware.org/bugzilla/"
| /* end confdefs.h.  */
| #include <stdarg.h>
| #include <stdio.h>
| #include <sys/types.h>
| #include <sys/stat.h>
| /* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
| struct buf { int x; };
| FILE * (*rcsopen) (struct buf *, struct stat *, int);
| static char *e (p, i)
|      char **p;
|      int i;
| {
|   return p[i];
| }
| static char *f (char * (*g) (char **, int), char **p, ...)
| {
|   char *s;
|   va_list v;
|   va_start (v,p);
|   s = g (p, va_arg (v,int));
|   va_end (v);
|   return s;
| }
| 
| /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
|    function prototypes and stuff, but not '\xHH' hex character constants.
|    These don't provoke an error unfortunately, instead are silently treated
|    as 'x'.  The following induces an error, until -std is added to get
|    proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
|    array size at least.  It's necessary to write '\x00'==0 to get something
|    that's true only with -std.  */
| int osf4_cc_array ['\x00' == 0 ? 1 : -1];
| 
| /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
|    inside strings and character constants.  */
| #define FOO(x) 'x'
| int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
| 
| int test (int i, double x);
| struct s1 {int (*f) (int a);};
| struct s2 {int (*f) (double a);};
| int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
| int argc;
| char **argv;
| int
| main ()
| {
| return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
|   ;
|   return 0;
| }
configure:2802: /home/bertone/programmazione/crosscompiler/mips/install/bin/mipsel-elf-gcc -qlanglvl=extc89 -c -g -O2  conftest.c >&5
mipsel-elf-gcc: error: unrecognized

опция '-qlanglvl = extc89' configure: 2809: $?= 1

Журнал NEWLIB

configure:4049: $? = 0
configure:4038: /home/bertone/programmazione/crosscompiler/mips/install/bin/mipsel-elf-gcc -v >&5
Using built-in specs.
COLLECT_GCC=/home/bertone/programmazione/crosscompiler/mips/install/bin/mipsel-elf-gcc
COLLECT_LTO_WRAPPER=/home/bertone/programmazione/crosscompiler/mips/install/libexec/gcc/mipsel-elf/4.6.2/lto-wrapper
Target: mipsel-elf
Configured with: ../../../../../Scaricati/src/gcc-4.6.2/configure --target=mipsel-elf --prefix=/home/bertone/programmazione/crosscompiler/mips/install --without-headers --with-newlib --disable-shared --disable-threads --disable-libssp --disable-libgomp --disable-libmudflap --enable-languages=c --disable-werror
Thread model: single
gcc version 4.6.2 (GCC) 
configure:4049: $? = 0
configure:4038: /home/bertone/programmazione/crosscompiler/mips/install/bin/mipsel-elf-gcc -V >&5
mipsel-elf-gcc: error: unrecognized option '-V'
mipsel-elf-gcc: fatal error: no input files
compilation terminated.
configure:4049: $? = 1
configure:4038: /home/bertone/programmazione/crosscompiler/mips/install/bin/mipsel-elf-gcc -qversion >&5
mipsel-elf-gcc: error: unrecognized option '-qversion'
mipsel-elf-gcc: fatal error: no input files
compilation terminated.
configure:4049: $? = 1
configure:4069: checking for C compiler default output file name
configure:4091: /home/bertone/programmazione/crosscompiler/mips/install/bin/mipsel-elf-gcc    conftest.c  >&5
/home/bertone/programmazione/crosscompiler/mips/install/lib/gcc/mipsel-elf/4.6.2/../../../../mipsel-elf/bin/ld: cannot find crti.o: No such file or directory
/home/bertone/programmazione/crosscompiler/mips/install/lib/gcc/mipsel-elf/4.6.2/../../../../mipsel-elf/bin/ld: cannot find crtbegin.o: No such file or directory
/home/bertone/programmazione/crosscompiler/mips/install/lib/gcc/mipsel-elf/4.6.2/../../../../mipsel-elf/bin/ld: cannot find -lgcc
/home/bertone/programmazione/crosscompiler/mips/install/lib/gcc/mipsel-elf/4.6.2/../../../../mipsel-elf/bin/ld: cannot find -lgcc
/home/bertone/programmazione/crosscompiler/mips/install/lib/gcc/mipsel-elf/4.6.2/../../../../mipsel-elf/bin/ld: cannot find crtend.o: No such file or directory
/home/bertone/programmazione/crosscompiler/mips/install/lib/gcc/mipsel-elf/4.6.2/../../../../mipsel-elf/bin/ld: cannot find crtn.o: No such file or directory
collect2: ld returned 1 exit status
configure:4095: $? = 1
configure:4132: result: 
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME ""
| #define PACKAGE_TARNAME ""
| #define PACKAGE_VERSION ""
| #define PACKAGE_STRING ""
| #define PACKAGE_BUGREPORT ""
| #define PACKAGE_URL ""
| /* end confdefs.h.  */
| 
| int
| main ()
| {
| 
|   ;
|   return 0;
| }
configure:4138: error: in `/home/bertone/programmazione/crosscompiler/mips/build/newlib':
configure:4142: error: C compiler cannot create executables

Ответы [ 2 ]

0 голосов
/ 11 января 2012

Во-первых, выкл, вам нужны эти функции stdio?

Можете ли вы заменить эти функции stdio. Например, вам действительно нужен printf (один из наиболее болезненных), или вы можете заменить их чем-то другим, например, функциями string_display () и hex_display (), которые довольно легко реализовать и библиотекой и не зависит от системы.

Эти функции файлового ввода-вывода? Кажется, я помню, что один из популярных jpeg-декодеров с открытым исходным кодом хотел сделать для вас файловый ввод-вывод. Насколько сложно действительно реализовать fopen () (просто вернуть с любым допустимым), фред, который просто отслеживает указатель в некоторых константных данных, которые вы включили в двоичный файл, и делает копию mem и fwrite, то же самое deal отслеживает указатель в массиве и делает копию mem.

У меня есть встроенные jpeg-декодеры, mp3 и т. Д., Которые выполняют системные вызовы, используя newlib (), что немного облегчает задачу, но в наши дни очень сложно создать кросс-компилятор, а также заменять системные вызовы на различные функции или путем моделирования этих функций.

Если вы используете бесплатный LiteSource Code Lite (теперь он называется codebench или что-то еще, так как это уже менторская графика, а не CodeSource) и заменяете системные вызовы на имитированные, вам больше не придется связываться с компиляторами.

У меня есть несколько очень простых MIPS-кодов, но также и некоторые инструкции по созданию вида кросс-компилятора GNU, о котором я говорю (отлично работает, если вы не используете системные вызовы, вызовы библиотеки C, вызовы библиотеки gcc, потому что вы реализовали все сам).

https://github.com/dwelch67/pic32_samples

Это не так уж далеко от того, что я собираю, до полного кросс-компилятора. Gcc / gnu не настолько стабилен, что вы можете просто кросс-компилировать любую версию из любой версии и заставить ее работать, также кросс-компиляторы для любой цели из любой версии на любом хосте, использующем любую версию, не стабильны. Время от времени версия binutils + gcc + newlib для цели просто работает. например, в этот период времени / истории это работало как на linux, так и на mingw на windows.

http://www.dwelch.com/ipod/gccarm.txt

но если вы не используете виртуальную машину (vmware и т. Д.) И не устанавливаете на нее старый linux с достаточно старой системой сборки, вы не сможете собрать вышеописанное.

Не так давно и, возможно, до сих пор это работало на современной системе. Это для руки, но, возможно, это также будет работать для MIPS.

http://www.cowlark.com/2009-07-04-building-gcc/

Не думаю, что у меня есть какой-либо код, размещенный с библиотеками mp3 и zlib и jpeg, которые используются без системных вызовов или с симулированными системными вызовами в месте, где я могу их опубликовать. mallocs легко реализовать для таких вещей, как zlib, если вы хотите использовать zlib в качестве теста производительности или чего-то другого, одноразовое сжатие или распаковку или и то, и другое, не вещь общего назначения, а контролируемая среда тестирования с входящими и исходящими данными. То же самое относится и к другим контролируемым средам: jpeg-кодирование или декодирование, mp3-кодирование или декодирование (они с потерями, поэтому вы не можете сравнить входные данные с выходными, чтобы убедиться, что система дала правильный результат, контрольную сумму или crc легко сравнить с известной хорошей системой). /результат).

Если вы исследуете файлы в newlib, которые я обнуляю, и заменяете позже, вы можете увидеть, во что newlib сводит вызовы stdio, тогда вы реализуете каждую из этих функций. У меня есть пара старых сайтов, на которых есть по крайней мере примеры dhrystone, которые просто хотели получить printf http://www.dwelch.com/ipod/ http://www.dwelch.com/gba/dhry.htm, где вы можете увидеть, что я сделал с функциями newlib, в основном просто стерилизовать их, возвращая передаваемое значение и выяснить, что делает newlib, когда он хочет вывести на стандартный вывод.

Или пример замены некоторых вызовов stdio альтернативными функциями, что приводит к чему-то, что все еще работает. не сказать, что это красиво, но вы можете играть в игру. https://github.com/dwelch67/stm32f4d/blob/master/adventure/

По сути, я читаю, что вы определили проблему, но идете только одним путем, решая ее на стороне компилятора.Когда вы могли бы решить это, создав абстракционный слой или прокладку, или полностью удалив код, вызывающий нарушение, или заменив его менее оскорбительным кодом.Если вы посмотрите на исходный код приключений выше и аналогичную империю игр эпохи и т. Д., Даже на небольшие компиляторы c и другой код, который был перенесен несколько раз, вы увидите, что они сделали именно это, они решили проблему, сделавязык, несистемные вызовы в основной части кода, а затем последней милей было реализовать эти вызовы в одном или нескольких системных местах.Даже если вы хотите получить кросс-компилятор gcc + newlib или gcc + glibc, вам все равно придется заменить стандартный stdio на уровень операционной системы своим собственным.(это также сторона компилятора, большой громоздкий уровень абстракции, glibc, newlib и т. д., который вам все еще нужно реализовать для бэкэнда).

0 голосов
/ 07 января 2012

Почему бы просто не загрузить бесплатный готовый набор инструментов для кросс-компиляции GCC Codesourcery Lite для MIPS?

6) Функции stdio и C вообще не нуждаются в ОС, верно?

Обычно libc переводит вызовы stdio в системные вызовы базовой ОС, поэтому для работы stdio вам понадобится ОС. Ваше приложение JPEG-декодера будет работать нормально, если оно не вызывает ничего, что требует ОС, но вам нужно будет создать метод для передачи результатов от каждого отдельного ЦП через ваш NoC во внешний мир.

...