Перехресне складання GLIBC для мого ARM SoC


13

Я бачу щось по-справжньому дивне в середовищі Debian з хротованими видами armel.

Але по-перше, трохи історії… Це довго, але питання складне, і будь-яка потенційна допомога залежить від знання повної історії.

У мене є вбудований ARM SoC, який працює під управлінням Linux - точніше, Debian armelLenny на ядрі 2.6.17. Сам дистрибутив Debian легко модернізувати до більш пізніх версій ( sudo apt-get dist-upgrade) і таким чином може бути доведений до швидкості, до armelверсій squeezeабо навіть wheezy.

Проблема полягає в тому, що ядро ​​- це нестандартне ... Запропонований ARM SoC не є частиною основного ядра, тому його в значній мірі занедбано в 2.6.17.

Якщо ви знаєте, як працюють Linux та GLIBC, ви вже можете побачити проблему - версії GLIBC компілюються з мінімально підтримуваною версією ядра ... Яка просунулася минуло 2.6.17. Тож якщо ми спробуємо, наприклад, chroot до Debian вичавити ...

$ # From inside the little ARM machine running Debian Lenny
$ sudo debootstrap --arch armel squeeze /squeeze \
     http://ftp.whateverCountry.debian.org/debian
$ sudo -i
# mount -t proc none /squeeze/proc
# mount -t sysfs none /squeeze/sys
# mount -t devpts none /squeeze/dev/pts
# chroot /squeeze
Fatal: Kernel too old

... ми бачимо повідомлення від GLIBC від squeeze, яке повідомляє нам, що воно не було складено для роботи зі цим старим ядром (2.6.17).

Ця ж проблема трапляється і з wheezy - оскільки вона є новішою, ніж стискання - і фактично відбуватиметься з будь-якою версією Debian відтепер, оскільки їх GLIBC не буде працювати на моєму ядрі 2.6.17.

Спочатку я подумав, що це розрив угоди, але потім я зрозумів, що теоретично можу перекомпілювати GLIBC для роботи зі старшим ядром, який використовує мій SoC ... Але мені знадобиться ідентичне середовище, яке було використано для створення libc6 пакет, наприклад, стиснення Debian.

Я здогадуюсь, компіляція GLIBC та підготовка файлу libc6_2.11.3-4.deb здійснюється за допомогою автоматизованої машини перехресного складання, винайденої богами Debian.

Я не Бог ... і я не міг знайти нічого в Google про те, як стати ним, тобто як використовувати свій Core i5 в якості хоста, щоб перехресно компілювати GLIBC, використовуючи ті самі налаштування, що і упакована версія (всередині Debian squeeze) використовуючи.

Тому я обдурив це - я зрозумів, як налаштувати ARM-версію Debian на моєму Core i5 (методика, що використовує статичну версію qemu-armбінарного файлу).

Після того, як я зареєструвався у своїй версії, розміщеній на x86 Debian-armel-squeeze, я зміг просто ...

$ cd /var/tmp
$ apt-get source libc6
...
$ # edit this in - compile for my kernel...
$ vi eglibc-2.11.3/debian/sysdeps/linux.mk
...
MIN_KERNEL_SUPPORTED := 2.6.17
...
$ export DEB_BUILD_OPTS="nocheck parallel=1"
$ cd eglibc-2.11.3
$ dpkg-buildpackage -b -d -us -uc

... і через 3 години (Core i5 з розміщеною версією Debian-armel-squeezeнабагато повільніше, ніж рідна машина ...) я отримав свій пакет libc6 .deb. Можливо, це займе 3 місяці, щоб зробити цю збірку в моєму SoC, тому я не скаржусь.

Повернувшись всередину свого справжнього ARM SoC, я скопіював усі файли libc (.so) нового пакету через типові стискання та спробував chroot ...

# chroot squeeze/
root@ttsiodras:/# 

Так! Це спрацювало! (або так здавалося)

Мій власний libc повідомив зсередини chroot:

# /lib/libc.so.6 
GNU C Library (Debian EGLIBC 2.11.3-4) stable release version 2.11.3, by Roland McGrath et al.
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.4.5.
Compiled on a Linux 2.6.26 system on 2014-10-23.
Available extensions:
        crypt add-on version 2.1 by Michael Glad and others
        GNU Libidn by Simon Josefsson
        Native POSIX Threads Library by Ulrich Drepper et al
        Support for some architectures added on, not maintained in glibc core.
        BIND-8.2.3-T5B
For bug reporting instructions, please see:
<http://www.debian.org/Bugs/>.

Начебто справи працювали - я скопіював файл, викликав ls...

Але коли я спробував використати apt-getдля установки деяких додатків squeeze, я почав отримувати ... деякі несподівані помилки:

# apt-get install indent
Reading package lists... Done
Building dependency tree... Done
The following NEW packages will be installed:
  indent
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 110 kB of archives.
After this operation, 516 kB of additional disk space will be used.
Get:1 http://ftp.gr.debian.org/debian/ squeeze/main indent armel 2.2.11-1 [110 kB]
Fetched 110 kB in 0s (236 kB/s)

