Кросс-компиляция для встроенной системы Linux на базе ARM

Я пытаюсь скомпилировать некоторый код C для встроенной (пользовательской) ARM-системы Linux. Я создал виртуальную машину Ubuntu с кросс-компилятором arm-linux-gnueabi-gcc-4.4, потому что это выглядело так, как мне нужно. Теперь, когда я компилирую свой код с помощью этого gcc, он создает двоичный файл:

$ file test1
test1: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked
(uses shared libs), for GNU/Linux 2.6.31,
BuildID[sha1]=0x51b8d560584735be87adbfb60008d33b11fe5f07, not stripped

когда я пытаюсь запустить этот двоичный файл во встроенном Linux, я получаю

$ ./test1
-sh: ./test1: not found

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

$ file referenceBinary
referenceBinary: ELF 32-bit LSB executable, ARM, version 1, dynamically linked
(uses shared libs), stripped

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

еще одна вещь, на которую я посмотрел, - это зависимости:

$ ldd test1
    libc.so.6 => not found (0x00000000)
    /lib/ld-linux.so.3 => /lib/ld-linux.so.3 (0x00000000)

(интересно, что это работает в целевой системе, хотя она не может выполнить двоичный файл.) Встроенная система имеет только libc.so.0 доступен. Думаю, мне нужно ... скажите компилятору версию libc, на которую я хочу ссылаться, но, как я понимаю, gcc просто ссылается на версию, с которой она поставляется, это правильно? Что я могу с этим поделать?

Edit: вот Makefile, который я использую:

CC=/usr/bin/arm-linux-gnueabi-gcc-4.4
STRIP=/usr/bin/arm-linux-gnueabi-strip          
CFLAGS=-I/usr/arm-linux-gnueabi/include             
LDFLAGS=-nostdlib
LDLIBS=../libc.so.0

SRCS=test1.c
OBJS=$(subst .c,.o,$(SRCS))

all: test1

test1: $(OBJS)
    $(CC) $(LDFLAGS) -o main $(OBJS) $(LDLIBS)
    $(STRIP) main

depend: .depend

.depend: $(SRCS)
    rm -f ./.depend
    $(CC) $(CFLAGS) -MM $^>>./.depend;

clean:
    rm -f $(OBJS)

include .depend

1 ответов


что вы, вероятно, должны сделать, это установить libc6 на встроенной системе. Читать этой теме о похожей проблеме. Решением в post #5 было установить:

libc6_2.3.6.ds1-13etch9_arm.deb
linux-kernel-headers_2.6.18-7_arm.deb
libc6-dev_2.3.6.ds1-13etch9_arm.deb

ваш другой вариант-получить libc из встроенной системы на вашу виртуальную машину, а затем передайте ее в gcc linker и использовать .

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

другие вещи, чтобы попробовать:

на этой теме они предлагают удалить -mabi=apcs-gnu флаг из вашего makefile, если вы используете его.

в этой статье предлагает feedint gcc -nostdlib флаг, если вы компилируете из командной строки.

или вы можете переключиться на использование arm-none-eabi-gcc компилятора. Ссылки на это можно найти здесь и здесь.