Возможна ли миграция с x86 на amd64 и обратно?
alexxy 28 ноября, 2007 - 14:55
Возможна только путем полной переустановки системы! ;-)
»
- Для комментирования войдите или зарегистрируйтесь
x86: 32 --> 64
Постепенная миграция возможна. В первую очередь binutils с возможностью компиляции под x86_64. Потом кроссовый gcc под тарджет x86_64-pc-linux-gnu. Спеков в нём не будет, поэтому он поначалу сможет только создавать объектные файлы *.o, но не сможет создавать исполняемые файлы, потому что для этого нужна libc.
Далее, создаём символические ссылки и wrapper'ы для ar, as, ld, nm, ranlib, objcopy, прочего в виде x86_64-pc-linux-gnu-ar, x86_64-pc-linux-gnu-ld, x86_64-pc-linux-gnu-nm, и так далее. Для as у меня создан wrapper x86_64-pc-linux-gnu-as:
=========
#!/bin/sh
/usr/bin/as -m64 $@
=========
Далее, в режиме кросс-компиляции собираем ядро под x86_64 со встроенной поддержкой исполнения 32-разрядного кода. И пробуем на него перейти. Обычно новое ядро заводится без проблем.
Внимание. Если у вас очень старая glibc, то могут вылетать регулярные сообщения об ошибке в файле cppflags_vmlinux.lds, и некоторых других. Не страшно. На работоспособность ядра это не влияет.
Теперь, собственно, нужна libc. Мне известно 4 разновидности: glibc, newlib, microcore(uClibc), dietlibc. Glibc большая, толстая, и собрать я её имеющимися инструментами не смог, видимо у меня не свосем прямые руки ;-) Но в конечном счёте цель стоИт собрать именно её. Newlib вообще даже конфигуряться не хочет. Dietlibc -- это не только библиотека, но и wrapper, подменяющий общесистемные инклюды и библиотеки на свои собственные. Собрался без проблем с пол-оборота. Но поскольку в dietlibc имплементировано далеко не всё что нужно, с ней мало что можно собрать. Но при этом получаем wrapper-gcc, который даёт возможность сразу получать исполняемые файлы для x86_64. И этим укрощать некоторые ./configure-скрипты, которые запинаются на ошибке Your gcc cannot create executables.
После этого конфигурируем uClibc, для этого нужно иметь работающую ncurses. После этого полученный .config-файл надо немного отредактировать вручную на предмет CC="diet x86_64-pc-linux-gnu-gcc" и настроек кросс-компиляции (будете редактировать -- походу поймёте). Инклюды и библиотеки надо проинсталлировать в отдельные каталоги (у меня это /usr/lib64, /usr/include64). Собираем БЕЗ динамик-линкера, только libc.a, libm.a, ... Если в системе очень старая glibc, то придётся также отключить поддержку локали, оставив поддержку широких чаров.
Далее. Для сборки собственно "родного" 64-битного gcc нужны 64-битные libgmp, libmpfr. Поскольку по умолчанию имеющийся "неродной" x86_64-pc-linux-gnu-gcc ни с чем не линкует, придётся немного подолбать конфигурацию. В большинстве случаев библиотеки собирались после задания переменной окружения для ./configure CC="x86_64-pc-linux-gnu-gcc -I/usr/include64 -L/usr/lib64", но некоторые версии так не собираются.
Потом собирается "родной" gcc, который по умолчанию линкует статически с uClibc.
Потом на (статически-линкованные) 64 бита переводятся системные утилиты и необходимые инструменты для сборки. m4, auto(conf/make), make, coreutils, util-linux, sysvinit, sh-utils, sed, gawk, bash, man, texinfo... Все разные демоны либо тоже переводятся в 64-битный вид (если критично), либо отключаются.
Сделать backup для корешка и /usr ОБЯЗАТЕЛЬНО. Потом звучит барабанная дробь, из каталогов /lib, /usr/lib, /usr/include удаляется ВООБЩЕ ВСЁ. Перезапуск. После успешного перезапуска разворачиваем glibc, и собираем как положено, со всеми настройками. Не забываем запустить ldconfig после инсталляции.
Затем снова собираем gcc так, чтобы по умолчанию он линковал с новособранной 64-битной glibc.
Теперь -- финишная прямая: теперь просто всё пересобираем в 64-битах как «родное». Потом в ядре поддержку исполнения 32-разрядного кода можно выключить или оставить в виде модуля ;-)
the Aquihost Rigorous Builder