Параметры компиляции для цепочки инструментов исходного кода на основе MIPS?

Я установил набор инструментов кросс-компиляции исходного кода для архитектуры mips32 на свой компьютер с WIN 7. Сначала я хочу скомпилировать простой двоичный файл «factorial» для своего маршрутизатора, основанного на MIPS32. После небольшого поиска в Интернете я обнаружил, что он основан на MIPS32 с прямым порядком байтов.

#cat /proc/cpuinfo
system type             : 96338W2
processor               : 0
cpu model               : BCM6338 V1.0
BogoMIPS                : 239.20
wait instruction        : no
microsecond timers      : yes
tlb_entries             : 32
extra interrupt vector  : yes
hardware watchpoint     : no
unaligned access        : 1269919
VCED exceptions         : not available
VCEI exceptions         : not available

# cat /proc/version
Linux version 2.6.8.1 (root@WangHaiTao) (gcc version 3.4.2) #1 Wed Sep 2 10:13:53 CST 2009

Каталог LIB маршрутизатора содержит:

ld-uClibc.so.0 libc.so.0 libcrypt.so.0 libcrypto.so.0.9.7 libdl.so.0 libm.so.0 libnvram.so libpsi.so libpsixml.so libresolv.so.0 libssl. модули so.0.9.7 libutil.so.0 libwlbcmcrypto.so libwlbcmshared.so libwlctl.so

Информация о наборе инструментов: (в хост-системе WIN 7)

C:\code>mips-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=mips-linux-gnu-gcc
COLLECT_LTO_WRAPPER=f:/program files/codesourcery/sourcery_codebench_lite_for_mi
ps_gnu_linux/bin/../libexec/gcc/mips-linux-gnu/4.6.3/lto-wrapper.exe
Target: mips-linux-gnu
Configured with: /scratch/cmoore/2012.03-63-linux-lite/src/gcc-4.6-2012.03/confi
gure --build=i686-pc-linux-gnu --host=i686-mingw32 --target=mips-linux-gnu --ena
ble-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with
-arch-32=mips32r2 --with-arch-64=mips64r2 --with-float=hard --with-mips-plt --en
able-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{save-t
emps: -fverbose-asm} -D__CS_SOURCERYGXX_MAJ__=2012 -D__CS_SOURCERYGXX_MIN__=3 -D
__CS_SOURCERYGXX_REV__=63 %{O2:%{!fno-remove-local-statics: -fremove-local-stati
cs}} %{O*:%{O|O0|O1|O2|Os:;:%{!fno-remove-local-statics: -fremove-local-statics}
}}' --enable-languages=c,c++ --enable-shared --enable-lto --enable-symvers=gnu -
-enable-__cxa_atexit --with-pkgversion='Sourcery CodeBench Lite 2012.03-63' --wi
th-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=
/opt/codesourcery --with-sysroot=/opt/codesourcery/mips-linux-gnu/libc --with-bu
ild-sysroot=/scratch/cmoore/2012.03-63-linux-lite/install/host-i686-mingw32/mips
-linux-gnu/libc --with-libiconv-prefix=/scratch/cmoore/2012.03-63-linux-lite/obj
/host-libs-2012.03-63-mips-linux-gnu-i686-mingw32/usr --with-gmp=/scratch/cmoore
/2012.03-63-linux-lite/obj/host-libs-2012.03-63-mips-linux-gnu-i686-mingw32/usr
--with-mpfr=/scratch/cmoore/2012.03-63-linux-lite/obj/host-libs-2012.03-63-mips-
linux-gnu-i686-mingw32/usr --with-mpc=/scratch/cmoore/2012.03-63-linux-lite/obj/
host-libs-2012.03-63-mips-linux-gnu-i686-mingw32/usr --with-ppl=/scratch/cmoore/
2012.03-63-linux-lite/obj/host-libs-2012.03-63-mips-linux-gnu-i686-mingw32/usr -
-with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with
-cloog=/scratch/cmoore/2012.03-63-linux-lite/obj/host-libs-2012.03-63-mips-linux
-gnu-i686-mingw32/usr --with-libelf=/scratch/cmoore/2012.03-63-linux-lite/obj/ho
st-libs-2012.03-63-mips-linux-gnu-i686-mingw32/usr --disable-libgomp --enable-po
ison-system-directories --with-build-time-tools=/scratch/cmoore/2012.03-63-linux
-lite/obj/tools-i686-pc-linux-gnu-2012.03-63-mips-linux-gnu-i686-mingw32/mips-li
nux-gnu/bin --with-build-time-tools=/scratch/cmoore/2012.03-63-linux-lite/obj/to
ols-i686-pc-linux-gnu-2012.03-63-mips-linux-gnu-i686-mingw32/mips-linux-gnu/bin
Thread model: posix
gcc version 4.6.3 (Sourcery CodeBench Lite 2012.03-63)



Я попробовал следующие параметры компиляции:

  1. mips-linux-gnu-gcc -mips32 -muclibc -o factorial factorial.c

Когда я запустил выходной двоичный файл в поле MIPS, он просто напечатал «невозможно загрузить библиотеку« libgcc_s.so.1 »».

  1. mips-linux-gnu-gcc -muclibc -mips32 -static-libgcc -s -o factorial factorial.c

Когда я запускаю его вывод, он печатает «sigsegv».

Что здесь не так? Какой параметр компилятора я должен ввести? Помогите мне, пожалуйста.


