LINUX.ORG.RU

Избирательно работающая программа


0

1

Здравствуйте!

Разрабатываю программу для робота под дистрибутив X-linux. На бортовом компьютере стоит процессор Vortex-SX86 с архитектурой x86.

Решил начать с чего-нибудь простого, вроде этого:


#include <stdio.h>
int main()
{
printf(«test»);
return 0;
}

g++ test.cpp -o test

Программа чудесным образом работает на моем компьютере под убунтой, но вызывает segmentation fault при запуске на бортовом компьютере. ldd test дает это:
Segmentation fault
Segmentation fault
ldd: /lib/ld-linux.so.2 $exited with unknown exit code (139)

Подскажите, пожалуйста, в чем может быть дело.


Т.е. ты бинарь на бубунте собрал, и на этот X-linux скопировал?

anonymous ()
Ответ на: комментарий от PentagramPro

Библиотеки стандартные, скорее всего, бинарно несовместимы. При линковке под убунтой нужно использовать библиотеки среды назначения.

schizoid ★★★ ()
Ответ на: комментарий от schizoid

То есть, мне следует вынуть все библиотеки из среды назначения, сложить их в отдельную директорию и натравить на нее компилятор?

PentagramPro ()
Ответ на: комментарий от silw

Зачем мне кросс-компиляция, если платформы одинаковые? Отличаются только версии системных библиотек.

PentagramPro ()
Ответ на: комментарий от PentagramPro

Это в определённом смысле тоже кросс-компиляция. Тебе нужен toolchain подходящий к твоей системе бортовика.

Dark_SavanT ★★★★★ ()
Ответ на: комментарий от Dark_SavanT

Ох, черт... как-то очень захотелось заменить этот дистрибутив чем-нибудь менее.. тайваньским. Ну дебианом, например. Проблема только в том, что непонятно, как запустить установку.

PentagramPro ()
Ответ на: комментарий от PentagramPro

А разница? Там тоже либы другие будут. Если у тебя платформы одинаковые, то можешь пока просто статически скомпилировать бинарь.

Tark ★★ ()
Ответ на: комментарий от Tark

Вот, я сейчас это сделал и все равно при запуске получаю Segmentation Fault

PentagramPro ()
Ответ на: комментарий от PentagramPro

Значит неправильно сделал, что я могу сказать. А архитектуры точно одинаковые? Ну там не 64 бита где-то?

Tark ★★ ()
Ответ на: комментарий от Tark

Точно одинаковые, я специально плату подбирал с такой же архитектурой. А сделал вроде правильно - файл вырос в объеме в 100 раз, как и положено :) g++ test.cpp -o test -static-libgcc -static

PentagramPro ()
Ответ на: комментарий от PentagramPro

Я имел в виду, что на компе то не 64 битная система?

Tark ★★ ()
Ответ на: комментарий от Tark

А, нет, тоже x86

Попробовал такой вариант:
gcc test.c -o test -static

тот же результат

PentagramPro ()
Ответ на: комментарий от Tark

file test test: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.15, not stripped

PentagramPro ()

советую юзать buildroot для таких вещей. оно и поновей все скачает, и тулчейн предоставит

VladimirMalyk ★★★★★ ()

попробуй сначала что-нибудь попроще — например

.globl _start
_start:
mov $1, %eax
mov $42, %ebx
int $0x80
as test.s -o test.o
ld test.o -o test
./test
echo $? # должо быть 42

если и тут неудача, значит, скорее всего, с ld-linux.so на железке какая-то беда.

а вообще — зря на x86 брал, ей-богу сейчас с arm именно в смысле компиляции и то проще — скачал с codesourcery бинарник с gcc и друзьями и компили сколько хочешь.

anonymous ()
Ответ на: комментарий от anonymous

А у меня есть еще одна плата, с arm как раз. Но там микропроцессор без memory management unit, и меня пугает потенциальное обилие танцев с бубном при установке.

PentagramPro ()
Ответ на: комментарий от anonymous

Сделал эту программу и запустил. Никаких ошибок не произошло. Надо же :)

PentagramPro ()
Ответ на: комментарий от PentagramPro

ну отлично, теперь мы знаем, что хотя бы binutils работают.

можно двигаться дальше примерно в этом же направлении — скажем, теперь скомпилить (уже gcc)

[code]int main(){return 42;}[/code]

по смыслу, мы хотим найти проблемное место. наличие gdb на железке может помочь, а может и нет (дебажить проблемы в сишном рантайме не очень просто), поэтому я и предлагаю вместо этого итеративный метод.

anonymous ()

Он вроде не поддерживает MMX/SSE - 486 процессор, вроде проблема в этом.

XVilka ★★★★ ()
Ответ на: комментарий от XVilka

486 не только MMX не поддерживает, но в общем-то в рантайме ничего особо новомодного использоваться не должно.

можно, конечно, попробовать сказать -march=i486.

anonymous ()
Ответ на: комментарий от anonymous

Скомпилировал с gcc test.c -march=i486 -o test

Результат такой: segfault at b7f48688 ip такой-то bp такой-то error 6 in ld-linux.so.2

PentagramPro ()
Ответ на: комментарий от anonymous

бубенту же вроде теперь под i686 собирают

anonymous ()

а g++ на x-linux поставить никак нельзя? потом прямо там и собирать...

olegsov ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.