как собирать x86_64 из i386

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

как собирать x86_64 из i386

Сообщение Attid » 10.06.2009 13:20:08

есть 32 битный линукс.

хочу собрать либы паскаля для x86_64
причем как для линуха так и для венды

первым делом пробую на пролом =)

Код: Выделить всё
sudo make clean all CPU_TARGET=x86_64


получаю
Код: Выделить всё
make[5]: x86_64-linux-as: Команда не найдена

где его взять ? тут ftp://ftp.freepascal.org/fpc/contrib/cross/ не нашел, в дистрибутиве тоже или не знаю как искать.

попробывал сразу
Код: Выделить всё
sudo make clean all CPU_TARGET=x86_64 OS_TARGET=win64

прошло 0_0

закончилось такими словами :
Код: Выделить всё
-Xs -O2 -n -S2h -Fu/usr/src/fpcsrc224/rtl/units/x86_64-win64 -Fu/usr/src/fpcsrc224/packages/fcl-base/units/x86_64-win64 -Fu/usr/src/fpcsrc224/packages/fcl-xml/units/x86_64-win64 -Fu/usr/src/fpcsrc224/packages/fcl-passrc/units/x86_64-win64 -Fu/usr/src/fpcsrc224/packages/chm/units/x86_64-win64 -Fu/usr/src/fpcsrc224/packages/winunits-base/units/x86_64-win64 -Fu/usr/src/fpcsrc224/packages/winunits-jedi/units/x86_64-win64 -FE. -FUunits/x86_64-win64 -dx86_64 -dRELEASE  fpclasschart.pp
make[3]: Выход из каталога `/usr/src/fpcsrc224/utils/fpdoc'
make[2]: Выход из каталога `/usr/src/fpcsrc224/utils'
make[1]: Выход из каталога `/usr/src/fpcsrc224'
/bin/echo Build > build-stamp.x86_64-win64


пробую установить
Код: Выделить всё
sudo make install CPU_TARGET=x86_64 OS_TARGET=win64

получаю
Код: Выделить всё
/usr/bin/install: не переписываю только что созданный `/usr/local/lib/fpc/2.2.4/units/x86_64-win64/rtl/lineinfo.ppu' `/usr/src/fpcsrc224/rtl/units/x86_64-win64/lineinfo.ppu'
/usr/bin/install: не переписываю только что созданный `/usr/local/lib/fpc/2.2.4/units/x86_64-win64/rtl/lnfodwrf.ppu' `/usr/src/fpcsrc224/rtl/units/x86_64-win64/lnfodwrf.ppu'
make[4]: *** [fpc_install] Ошибка 1
make[4]: Выход из каталога `/usr/src/fpcsrc224/rtl/win64'
make[3]: *** [win64_install] Ошибка 2
make[3]: Выход из каталога `/usr/src/fpcsrc224/rtl'
make[2]: *** [rtl_distinstall] Ошибка 2
make[2]: Выход из каталога `/usr/src/fpcsrc224'
make[1]: *** [installbase] Ошибка 2
make[1]: Выход из каталога `/usr/src/fpcsrc224'
make: *** [install] Ошибка 2



подумав попробывал так :
Код: Выделить всё
sudo make clean all CPU_TARGET=x86_64 OS_TARGET=win64 > /dev/null
make[5]: Циклическая зависимость buildrtl.ppu <- macpas.ppu пропущена.
make[3]: Циклическая зависимость buildrtl.ppu <- macpas.ppu пропущена.

это может влиять ? и кто виноват ?
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: как собирать x86_64 из i386

Сообщение Attid » 14.06.2009 13:55:29

наш друг по доублекомандеру разобрался с компиляцией и сказал что там много секеса =)

в общем бинутилы они универсальные и надо делать симлинк

но потом надо иметь библиатеки от 64 с которыми надо линковать и а такого чуда в природе нет и приходится их собирать в общем все сложно и не завидно

вот оригинал :


cobines писал(а):Sadly, there is no example of compiling 32bit to 64bit.

They say binutils are universal, so they should work with any architecture. But on Debian I have a separate package 'binutils-multiarch', maybe you have something similar on your system?

In the linked web page they just create symlinks:

Код: Выделить всё
$ sudo ln -s /usr/bin/as /usr/bin/x86_64-linux-as
$ sudo ln -s /usr/bin/ld /usr/bin/x86_64-linux-ld



