[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Кросскомпиляция на машине x86_64 в i386



о, как-то я занимался этой фигней, и вскоре еще придется, только я уж все
забыл, как оно делается, ну да вот и повод вспомнить подвернулся)) там всего
несколько пакетов надо было пересобрать, отучив от от всяких юдевов и прочего
системд, вот остались команды для сборки:

>21:23:01 290 /usr/src/rescue/build$ cat busybox-snapshot-20121124 
make ARCH=i386 CROSS_COMPILE=i486-linux-gnu- CFLAGS="-m32" \
LDEMULATION="elf_i386" busybox

>21:23:14 290 /usr/src/rescue/build$ cat lvm2-2.02.95 
./configure --host=i486-linux-gnu --бла-бла-бла.... \
LDFLAGS="-L /usr/lib/i386-linux-gnu" CC=i486-linux-gnu-gcc LD=i486-linux-gnu-ld \
CROSS_COMPILE=i486-linux-gnu LDEMULATION="elf_i386" CFLAGS="-m32"
make CC=i486-linux-gnu-gcc LD=i486-linux-gnu-ld CROSS_COMPILE=i486-linux-gnu \
LDEMULATION="elf_i386" CFLAGS="-m32" -j2

>21:23:47 290 /usr/src/rescue/build$ cat parted-2.3 
./configure --host=i486-linux-gnu --бла-бла-бла.... \
CC=i486-linux-gnu-gcc LD=i486-linux-gnu-ld CROSS_COMPILE=i486-linux-gnu \
LDEMULATION="elf_i386" CFLAGS="-m32"
make CC=i486-linux-gnu-gcc LD=i486-linux-gnu-ld CROSS_COMPILE=i486-linux-gnu \
DEMULATION="elf_i386" CFLAGS="-m32" -j2 install

>21:23:52 290 /usr/src/rescue/build$ cat cryptsetup-1.4.3/cryptsetup 
./configure --host=i486-linux-gnu --бла-бла-бла.... \
LDFLAGS="-L/usr/lib/i386-linux-gnu" CC=i486-linux-gnu-gcc LD=i486-linux-gnu-ld \
CROSS_COMPILE=i486-linux-gnu LDEMULATION="elf_i386" CFLAGS="-m32"
make CC=i486-linux-gnu-gcc LD=i486-linux-gnu-ld CROSS_COMPILE=i486-linux-gnu \
LDEMULATION="elf_i386" CFLAGS="-m32" -j2

обрати внимание на LDEMULATION и LDFLAGS, они страсть как нужны, без них лезут
какие-то косяки с линковкой.
еще иногда нужен вот такой костыль:

>21:27:34 290 /usr/src/rescue/build$ cat malloc_fix 
#!/bin/bash

# workaround to avoid autoconf bug, leading to "undefined reference"
# with rpl_malloc on rpl_realloc when cross-compiling for i386.
# if ypu build for native architecture, you don't need this

export ac_cv_func_malloc_0_nonnull=yes
export ac_cv_func_realloc_0_nonnull=yes

что касается сборки пакетов через dpkg, заморрочился я с этим только один раз,
но в итоге домучал его, и все собралось как я хотел. правда, пакет я все равно
потом расковырял и накидал бинарей вручную, ибо все это нужно для liveusb
микро-линукса, где городить пакетную систему нет смысла, ибо она собирается-то
толком один раз и надолго))
но суть в том, что пришлось мне всю муть пихать в debian/rules. переправленные
debian/rules и debian/control для cryptsetup 1.4.3 (я хз, где сейчас его взять,
но в wheezy должна быть не сильно новее версия) см. в аттаче.
да, еще помню, что dpkg-buildpackage вызывал через dpkg-architecture.

да, симлинки:
>21:40:14 290 /usr/src/rescue/build$ find /usr/bin /bin -type l -iname "*i*86*"
/usr/bin/i386
/usr/bin/i486-linux-gnu-ar
/usr/bin/i486-linux-gnu-ld
/usr/bin/i486-linux-gnu-nm
/usr/bin/i486-linux-gnu-gcc
/usr/bin/i486-linux-gnu-strip
/usr/bin/i486-linux-gnu-objcopy
/usr/bin/i486-linux-gnu-objdump
почему i486, а не 386? как-то давно я их создал, и так исторически сложилось
почему-то, ну а переименовывать лень было, так с ниим и собирал все нужное.

а вообще в каждом конкретном случае требуется индивидуальный подход и пляски с
бубном. либо нужно собирать патченный кросс-тулчейн, тогда это дело должно
получше автоматизироваться. да, либы собираются, с тем же cryptsetup нормально
все вышло, все 32-битное. после сборки имеет смысл все бинари проверять с
помощью file.

ЗЫ. а еще я умею ведро кросс-компилять через make-kpkg, если интересно. вот с
ведром, кстати, гораааздо проще все.

Attachment: control
Description: Binary data

Attachment: rules
Description: Binary data


Reply to: