ошибка seg при запуске скомпилированного кода arm-elf-gcc - PullRequest
3 голосов
/ 09 ноября 2010

Используя MacPorts, я только что установил arm-elf-gcc на свой MacBook Pro.Это сработало безупречно, и все, кажется, работает нормально.

Однако после компиляции простой тестовой программы hello world на C и C ++ и попытки запустить любую из них на целевой плате (плате на основе ARM9, работающей под Debian Linux), они немедленноseg fault.

Я немного застрял, как идти по поводу отладки, так как на целевой плате доступно ограниченное количество инструментов и нет gdb.Я успешно собрал и запустил другой код, используя кросс-компилятор Linux, поэтому он должен работать.

Любые идеи?

Следуя предложению, которое я собрал и запустил gdbserver, я получаю следующее в gdbна хосте:

Программа получила сигнал SIGSEGV, Ошибка сегментации.0x00000000 в ??()

Я подумал, что это может быть проблема со стандартными библиотеками, поэтому я удалил все вызовы и получил только пустую основную строку, которая возвращает 0, она скомпилирована с -Wall -g hello-arm.cpp -static .В качестве теста я скомпилировал тот же исходный код с помощью кросс-компилятора Linux, и он работает и работает нормально.Единственное отличие, которое я вижу, в том, что скомпилированная версия для Linux более чем в два раза больше, и разница в выводе команды file :

arm-elf-gcc: ELF 32-bit LSBисполняемый файл, ARM, версия 1, статически связанный, без зачистки

arm - * - linux: ELF 32-битный исполняемый файл LSB, ARM, версия 1, со статической связью, для GNU / Linux 2.4.18, без зачистки

Ответы [ 2 ]

2 голосов
/ 09 ноября 2010

Обычный метод отладки в этой ситуации - запустить gdbserver на целевой плате и подключиться к нему (через Ethernet) с помощью gdb, запущенного на главном компьютере.

Кроме того, вы можете попробовать сравнить сборку в программе "Hello World", скомпилированной для Mac, и (работающей) программы, скомпилированной для Linux, чтобы увидеть, в чем отличие.

1 голос
/ 10 ноября 2010

После нескольких дней копания я начинаю понимать немного больше о встроенных компиляторах. Я действительно не был уверен в разнице между arm-elf-gcc, установленным через MacPorts, и набором инструментов arm-unknown-linux, который я установил на свой Linux-блок. Я только что наткнулся на PDF-файл под названием « Введение в компилятор GNU », в котором содержится следующий абзац:

Внимание! Использование компилятора GNU для создать свой исполняемый файл не совсем так же, как с помощью GNU Linker, арм-эльф-лд, сам. Причина в что компилятор GNU автоматически связывает ряд стандартной системы библиотеки в ваш исполняемый файл. Эти библиотеки позволяют вашей программе взаимодействовать с операционной системой, чтобы использовать стандартные функции библиотеки C, использовать определенные функции языка и операции (такие как деление), и так на. Если вы хотите увидеть, какие именно библиотеки связаны в исполняемый файл, вы должны передать многословный флаг -v компилятору.

Это имеет важные последствия для встроенные системы! Такие системы не обычно есть операционная система. Это означает, что ссылки в системе библиотеки почти всегда бессмысленно: если не работает система, например, затем вызывает стандартная функция printf не делает много смысла.

Поэтому, когда я позже вернусь к своей машине разработки, я определю библиотеки, связанные со сборкой Linux, и добавлю их в сборку arm-elf-gcc.

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

...