I tried this on my system and it works.

In the 64 to 32 bit example these were scripts, but the parameters to 'ld' and 'as' should be changed. The 'ld' man says the 'A' parameter doesn't matter, so I don't know about this.


Код: Выделить всё
#!/bin/bash
# name this file /usr/bin/i386-linux-ld
ld -A elf32-i386 $@

#!/bin/bash
# name this file /usr/bin/i386-linux-as
as --32 $@



Ok so, compiling fpc, lazarus and doublecmd was fairly easy. You create an fpc cross-compiler and compile pascal sources with it. I symlinked the 'x86_64-linux-ld' and 'x86_64-linux-as' to my regular binutils and it seemed to work, although I have no way of checking this. Also, I made a script for 'x86_64-gcc':

Код: Выделить всё
#!/bin/bash
gcc -m64 $@


and I didn't have to compile gcc myself. It works, because readelf reports the compiled object files are ELF64.

The big problem is with linking though. As I understand, you need to have a 64-bit version of every library Double Commander needs and all of their dependent libraries. DC alone needs 20+ libraries to link with - this is much work to build them manually. And many of those libraries do have problems with cross-compiling (you need to manually modify their 'configure' scripts). It took me like 3 hours to get it to link with libX11 and libgtk2.0 alone, so it's a very time consuming process and probably nobody would have the time and patience to do that. :no:

There may be another solution - much easier, although I'm not sure if it'll work. One would need to get all of the libraries already compiled from a working 64-bit system; or maybe there's a way of downloading them from some repository, I don't know. But it could be possible to put them in a separate directory and point fpc to that directory (in fpc.cfg).



бинарники проверили и они работают

Добавлено спустя 3 часа 33 минуты 6 секунд:
не нашел x86_64-win64-gorc для линуксе пришлось сделать пока так
Код: Выделить всё
cat /usr/local/bin/x86_64-win64-gorc
#!/bin/sh

cmdline="/usr/bin/wine /usr/local/bin/x_gorc.exe"

for par in $@
do
#  echo $par
  par3=`echo $par | cut -c-4`
#  echo $par3

  if [ "$par3" = "/hom" -o "$par3" = "/usr" ]
  then
    cmdline="$cmdline z:$par"
  else
    cmdline="$cmdline $par"
  fi

done

$cmdline



компиляция лазаруса прошла, смотрю дальше.

Добавлено спустя 38 минут 51 секунду:
ну вдобавок команды которые пришлось набирать в папке фпц

Код: Выделить всё
make OS_TARGET=win64 CPU_TARGET=x86_64 clean all
make OS_TARGET=win64 CPU_TARGET=x86_64 crossinstall

make OS_TARGET=linux CPU_TARGET=x86_64 clean all
make OS_TARGET=linux CPU_TARGET=x86_64 crossinstall


при компиляции win64 пришлось модифицировать Makefile.fpc чтобы не собирал gtk2 там лезли ошибки, а он мне не нужен.
и запускать crossinstall из папок rtl и packages так как в каком-то из них инстал падал и не переходил в другой.

с лазарусом все немного сложнее вышел вот такой скрипт

Код: Выделить всё
svn up
echo svn update
sleep 10
echo '************************************************'
echo '************************************************'
echo '************************************************'
cd lcl
make OS_TARGET=win32 clean all
cd ../ideintf
make OS_TARGET=win32 clean all
cd ../packager/registration
make OS_TARGET=win32 clean all
cd ../../components
make OS_TARGET=win32 clean all
cd ..
#make OS_TARGET=win32 clean bigide not work
echo win32 end
sleep 10
echo '************************************************'
echo '************************************************'
echo '************************************************'
cd lcl
make OS_TARGET=win64 CPU_TARGET=x86_64 clean all
cd ../packager/registration
make OS_TARGET=win64 CPU_TARGET=x86_64 clean all
cd ../../ideintf
make OS_TARGET=win64 CPU_TARGET=x86_64 clean all
cd ../components
make OS_TARGET=win64 CPU_TARGET=x86_64 clean all
cd ..
echo win64 end
sleep 10
echo '************************************************'
echo '************************************************'
cd lcl
make OS_TARGET=linux CPU_TARGET=x86_64 clean all
cd ../ideintf
make OS_TARGET=linux CPU_TARGET=x86_64 clean all
cd ../packager/registration
make OS_TARGET=linux CPU_TARGET=x86_64 clean all
cd ../../components
make OS_TARGET=linux CPU_TARGET=x86_64 clean all
cd ../ideintf
make OS_TARGET=linux CPU_TARGET=x86_64 clean all
cd ..
echo lin64 end
sleep 10
echo '************************************************'
echo '************************************************'
echo '************************************************'
make clean all
./lazbuild ../doublecmd/components/CmdLine/cmdbox.lpk
./lazbuild ../doublecmd/components/KASToolBar/kascomp.lpk
./lazbuild ../doublecmd/components/viewer/viewerpackage.lpk
make bigide
sleep 10
echo '************************************************'
echo '************************************************'
echo '************************************************'
cd lcl/interfaces/qt/
make clean all OPT=-dUSE_QT_44
make OS_TARGET=linux CPU_TARGET=x86_64 OPT=-dUSE_QT_44 clean all


