LINUX.ORG.RU

Кросскомпиляция программы под ARM и segfault при запуске

 , , , ,


1

2

Доброго времени суток. Есть устройство на базе процессора Hisilicon Hi3798mv100. Пытаюсь с помощью sdk для этого чипа скомпилировать простейшую программу:

#include <stdio.h>
#include <stdlib.h>

int main(argc)
{
    printf("Hello");   
    return 0;
}

Однако при попытке запуска на целевой платформе стабильно получаю segfault. Программа запускается из initrd. В состав SDK входит компилятор arm-hisiv200-linux-gnueabi v4.4.1

Параметры с которыми вызывается компилятор:

-march=armv7-a -mcpu=cortex-a9 -D_GNU_SOURCE -Wall -O2 -g -ffunction-sections -fdata-sections -Wl,--gc-sections -DCHIP_TYPE_hi3798mv100 -DCFG_HI_SDK_VERSION=HiSTBLinuxV100R003C00SPC060 -DHI_DAC_CVBS=0 -DHI_DAC_YPBPR_Y=1 -DHI_DAC_YPBPR_PB=2 -DHI_DAC_YPBPR_PR=3 -DHI_SND_MUTECTL_GPIO= -DHI_TSI_port_NUMBER=4 -DHI_TSO_PORT_NUMBER=2 -DHI_IF0_TYPE=2 -DHI_IF0_BIT_SELECTOR=0 -DHI_TSI0_TYPE=2 -DHI_TSI0_CLK_PHASE_REVERSE=1 -DHI_TSI0_BIT_SELECTOR=0 -DHI_TSI1_TYPE=2 -DHI_TSI1_CLK_PHASE_REVERSE=1 -DHI_TSI1_BIT_SELECTOR=0 -DHI_TSI2_TYPE=2 -DHI_TSI2_CLK_PHASE_REVERSE=1 -DHI_TSI2_BIT_SELECTOR=0 -DHI_TSI3_TYPE=2 -DHI_TSI3_CLK_PHASE_REVERSE=1 -DHI_TSI3_BIT_SELECTOR=0 -DHI_TSI4_TYPE=2 -DHI_TSI4_CLK_PHASE_REVERSE=1 -DHI_TSI4_BIT_SELECTOR=0 -DHI_TSI5_TYPE=2 -DHI_TSI5_CLK_PHASE_REVERSE=1 -DHI_TSI5_BIT_SELECTOR=0 -DHI_TSO0_CLK=0 -DHI_TSO0_CLK_MODE=0 -DHI_TSO0_VALID_MODE=0 -DHI_TSO0_SERIAL=1 -DHI_TSO0_BIT_SELECTOR=0 -DHI_TSO1_CLK=0 -DHI_TSO1_CLK_MODE=0 -DHI_TSO1_VALID_MODE=0 -DHI_TSO1_SERIAL=1 -DHI_TSO1_BIT_SELECTOR=0 -DHI_TUNER_NUMBER= -DHI_TUNER0_ID=0 -DHI_TUNER_DEV_ADDR=0xc6 -DHI_DEMOD_DEV_ADDR=0xb6 -DHI_DEMOD_RESET_GPIO=0 -DHI_DEMUX_PORT=0 -DHI_DEMOD_REF_CLOCK=24000 -DHI_TUNER_MAX_LPF=34 -DHI_TUNER_I2C_CLOCK=400 -DHI_LNBCTRL_DEV_ADDR=0x0 -DHI_TER_DEMOD_REF_CLOCK=24000 -DHI_TER_TUNER_MAX_LPF=34 -DHI_TER_TUNER_I2C_CLOCK=400 -DHI_TUNER1_ID=1 -DHI_TUNER1_DEV_ADDR=0xc6 -DHI_DEMOD1_DEV_ADDR=0xb6 -DHI_DEMOD1_RESET_GPIO=0 -DHI_DEMUX1_PORT=0 -DHI_DEMOD1_REF_CLOCK=24000 -DHI_TUNER1_MAX_LPF=34 -DHI_TUNER1_I2C_CLOCK=400 -DHI_LNBCTRL1_DEV_ADDR=0x0 -DHI_TER_DEMOD1_REF_CLOCK=24000 -DHI_TER_TUNER1_MAX_LPF=34 -DHI_TER_TUNER1_I2C_CLOCK=400 -DHI_TUNER2_ID=2 -DHI_TUNER2_DEV_ADDR=0xc6 -DHI_DEMOD2_DEV_ADDR=0xb6 -DHI_DEMOD2_RESET_GPIO=0 -DHI_DEMUX2_PORT=0 -DHI_DEMOD2_REF_CLOCK=24000 -DHI_TUNER2_MAX_LPF=34 -DHI_TUNER2_I2C_CLOCK=400 -DHI_LNBCTRL2_DEV_ADDR=0x0 -DHI_TER_DEMOD2_REF_CLOCK=24000 -DHI_TER_TUNER2_MAX_LPF=34 -DHI_TER_TUNER2_I2C_CLOCK=400 -DHI_TUNER3_ID=3 -DHI_TUNER3_DEV_ADDR=0xc6 -DHI_DEMOD3_DEV_ADDR=0xb6 -DHI_DEMOD3_RESET_GPIO=0 -DHI_DEMUX3_PORT=0 -DHI_DEMOD3_REF_CLOCK=24000 -DHI_TUNER3_MAX_LPF=34 -DHI_TUNER3_I2C_CLOCK=400 -DHI_LNBCTRL3_DEV_ADDR=0x0 -DHI_TER_DEMOD3_REF_CLOCK=24000 -DHI_TER_TUNER3_MAX_LPF=34 -DHI_TER_TUNER3_I2C_CLOCK=400
Информация о платформе:
Linux version 3.18.13_s40 (root@runner-efd318d5-project-96-concurrent-2) (gcc version 4.9.2 20140904 (prerelease) (gcc-4.9.2 + glibc-2.22) 
CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c5387d
CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache

cat /proc/cpuinfo 
processor       : 0
Processor       : ARMv7 Processor rev 5 (v7l)
BogoMIPS        : 1949.69
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae 
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xc07
CPU revision    : 5

Помогите пожалуйста разобраться в причине такой ошибки или укажите направление :-), заранее спасибо.