tar: ./control: Cannot utime: Function not implemented
tar: ./md5sums: Cannot utime: Function not implemented
tar: .: Cannot utime: Function not implemented
tar: Exiting with failure status due to previous errors

dpkg-deb: subprocess tar returned error exit status 2
dpkg: error processing /var/cache/apt/archives/indent_2.2.11-1_armel.deb (--unpack):
 subprocess dpkg-deb --control returned error exit status 2
configured to not write apport reports

rm: cannot remove `/var/lib/dpkg/tmp.ci': Function not implemented

dpkg: error while cleaning up:
 subprocess rm cleanup returned error exit status 1
Errors were encountered while processing:
 /var/cache/apt/archives/indent_2.2.11-1_armel.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

О-о-о ... купа Function not implemented. Це звучить як повідомлення GLIBC про те, що основні речі не працюють ...

Мені вдалося Трасування (не питайте , як) і з'ясували , що всі -atфункції зазнають невдачі: openat, mkdirat, renameatі т.д. - всі вони ENOSYS звітності.

Здається, що я був частково успішним - деякі системні дзвінки провалюються в моєму новому GLIBC.

Чи неможливо скомпілювати a squeezeчи wheezeGLIBC для виконання згідно 2.6.17?

Будемо дуже вдячні за будь-які ідеї / вказівки щодо того, що я зробив неправильно та / або як робити далі ...


Налаштування крос-компілятора не так складно, і в Інтернеті є навчальні посібники для цього. Це буде значно швидше, ніж запуск компілятора в Qemu. Я не знаю, чи допоможе це в тому випадку, коли отриманий libc не працює.
Жил 'SO- перестань бути злим'

@Gilles: Щодо "підручників" - чи можете ви вказати на що-небудь конкретне? Я спробував crosstool-ng, але це не так далеко, як моя цільова версія ядра (2.6.17). Я думаю, що це актуально - glibc повинен бути зібраний із заголовками з мого ядра (можливо, саме це спричиняє мої проблеми в моїй збірці "на основі ARM ..."
ttsiodras

Відповіді:


7

Я зробив це :-)

Я в основному дотримувався порад Жилла і вирішив зробити це належним чином: тобто керувати повною перехресною компіляцією GLIBC. Я почав з crosstool-ng і спочатку був розчарований - побачивши, що він не підтримує моє старе ядро. Я тримався на цьому, однак - вручну редагувавши конфігураційний файл, збережений crosstool-ng, щоб зробити такі зміни, як ці в конфігурації збірки arm-gnueabi за замовчуванням:

$ ct-ng arm-unknown-linux-gnueabi
$ ct-ng menuconfig
...
$ vi .config
$ cat .config
...
CT_KERNEL_VERSION="2.6.17"
CT_KERNEL_V_2_6_17=y
CT_LIBC_VERSION="2.13"
CT_LIBC_GLIBC_V_2_13=y
CT_LIBC_GLIBC_MIN_KERNEL_VERSION="2.6.9"
CT_LIBC_GLIBC_MIN_KERNEL="2.6.9
...
$ ct-ng +libc

Після численних тестів і невдалих спроб, зазначені вище зміни зробили це - я отримав компільовану версію GLIBC, яка працювала б з моїм ядром, і скопіював отримані файли на мій ARM-апарат Debian Lenny:

$ cd .build/arm-unknown-linux-gnueabi/build/build-libc-final/
$ tar zcpf newlibc.tgz $(find . -type f -iname \*.so)
$ scp newlibc.tgz root@mybook:.

Я пройшов увесь шлях і проїхав повз стискання: я перезавантажив a / wheezy, а потім - дуже обережно - перезаписав версії GLIBC для дебютного верблюда /wheezyз моїми власними:

# # In the ARM machine
# cd /wheezy/lib/arm-linux-gnueabi/
# mv /var/tmp/ohMyGod/libc.so libc-2.13.so
# mv /var/tmp/ohMyGod/rt/librt.so librt-2.13.so
...

... тощо, переконайтесь, що я не пропустив жодної спільної бібліотеки.

Нарешті, я скопіював над lddта ldconfigбінарні файли (які також були частиною GLIBC), і вписав всередину мого / хрипу.

Це спрацювало.

Я можу лише припустити, що компіляція GLIBC з емуляції 'qemu-arm' chroot-ed всередині x86 якось переплутала речі - можливо, configureпроцес виявляє деякі речі з поточного середовища - тоді як перехресна компіляція не може бути введена в оману .

Тож, природно, я перейшов до наступного кроку і застосував статичну оболонку зайнятого ящика, щоб замінити {/ bin, / sbin, ...} папки моєї старої ленни на хрипкі - і перезавантажив свою нову Wheezy :-)

Я заявляю, що моя WD MyBook World Edition є єдиною на планеті, де працює Debian Wheezy :-) Якщо хтось інший зацікавлений, я можу десь завантажити тарілку файлів libc.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.