знаю что можно упрастить если использовать цикл и переменные, но сегодня задача не стояла =) надо еще собрать приложение.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: как собирать x86_64 из i386

Сообщение sts » 11.01.2010 11:54:31

Чет у клиентов возня по 64бит началась, понадобилось скомпилить прогу из по win32 для win64
скачал 64бит фпц и лазарь, настроил всякие пути при тесте стал выдавать такое:
D:lazarusfpc2.2.4bini386-win32fpc.exe -MObjFPC -Scgi -O1 -TWin64 -Px86_64 -gl -va -l -FuD:lazarusindyfpc -FuD:lazarusindylazarus -FuD:lazarusfpc2.2.4unitsx86_64-win64rtl -FuD:lazaruslclunitsx86_64-win64 -FuD:lazaruslclunitsx86_64-win64win32 -FuD:lazaruspackagerunitsx86_64-win64 -FuD:ProjectsTest1netprinter2Test10 -Fu. -dLCL -dLCLwin32 C:DOCUME~1stsLOCALS~1Temptestcompileroptions.pas

ОШИБКА: откомпилированный модуль FPC не найден: system.ppu
ОШИБКА: откомпилированный модуль FPC не найден: sysutils.ppu
ОШИБКА: откомпилированный модуль FPC не найден: classes.ppu
ОШИБКА: откомпилированный модуль FPC не найден: avl_tree.ppu
ОШИБКА: откомпилированный модуль FPC не найден: zstream.ppu


хотя эти ppu в наличии

где копать ?

Добавлено спустя 8 минут 45 секунд:
после сохранения настроек проекта лезет ошибка
Error: ppcx64.exe can't be executed, error message: Failed to execute ""ppcx64.exe" -MObjFPC -Scgi -O1 -TWin64 -gl -va -l -FuD:\lazarus\indy\fpc\ -FuD:\lazarus\indy\lazarus\ -FuD:\lazarus\fpc\2.2.4\units\x86_64-win64\rtl\ -FuD:\lazarus\lcl\units\x86_64-win64\ -FuD:\lazarus\lcl\units\x86_64-win64\win32\ -FuD:\lazarus\packager\units\x86_64-win64\ -FuD:\Projects\Test1\netprinter2\Test10\ -Fu. -dLCL -dLCLwin32 C:\DOCUME~1\sts\LOCALS~1\Temp\testcompileroptions.pas


зачем он пытается запустить ppcx64.exe ? лазарус запущен же под win32
sts
постоялец
 
Сообщения: 451
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: как собирать x86_64 из i386

Сообщение Attid » 12.01.2010 11:53:11

sts писал(а):скачал 64бит фпц и лазарь, настроил всякие пути при тесте стал выдавать такое:

тебе нужен был только кроскомпилятор, потом перекомпилировать паскаль под х64 а потом лазарус.
sts писал(а):зачем он пытается запустить ppcx64.exe ? лазарус запущен же под win32

так и должно быть. в лине по крайней мере у меня также.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: как собирать x86_64 из i386

Сообщение sts » 13.01.2010 11:27:10

как так? ppcx64.exe 64битная прога и под win32 она просто не запускается.

хотя не важно уже, обошелся виртуализацией, все равно тестировать надо под win64
sts
постоялец
 
Сообщения: 451
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru