Перейти к содержанию
    

Sourcery G++ MIPS. Ошибка сборки библиотеки libpng

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

 

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

 

Я хочу откомпилирвать 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 кто-то постил такой же вопрос, но остался без ответа.

 

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

 

С уважением, Алексей.

 

Изменено пользователем AxaRu

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Затем компилирую libpng-1.4.1

...

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

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

 

Затем компилирую 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 можете не выполнять.

Попробуйте и сообщите результат.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, пробелы после <-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 - все то же самое.

То есть дело не в версии компилятора.

Изменено пользователем AxaRu

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Компилирую 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

Аналогично export ы не нужны (кроме path)

переконфигурируйте

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за помощь

 

Ок. Убрал экспорты '-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") программа не захотела запускаться.

Изменено пользователем AxaRu

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за помощь

 

Компилирую:

$ 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=...."

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

$ mips-linux-gnu-gcc -EL -o hello1 hello.c

 

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

 

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

 

$ 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

 

результатом становится ошибка сборки:

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. Вообще, почитайте вдумчиво правила.

Модератор.

Изменено пользователем IgorKossak

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

$  CFLAGS='-EL' ./configure --prefix=/home/akhromov/CodeSourcery/staging_dir --host=mipsel-linux-gnu

попробуйте сначала так сконфигурировать и собрать zlib а только потом так же сконфигурировать и собрать libpng

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я так и сделал. Обе библиотеки с флагами "CFLAGS='-EL' CXXFLAGS='-EL'"пересобрал

 

Вот нашел эту статью. Вроде как по моей теме: Avoiding libtool minefields when cross-compiling

Изменено пользователем AxaRu

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я так и сделал. Обе библиотеки с флагами "CFLAGS='-EL' CXXFLAGS='-EL'"пересобрал

Всё заработало?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

К сожалению, нет. Результат тот же.

Как вариант, остался собрать toolchain под архитектуру mipsel.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Огромное спасибо, что нашли время для моей задачи.

 

Человек с 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...