Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Sourcery G++ MIPS. Ошибка сборки библиотеки libpng
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
AxaRu
Здравствуйте.

Прошу помочь мне с решением следующей проблемы.

Я хочу откомпилирвать midnight commander для медия плеера hdx bd-1 : http://www.hdx1080.com

Железка собрана на процессоре Sigma Designs SMP8642.

Внутри установлен linux
Код
sh-3.00# uname -a
Linux tango3 2.6.22.19-27-sigma #11 PREEMPT Wed Aug 25 13:46:30 CST 2010 mips GNU/Linux


На Ubuntu 10.04 в каталог /home/akhromov/CodeSourcery я установил Sourcery G++ Lite 4.3-51 for MIPS GNU/Linux отсюда: http://www.codesourcery.com

Исходники я загружаю в /home/akhromov/Stuff

Компилирую zlib.
Код
# Установил окружение

$ export PATH=$HOME/CodeSourcery/Sourcery_G++_Lite/bin:$PATH
$ export CFLAGS='-EL -march=74kc -fPIC'
$ export CXXFLAGS='-EL -march=74kc -fPIC'

cd ~/Stuff
wget http://zlib.net/zlib-1.2.4.tar.gz
tar xvzf zlib-1.2.4.tar.gz
cd zlib-1.2.4

CC=mips-linux-gnu-gcc AR=mips-linux-gnu-ar RANLIB=mips-linux-gnu-ranlib ./configure --prefix=/home/akhromov/CodeSourcery/staging_dir

make
make install


Затем компилирую libpng-1.4.1
Код
$ cd ~/Stuff
$ wget ftp://ftp.simplesystems.org/pub/libpng/png/src/libpng-1.4.1.tar.gz
$ tar xvzf libpng-1.4.1.tar.gz
$ cd libpng-1.4.1
$ export LDFLAGS="-L /home/akhromov/CodeSourcery/staging_dir/lib"
$ export CPPFLAGS="-I /home/akhromov/CodeSourcery/staging_dir/include"
$ ./configure --prefix=/home/akhromov/CodeSourcery/staging_dir --host=mips-linux-gnu
$ make


Вот здесь и начинаются первые проблемы:

Код
. . .
. . .
. . .
/bin/sh ./libtool --tag=CC   --mode=link mips-linux-gnu-gcc  -EL -march=74kc -fPIC -no-undefined -export-dynamic -version-number 14:1:0 -Wl,--version-script=libpng.vers  -L /home/akhromov/CodeSourcery/staging_dir/lib -o libpng14.la -rpath /home/akhromov/CodeSourcery/staging_dir/lib libpng14_la-png.lo libpng14_la-pngset.lo libpng14_la-pngget.lo libpng14_la-pngrutil.lo libpng14_la-pngtrans.lo libpng14_la-pngwutil.lo libpng14_la-pngread.lo libpng14_la-pngrio.lo libpng14_la-pngwio.lo libpng14_la-pngwrite.lo libpng14_la-pngrtran.lo libpng14_la-pngwtran.lo libpng14_la-pngmem.lo libpng14_la-pngerror.lo libpng14_la-pngpread.lo  -lz -lm
libtool: link: require no space between `-L' and `/home/akhromov/CodeSourcery/staging_dir/lib'
make[1]: *** [libpng14.la] Error 1


Я вручную запустил libtool, убрав пробел после `-L`

Код
akhromov@x200s:~/Stuff/libpng-1.4.1$ /bin/sh ./libtool --tag=CC   --mode=link mips-linux-gnu-gcc  -EL -march=74kc -fPIC -no-undefined -export-dynamic -version-number 14:1:0 -Wl,--version-script=libpng.vers  -L/home/akhromov/CodeSourcery/staging_dir/lib -o libpng14.la -rpath /home/akhromov/CodeSourcery/staging_dir/lib libpng14_la-png.lo libpng14_la-pngset.lo libpng14_la-pngget.lo libpng14_la-pngrutil.lo libpng14_la-pngtrans.lo libpng14_la-pngwutil.lo libpng14_la-pngread.lo libpng14_la-pngrio.lo libpng14_la-pngwio.lo libpng14_la-pngwrite.lo libpng14_la-pngrtran.lo libpng14_la-pngwtran.lo libpng14_la-pngmem.lo libpng14_la-pngerror.lo libpng14_la-pngpread.lo  -lz -lm
libtool: link: mips-linux-gnu-gcc -shared  .libs/libpng14_la-png.o .libs/libpng14_la-pngset.o .libs/libpng14_la-pngget.o .libs/libpng14_la-pngrutil.o .libs/libpng14_la-pngtrans.o .libs/libpng14_la-pngwutil.o .libs/libpng14_la-pngread.o .libs/libpng14_la-pngrio.o .libs/libpng14_la-pngwio.o .libs/libpng14_la-pngwrite.o .libs/libpng14_la-pngrtran.o .libs/libpng14_la-pngwtran.o .libs/libpng14_la-pngmem.o .libs/libpng14_la-pngerror.o .libs/libpng14_la-pngpread.o   -L/home/akhromov/CodeSourcery/staging_dir/lib -lz -lm  -march=74kc -Wl,--version-script=libpng.vers   -Wl,-soname -Wl,libpng14.so.14 -o .libs/libpng14.so.14.1.0
/home/akhromov/CodeSourcery/staging_dir/lib/libz.so: could not read symbols: File in wrong format
collect2: ld returned 1 exit status

Но получаю странную ошибку:
/home/akhromov/CodeSourcery/staging_dir/lib/libz.so: could not read symbols: File in wrong format

Файл libz.so ссылается правильно:

Код
akhromov@x200s:~$ ls -la /home/akhromov/CodeSourcery/staging_dir/lib
total 320
drwxr-xr-x 3 akhromov akhromov   4096 2010-09-26 13:16 .
drwxr-xr-x 5 akhromov akhromov   4096 2010-09-26 13:16 ..
-rw-r--r-- 1 akhromov akhromov 166250 2010-09-26 13:16 libz.a
lrwxrwxrwx 1 akhromov akhromov     13 2010-09-26 13:16 libz.so -> libz.so.1.2.4
lrwxrwxrwx 1 akhromov akhromov     13 2010-09-26 13:16 libz.so.1 -> libz.so.1.2.4
-rwxr-xr-x 1 akhromov akhromov 147068 2010-09-26 13:16 libz.so.1.2.4
drwxr-xr-x 2 akhromov akhromov   4096 2010-09-26 13:16 pkgconfig


libz.so.1.2.4, имеет вроде, как правильный формат:

Код
akhromov@x200s:~/Stuff$ mips-linux-gnu-objdump -af ~/CodeSourcery/staging_dir/lib/libz.so.1.2.4

/home/akhromov/CodeSourcery/staging_dir/lib/libz.so.1.2.4:     file format elf32-tradlittlemips
/home/akhromov/CodeSourcery/staging_dir/lib/libz.so.1.2.4
architecture: mips:isa32r2, flags 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
start address 0x000013c0

На сайте Sourcery кто-то постил такой же вопрос, но остался без ответа.

В чем может быть проблема?

С уважением, Алексей.
Petka
Цитата(AxaRu @ Sep 27 2010, 00:05) *
Затем компилирую libpng-1.4.1
...
В чем может быть проблема?

libpng уже обновился до версии 1.4.4 вряд ли в этом дело, но опробуйте обновиться.

Цитата(AxaRu @ Sep 27 2010, 00:05) *
Затем компилирую libpng-1.4.1
Код
$ cd ~/Stuff
$ wget ftp://ftp.simplesystems.org/pub/libpng/png/src/libpng-1.4.1.tar.gz
$ tar xvzf libpng-1.4.1.tar.gz
$ cd libpng-1.4.1
$ export LDFLAGS="-L /home/akhromov/CodeSourcery/staging_dir/lib"
$ export CPPFLAGS="-I /home/akhromov/CodeSourcery/staging_dir/include"
$ ./configure --prefix=/home/akhromov/CodeSourcery/staging_dir --host=mips-linux-gnu
$ make

1) Вы пробел сами оставили перед L (см выше)
2) Строчки начинающиеся с EXPORT можете не выполнять.
Попробуйте и сообщите результат.
AxaRu
Да, пробелы после <-I> и <-L> я убрал, и на команду линковки уже не ругается.

Но все равно ругается на несовместимость библиотек.
Цитата
. . .
. . .
. . .
/home/akhromov/CodeSourcery/staging_dir_44/lib/libz.so: could not read symbols: File in wrong format
collect2: ld returned 1 exit status
make[1]: *** [libpng14.la] Error 1
make[1]: Leaving directory `/home/akhromov/Stuff/libpng-1.4.4'
make: *** [all] Error 2

Как будто она берет файл не из --prefix=/home/akhromov/CodeSourcery/staging_dir, а из системы.

PS. Где то пробегало сообщение, что GCC 4.3 - якобы весь глючный. C GCC 4.4 - все то же самое.
То есть дело не в версии компилятора.
Petka
Цитата(AxaRu @ Sep 27 2010, 00:05) *
Компилирую zlib.
[code]# Установил окружение

$ export PATH=$HOME/CodeSourcery/Sourcery_G++_Lite/bin:$PATH
$ export CFLAGS='-EL -march=74kc -fPIC'
$ export CXXFLAGS='-EL -march=74kc -fPIC'

cd ~/Stuff
wget http://zlib.net/zlib-1.2.4.tar.gz
tar xvzf zlib-1.2.4.tar.gz
cd zlib-1.2.4

CC=mips-linux-gnu-gcc AR=mips-linux-gnu-ar RANLIB=mips-linux-gnu-ranlib ./configure --prefix=/home/akhromov/CodeSourcery/staging_dir

Аналогично export ы не нужны (кроме path)
переконфигурируйте
AxaRu
Спасибо за помощь

Ок. Убрал экспорты '-EL -march=74kc -fPIC'.

Все откомпилировалось без ошибок.

Но терзают меня сомнения. Вот какие:
Код
#include <stdio.h>

int factorial(int n) {
  if (n == 0)
    return 1;
  return n * factorial (n - 1);
}

int main () {
  int i;
  int n;

  for (i = 0; i < 10; ++i) {
    n = factorial (i);
    printf ("factorial(%d) = %d\n", i, n);
  }
  printf ("Hello Popcorn!\nThis cool!\n");
  return 0;
}


Компилирую:
Код
$ mips-linux-gnu-gcc -o hello hello.c
$ mips-linux-gnu-gcc -EL -march=74kc -fPIC -o hello1 hello.c


Запускаю на железке:
Код
sh-3.00# ls
hello   hello1
sh-3.00# ./hello
sh: ./hello: cannot execute binary file
sh-3.00# ./hello1
factorial(0) = 1
factorial(1) = 1
factorial(2) = 2
factorial(3) = 6
factorial(4) = 24
factorial(5) = 120
factorial(6) = 720
factorial(7) = 5040
factorial(8) = 40320
factorial(9) = 362880
Hello Popcorn!
This cool!
sh-3.00#


То есть, скомпиленная без ключей архитектуры (точнее без ключа "EL") программа не захотела запускаться.
Petka
Цитата(AxaRu @ Sep 27 2010, 11:32) *
Спасибо за помощь

Компилирую:
Код
$ mips-linux-gnu-gcc -o hello hello.c
$ mips-linux-gnu-gcc -EL -march=74kc -fPIC -o hello1 hello.c

Определите какой именно из 3х ключей нужен для запуска?
1) -EL
2) -march=74kc
3) -fPIC

P.S.
-EL это "Endian Little"
Вероятно это единственный ключ, который надо добавить в CFLAGS при конфигурации библиотек. Попробуйте. "CFLAGS = -EL ./configure --prefix=.... --host=...."
AxaRu
CODE
$ mips-linux-gnu-gcc -EL -o hello1 hello.c


Да, именно с этим ключем пример удачно запускается на целевой системе.

Но как только я указываю этот ключ при сборке библиотеки

CODE
$ CC=mips-linux-gnu-gcc \
  AR=mips-linux-gnu-ar \
  RANLIB=mips-linux-gnu-ranlib \
  LDFLAGS="-L/home/akhromov/CodeSourcery/staging_dir/lib" \
  CPPFLAGS="-I/home/akhromov/CodeSourcery/staging_dir/include" \
  CFLAGS='-EL' CXXFLAGS='-EL' \
  ./configure --prefix=/home/akhromov/CodeSourcery/staging_dir --host=mipsel-linux-gnu


результатом становится ошибка сборки:
CODE
home/akhromov/CodeSourcery/staging_dir/lib/libz.so: could not read symbols: File in wrong format
collect2: ld returned 1 exit status
make[1]: *** [libpng14.la] Error 1
make[1]: Leaving directory `/home/akhromov/Stuff/libpng-1.4.1'
make: *** [all] Error 2


Уважаемый AxaRu.
Как новичку, не имеющему ящика личных сообщений, делаю Вам пока устное замечание.
1. Не следует раздувать сообщение пробельными строками.
2. Не следует "поднимать" сообщение, чтобы привлечь к нему внимание.
3. Вообще, почитайте вдумчиво правила.
Модератор.
Petka
Код
$  CFLAGS='-EL' ./configure --prefix=/home/akhromov/CodeSourcery/staging_dir --host=mipsel-linux-gnu

попробуйте сначала так сконфигурировать и собрать zlib а только потом так же сконфигурировать и собрать libpng
AxaRu
Я так и сделал. Обе библиотеки с флагами "CFLAGS='-EL' CXXFLAGS='-EL'"пересобрал

Вот нашел эту статью. Вроде как по моей теме: Avoiding libtool minefields when cross-compiling
Petka
Цитата(AxaRu @ Sep 27 2010, 13:10) *
Я так и сделал. Обе библиотеки с флагами "CFLAGS='-EL' CXXFLAGS='-EL'"пересобрал

Всё заработало?
AxaRu
К сожалению, нет. Результат тот же.
Как вариант, остался собрать toolchain под архитектуру mipsel.
AxaRu
Огромное спасибо, что нашли время для моей задачи.

Человек с LOR'a нашел баг в libtool и предложил вот еще один способ решения костылем: CC='mips-linux-gnu-gcc -EL'
http://www.linux.org.ru/forum/development/...comment-5389074

Еще один способ решения:
http://forum.vingrad.ru/index.php?showtopi...t&p=2220699
vanner
Еще один вариант - компилировать в qemu-user chroot-е - http://www.gentoo.org/proj/en/base/embedde...rt=1&chap=5
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.