Кросс-компиляция для встроенной системы 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
компилятора. Ссылки на это можно найти здесь и здесь.