Biên dịch chéo GLIBC cho ARM SoC của tôi


13

Tôi đang thấy một cái gì đó thực sự kỳ lạ trong armelmôi trường Debian chroot-ed .

Nhưng trước tiên, một chút lạc hậu ... Điều này còn dài, nhưng câu hỏi rất phức tạp và bất kỳ trợ giúp tiềm năng nào phụ thuộc vào việc biết toàn bộ câu chuyện.

Tôi có một SoC ARM nhúng chạy Linux - cụ thể hơn là Debian armelLenny trên kernel 2.6.17. Bản phân phối Debian có thể dễ dàng nâng cấp lên các phiên bản mới hơn ( sudo apt-get dist-upgrade) và do đó có thể được tăng tốc, lên các armelphiên bản squeezehoặc thậm chí wheezy.

Vấn đề là kernel là một tùy chỉnh ... SoC ARM trong câu hỏi không phải là một phần của kernel chính, vì vậy nó bị bỏ rơi khá nhiều ở 2.6.17.

Nếu bạn biết Linux và GLIBC hoạt động như thế nào, bạn đã có thể thấy vấn đề - các phiên bản GLIBC được biên dịch với phiên bản kernel được hỗ trợ tối thiểu ... Điều này đã vượt qua 2.6.17. Vì vậy, nếu chúng ta cố gắng ví dụ như chroot vào một ...

$ # 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

... Chúng tôi thấy một thông báo từ GLIBC squeeze, nói với chúng tôi rằng nó không được biên dịch để hoạt động với kernel cũ này (2.6.17).

Vấn đề tương tự cũng xảy ra với wheezy - vì nó mới hơn so với bóp - và thực tế sẽ xảy ra với bất kỳ phiên bản Debian nào kể từ bây giờ, vì GLIBC của chúng sẽ không hoạt động trên kernel 2.6.17 của tôi.

Lúc đầu, tôi nghĩ rằng đây là một công cụ thỏa thuận - nhưng sau đó tôi nhận ra rằng về mặt lý thuyết tôi có thể biên dịch lại GLIBC để làm việc với hạt nhân cũ mà SoC của tôi đang sử dụng ... Nhưng tôi cần một môi trường giống hệt với những gì được sử dụng để xây dựng libc6 gói trong ví dụ Debian ép.

Tôi đoán việc biên dịch GLIBC và chuẩn bị tệp libc6_2.11.3-4.deb được thực hiện thông qua máy móc biên dịch chéo tự động được phát minh bởi các vị thần của Debian.

Tôi không phải là Chúa ... tôi cũng không thể tìm thấy bất cứ điều gì ở Google về cách trở thành một - tức là cách sử dụng Core i5 của tôi làm máy chủ, để biên dịch chéo GLIBC bằng cách sử dụng chính các cài đặt mà phiên bản đóng gói (bên trong Debian squeeze) sử dụng.

Vì vậy, tôi đã lừa nó - Tôi đã tìm ra cách thiết lập phiên bản ARM của Debian ép trên Core i5 của tôi (một kỹ thuật sử dụng phiên bản tĩnh của qemu-armnhị phân).

Khi tôi đã chọn trong phiên bản được lưu trữ x86 của mình Debian-armel-squeeze, tôi có thể chỉ cần ...

$ 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

... và sau 3 giờ (phiên bản chroot được lưu trữ trên Core i5 Debian-armel-squeezechậm hơn nhiều so với máy gốc ...) Tôi đã nhận được gói libc6 .deb của mình. Có lẽ sẽ mất 3 tháng để thực hiện việc xây dựng này trong SoC của tôi, vì vậy tôi không phàn nàn.

Quay trở lại bên trong ARM SoC thực sự của tôi, tôi đã sao chép tất cả các tệp libc (.so) của gói mới qua các gói mặc định và cố gắng chroot ...

# chroot squeeze/
root@ttsiodras:/# 

Đúng! Nó đã làm việc! (hoặc có vẻ như vậy)

Libc tùy chỉnh của tôi báo cáo từ bên trong 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/>.

Mọi thứ dường như hoạt động - Tôi đã sao chép một tập tin, gọi ls...

Nhưng khi tôi cố gắng sử dụng apt-getđể cài đặt một số ứng dụng từ đó squeeze, tôi bắt đầu gặp ... một số lỗi không mong muốn:

# 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)

Oh-oh ... một loạt các Function not implemented. Nghe có vẻ như GLIBC báo cáo rằng những điều cơ bản không hoạt động ...

Tôi quản lý để strace (đừng hỏi làm thế nào) và đã tìm ra rằng tất cả các -atchức năng đang thất bại: openat, mkdirat, renameat, vv - tất cả chúng đều ENOSYS báo cáo.

Có vẻ như tôi chỉ thành công một phần - một số cuộc gọi hệ thống đang thất bại trong GLIBC mới của tôi.

Có thể biên dịch một squeezehoặc wheezeGLIBC để thực thi theo 2.6.17 không?

Bất kỳ ý tưởng / gợi ý nào về những gì tôi đã làm sai và / hoặc cách tiến hành sẽ được đánh giá cao ...


Thiết lập trình biên dịch chéo không khó lắm và có hướng dẫn trên web cho việc này. Nó sẽ nhanh hơn đáng kể so với việc chạy trình biên dịch trong Qemu. Tôi không biết nếu nó sẽ giúp với libc kết quả không hoạt động.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles: Liên quan đến "hướng dẫn" - bạn có thể chỉ ra điều gì cụ thể không? Tôi đã thử crosstool-ng nhưng nó không đi xa như phiên bản kernel đích của tôi (2.6.17). Tôi nghĩ điều này có liên quan - glibc phải được biên dịch với các tiêu đề từ kernel của tôi (có thể đó là nguyên nhân gây ra sự cố của tôi trong bản dựng "dựa trên ARM" của tôi ...)
ttsiodras

Câu trả lời:


7

Tôi đã làm việc đó :-)

Về cơ bản, tôi đã làm theo lời khuyên của Gilles và quyết định thực hiện đúng: tức là quản lý việc biên dịch chéo hoàn chỉnh GLIBC. Tôi bắt đầu từ crosstool-ng, và ban đầu thất vọng - thấy rằng nó không hỗ trợ kernel cũ của tôi. Mặc dù vậy, tôi vẫn giữ nó - chỉnh sửa thủ công tệp cấu hình được lưu bởi crosstool-ng để thực hiện các thay đổi như thế này trên cấu hình bản dựng arm-gnueabi mặc định:

$ 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

Sau nhiều lần thử nghiệm và thất bại, những thay đổi ở trên đã thực hiện - Tôi đã nhận được một phiên bản GLIBC được biên dịch sẽ hoạt động với kernel của mình và sao chép các tệp kết quả vào máy ARM Lenny ARM của tôi:

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

Tôi đã đi tất cả các cách và chuyển bóp quá khứ: Tôi debootstrapped a / khò khè và sau đó - rất cẩn thận - ghi đè lên các phiên bản glibc của armel-debootstrapped /wheezyvới riêng tôi:

# # 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
...

... vân vân, đảm bảo tôi không bỏ lỡ bất kỳ thư viện chia sẻ nào.

Cuối cùng, tôi đã sao chép qua các tệp nhị phân lddldconfigcũng là một phần của GLIBC) và được trích dẫn trong / tôi khò khè.

Nó đã làm việc.

Tôi chỉ có thể giả định rằng việc biên dịch GLIBC từ mô phỏng chroot-ed 'qemu-arm' bên trong x86, bằng cách nào đó đã làm mọi thứ rối tung lên - có thể configurequá trình phát hiện một số nội dung từ môi trường đang chạy - trong khi quá trình biên dịch chéo không thể bị nhầm lẫn .

Vì vậy, một cách tự nhiên, tôi chuyển sang bước tiếp theo và sử dụng lớp vỏ bận-tĩnh để thay thế các thư mục {/ bin, / sbin, ...} của đồng xu cũ của tôi bằng những cái khò khè - và khởi động lại vào Wheezy hoàn toàn mới của tôi :-)

Tôi xin cam đoan rằng WD MyBook World Edition của tôiphiên bản duy nhất trên hành tinh chạy Debian Wheezy :-) Nếu có ai quan tâm, tôi có thể tải lên một tarball các tệp libc ở đâu đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.