Последнее исправление: Doctor_Dark (всего исправлений: 1)

Запусти под GDB и посмотри, где падает.

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

К сожалению пока ограничен средой. На целевой платформе только busybox)). А скомпилировать и закинуть что-либо не получается.

Doctor_Dark
() автор топика

Ну попробуй без вызова printf :)

Вообще наверно требуется пердолинг с glibc

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

А, проверь что у тебя ABI совпадают. Потому что если в системе gnueabihf, а ты собираешь gnueabi - будет примерно так же валиться. Для armv7 уже обычно используют gnueabihf

Dark_SavanT ★★★★★
()
Последнее исправление: Dark_SavanT (всего исправлений: 1)
Ответ на: комментарий от CYB3R

Моя программа: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, not stripped

busybox: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 2.6.32, stripped

Есть разница. Но насколько это критично? Там если objdump'ом посмотреть то у busybox'a есть раздел .note.ABI-tag.

.note.ABI-tag:
 10148 04000000 10000000 01000000 474e5500  ............GNU.
 10158 00000000 02000000 06000000 20000000  ............ ...

а у моей программы такого раздела нет. Это ли причина?

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

а у моей программы такого раздела нет. Это ли причина?

Вряд ли.

Попробуй статически слинковать и запустить.

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

Не уверен. Мне удалось запустить пример. Проблема исчезает если не линковать библиотеки из состава sdk. Т.е. судя по всему проблема в самих библиотеках... Сейчас попробую выяснить в какой именно библиотеке косяк.

Doctor_Dark
() автор топика
Ответ на: комментарий от CYB3R

file не покажет разницу между eabi и eabihf.

Сделай readelf -h на /bin/busybox и на твой бинарь.

Flags: 0x5000400, Version5 EABI, hard-float ABI - это eabihf
Flags: 0x5000200, Version5 EABI, soft-float ABI - это eabi
Dark_SavanT ★★★★★
()
Ответ на: комментарий от Stanson

Так и оказалось. Случайным образом вспомнил, что одна из библиотек могла быть неправильно скомпилирована. Скомпилировал заново - и всё заработало.

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

Спасибо большое за помощь и участие вам лично, и всем кто отвечал. Ваши вопросы наставили меня на путь истинный))

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