person Akhil P Oommen    schedule 29.08.2012    source источник
comment
Компилируется и успешно ли factorial.c компилируется и работает с gcc на машине x86? Вы пытались выполнить код с помощью mips-linux-gnu-gdb?   -  person markgz    schedule 30.08.2012
comment
Код компилируется и работает нормально для x86. Я не знаю о шагах с GDB. :/   -  person Akhil P Oommen    schedule 30.08.2012


Ответы (2)


У вас есть libgcc_s.so.1 в файловой системе? Если нет, в наборе инструментов будет папка для копирования в файловую систему. Сделай это.

Если вы это сделаете, убедитесь, что LD_LIBRARY_PATH задан правильно.

РЕДАКТИРОВАТЬ: Общее решение проблемы

Когда вы создаете исполняемый файл, вы связываетесь с библиотеками. Эти библиотеки также должны присутствовать в среде, в которой вы запускаете исполняемый файл. Следовательно, во встроенной системе должны совпадать 3 вещи.

  1. Заголовки ядра
  2. Цепочка инструментов
  3. Файловая система

Вот как они связаны

Заголовки вашего ядра используются как #include в вашей программе в той или иной форме. Таким образом, заголовки, используемые цепочкой инструментов, должны совпадать с фактически работающими и присутствовать в файловой системе.

Цепочка инструментов будет состоять из библиотек, на которые можно ссылаться, чтобы можно было создать исполняемый файл [например, libc и другие]. Они должны быть такими же, как и в вашей среде выполнения, которая является вашей файловой системой.

Цепочка инструментов должна создать формат, приемлемый для вашего ядра. Исполняемый формат.

В общем, если у вас нет файла в вашей файловой системе при попытке выполнить его, он должен исходить из какого-то SDK или вашей цепочки инструментов. Если он у вас есть в файловой системе, вы можете указать своей цепочке инструментов использовать его оттуда.

Один из способов обойти проблему, если по какой-то причине у вас нет библиотек в файловой системе, — создать статические исполняемые файлы. Но вы должны быть уверены, что знаете, что делаете.

РЕДАКТИРОВАТЬ: конкретная проблема, с которой вы столкнулись. Если ваша файловая система доступна только для чтения, то либо у вас уже есть все на ней, и для разработки предоставляется SDK. Если у вас его нет, вы все равно можете разработать, заставив свою цепочку инструментов использовать библиотеки из вашей файловой системы [думаю, -I, -L].

РЕДАКТИРОВАТЬ 2: Ваша файловая система, похоже, ucLibc. Ваш набор инструментов, кажется, построен против libc. Вот ваше несоответствие.

Теперь у вас, похоже, файловая система только для чтения без SDK для разработки. Поэтому я не уверен, что следующее будет работать. Ваша цепочка инструментов должна быть настроена на использование только файлов из вашей файловой системы и настроена для ucLibc. Если ребята из маршрутизатора позаботились о том, чтобы все файлы, необходимые для разработки, были доступны в rilesystem, этого достаточно. В противном случае вам нужен их sdk. См. выше редактирование для объяснения.

person av501    schedule 29.08.2012
comment
Маршрутизатор имеет файловую систему только для чтения. Только некоторые каталоги, такие как VAR, доступны для записи. Я думаю, что каталог LIB доступен только для чтения. - person Akhil P Oommen; 30.08.2012
comment
Как я могу скомпилировать тот, который не нуждается во внешних библиотеках?? - person Akhil P Oommen; 30.08.2012
comment
Ну, тогда ребята из маршрутизатора должны были дать вам SDK или что-то в этом роде. Или вы копируете файловую систему роутера и используете там библиотеки. Я отредактирую свой ответ и объясню немного больше - person av501; 30.08.2012
comment
Как я могу проверить и сопоставить заголовки ядра? Не могу найти исходники прошивки роутера. Я включил некоторую информацию, такую ​​​​как версия Linux маршрутизатора и информация о версии моей цепочки инструментов. Пожалуйста, проверьте это. - person Akhil P Oommen; 31.08.2012
comment
Я новичок в среде Linux. Я попытался выполнить статическую компиляцию, используя параметр «-static-libgcc». Но когда я пытаюсь запустить этот двоичный файл, он просто печатает «sigsegv». - person Akhil P Oommen; 31.08.2012
comment
Ваш набор инструментов построен против uClibC? Думаю, нет. Смотрите мое редактирование ответа. Если эти условия не будут выполнены, у вас не будет работающей программы на маршрутизаторе. - person av501; 01.09.2012
comment
Извините за опоздание с ответом. Я использовал параметр «-muclibc» для компилятора, который, насколько мне известно, указывает использовать библиотеку uclibc. Разве этого недостаточно? Я использую набор инструментов исходного кода, который доступен в виде предварительно созданного двоичного файла. Поэтому я не могу скомпилировать набор инструментов с uclibc. - person Akhil P Oommen; 03.09.2012
comment
@AkhilPOommen, я не уверен в этом на 100%. Возможно, придется немного погуглить. Раньше мы собирали исходный код из исходного кода, поэтому я не знаю, поставляется ли предварительно собранная версия с такой поддержкой uclibc. - person av501; 03.09.2012

Я успешно скомпилировал это

#include <iostream>
using namespace std;

int main() {
  cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
  return 0;
}

mips-linux-gnu-g++ -muclibc -mips32  main.cpp -o main
person Mario    schedule 01.03.2013