реклама на сайте
подробности

 
 
> Кросс-компиляция под Xscale/ARM
samosad
сообщение Mar 1 2008, 20:27
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 27-02-08
Пользователь №: 35 445



Добрый вечер, прошу совета по кросс-компиляции.

Значит имеем:
хост - PC, OS OpenSUSE 10.3, с компилятором gcc, всевозможными поднятыми серверами,
таргет - Intel IXDP425, соответственно на ней процессор IXP425 архитектуры Xscale, RedBoot 1.94 / 2

Под целевую платформу собрал Linux - Snapgear 3.5 по инструкции с помощью готового toolchain
arm-linux-tools-20061213.tar.gz отсюда: http://snapgear.org/snapgear/downloads.html.

Linux на неё грузится, радостно запускается, видим командную строку.

Далее пытаюсь пишу элементарную программу типа:
file.c :
Код
main()
{
  while(1);
}

Компилирую под хост - gcc file.c - запускаю, работает;
компилирую под таргет - arm-linux-gcc -mbig-endian file.c - загружаю на платформу, запускаю, резутат типа такого: "ошибка libc.so: выполнение бинарного файла остановлено!"
(если не писать параметр -mbig-endian результат еще хуже: "can not execute binary file")
Причем этот же тулчайн (arm-linux-gcc) только что собрал рабочий Snapgear Linux под эту платформу, а элементарная прога типа этой file.c или HelloWorld просто не запускается.

И еще один вопрос - можно ли запускать исполняемые файлы прямо из под RedBoot'a? Упомянутые выше не запускаются, вызывая зависание системы.

Может кто знает, в чем проблема, подскажите, буду очень благодарен!!!

Сообщение отредактировал samosad - Mar 1 2008, 20:28
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
samosad
сообщение Mar 18 2008, 16:35
Сообщение #2





Группа: Новичок
Сообщений: 6
Регистрация: 27-02-08
Пользователь №: 35 445



Цитата
Смущение вызывает сам адрес. Это область SDRAM? Или Flash? А не занята ли эта область памяти, например RedBoot-ом? Вопросы относятся ко всем секциям.

Адрес секций тут - это как я понимаю смещение относительно базового адреса по которому записана сама программа, не так ли? Если так, то эта память в RAM и она свободная, т.к. при загрузке по этому же адресу 0x01600000 образа ядра zImage оно запускается и работает. да я и другие адреса пробовал, когда залезаешь на флешку РедБут об этом сообщает...

я бы с удовольствием делал всё под ОС но под Linux'ом тоже не получается запустить ничего...
Go to the top of the page
 
+Quote Post
amw
сообщение Mar 18 2008, 18:00
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(samosad @ Mar 18 2008, 18:35) *
Адрес секций тут - это как я понимаю смещение относительно базового адреса по которому записана сама программа, не так ли? Если так, то эта память в RAM и она свободная, т.к. при загрузке по этому же адресу 0x01600000 образа ядра zImage оно запускается и работает. да я и другие адреса пробовал, когда залезаешь на флешку РедБут об этом сообщает...

Позвольте немного базовых замечаний.
Итак смотрим на приведенный фрагмент:
Код
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .init         00000020  00008000  00008000  00008000  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .text         000024e4  00008020  00008020  00008020  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE

Немного утрировано.
Idx и Name, Size - пропускаем.
VMA - Адрес памяти, по которому производится обращение к этой секции.
LMA - Адрес памяти, по которому данная секция загружается в память перед использованием и инициализацией.
File off - Смещение от начала файла, по которому эта секция храниться на внешнем носителе.

В общем случае VMA != LMA. При наличии ОС, или просто при включенном MMU/Paging.
Будем говорить об ОС. Гипотетической, но большинство реальных ОС делают примерно так-же.

Есть часть ОС, которая "запускает программу на исполнение". Действия:
1. Открыть файл, просмотреть секции, определить размер и адреса LMA для загрузки.
2. Найти свободную память. Отобразить через MMU как непрерывный (по крайней мере для в пределах секции) кусок на адрес LMA.
3. Закрузить секции по адресам LMA в память.
4. Выполнить инициализацию секций.
5. Отобразить память с секциями на адреса VMA.
6. Запустить выполнение программы путем выполнения команды перехода по адресу Entry Point секции .text.

Это весьма утрировано, но пока сгодиться.
При отсутствии ОС и выключеном MMU LMA = VMA.
Память может начинаться с произвольного адреса (допустим начинается 256M = 0x10000000). Пограмма размером 1К. Есть только секция .text. Вопрос на засыпку: Какой размер исполняемого файла? Примерно? Конечно 1K. Это потому, что в файле нет нужды размещать секцию по ее адресу. Секция начинается с начала файла. Это и есть File off. Иначе размер файла будет 0x10000400 байтов.

Цитата
я бы с удовольствием делал всё под ОС но под Linux'ом тоже не получается запустить ничего...

Давайте решим, с чем разбираться. А то создается впечатление, что Вы просто шарахаетесь из стороны в сторону.

PS. Лучше не засорять ветку "основами". Если хотите - пишите в личку.

to moderator: прошу не пинать сильно.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 10:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01376 секунд с 7
ELECTRONIX ©2004-2016