Jump to content

    
Sign in to follow this  
AxaRu

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

Recommended Posts

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

 

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

 

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

 

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

 

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

 

Edited by AxaRu

Share this post


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

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

Share this post


Link to post
Share on other sites

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

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

Edited by AxaRu

Share this post


Link to post
Share on other sites
Компилирую 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)

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

Share this post


Link to post
Share on other sites

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

 

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

Edited by AxaRu

Share this post


Link to post
Share on other sites
Спасибо за помощь

 

Компилирую:

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

Share this post


Link to post
Share on other sites

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

Модератор.

Edited by IgorKossak

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

 

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

Edited by AxaRu

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this