Bài viết

[Boot-BBB] 1. Build Cross compiler tool crosstool-ng

[Boot-BBB] 1. Build Cross compiler tool crosstool-ng

Chào các bạn, hôm nay mình sẽ bắt đầu 1 series mới mang tên Boot-BBB. Series này sẽ độc lập với series Yocto-BBB. Ở đây mình sẽ không dùng đến yocto mà sẽ build từ source cho crosstool-ng, u-boot, buildroot, busybox.

  1. 1. Tại sao ta bắt đầu với cross compiler tool
  2. 2 Compile croosstool-ng
  3. 3. Tạo Toolchain cho Beaglebone black bằng crosstool-ng
  4. 4. Test thử toolchain mới tạo ra
  5. 5. Tham khảo :

1. Tại sao ta bắt đầu với cross compiler tool

Embedded Linux (Nhúng Linux) sẽ bao gồm 4 thành phần chính

  • Toolchain: Compiler (trình biên dịch) và 1 số tool khác để tạo ra code cho thiết bị.
  • Bootloader: Chương trình khởi tạo cho board, và nạp kernel
  • Kernel : Trái tim của hệ thống, kiểm soát tài nguyên và giao tiếp phần cứng
  • Root file system: Chứa các thư viện, và chương trình chạy 1 khi kernel khởi tạo xong

Trong toolchain có hai kiểu trình biên dịch:

  • Native compiler : Biên dịch trêncho cùng một kiến trúc (ví dụ: build trên ARM cho ARM).
  • Cross-compiler : Biên dịch trên một kiến trúc (x86_64 laptop) nhưng tạo mã cho kiến trúc khác (ARM).

Trong thực tế, cross-compiler thường nhanh và tiện hơn cho nhà phát triển (máy build mạnh hơn, dễ tự động hoá).

Bài này mình sẽ dùng crosstool- ng để tạo toolchain phục vụ cross-compile.

2 Compile croosstool-ng

Clone source code về

1
2
git clone https://github.com/crosstool-ng/crosstool-ng
cd crosstool-ng/

Cấu hình trực tiếp tại local thay vì export tới PATH

1
2
./bootstrap
./configure --enable-local

Rồi compile thôi

1
make

3. Tạo Toolchain cho Beaglebone black bằng crosstool-ng

Các bạn có thể check list sameple xem khớp với các board nào, ở đây Beaglebone Black minh là chip a8, do đó mình check

1
2
3
4
zk47@ltu:~/Learning/Bootlin_practice/tmp/crosstool-ng$ ./ct-ng list-samples | grep a8
[L...]   arm-cortex_a8-linux-gnueabi

./ct-ng arm-cortex_a8-linux-gnueabi

Okay giờ ta phải chọn tùy chọn việc build đúng

1
./ct-ng menuconfig

Giao diện sẽ có dạng

  • Paths and misc options:
    • Logging:
      • Maximum Log Level to see = DEBUG
  • Target options
    • Target optimisations:
      • Use specific FPU = vfpv3
      • Floating point to hardware = FPU
  • Toolchain Options
    • Tuple completion and aliasing
      • Tuple’s vendor string = training
      • Tuple’s alias = arm-linux
  • Operating System
    • Target for OS
      • Options for linux
        • Version of linux = 5.15.x
  • C library
    • C library = uClibc-ng
  • C compiler
    • Options for gcc
      • Version of gcc (11.x.x)
    • Additional supported languages:
      • C++ = * (bấm space để đổi trạng thái)

Sau đó chọn save rồi exit

Okay rồi build thôi

1
./ct-ng build

Đợi cho xong, output của bạn sẽ ở

1
$HOME/x-tools/arm-training-linux-uclibcgnueabihf/bin

Để có thể sử dụng từ bất kỳ đâu, các bạn add vào PATH của phiên hiện tại

1
export PATH=$HOME/x-tools/arm-training-linux-uclibcgnueabihf/bin:$PATH

4. Test thử toolchain mới tạo ra

Ta sẽ thử compile code C vô cùng đơn giản sau

1
2
3
4
5
6
7
8
#include <stdlib.h>
#include <stdio.h>

int main (void)
{
    printf( "Hello world!\n" );
    return EXIT_SUCCESS;
}

Bạn lưu với tên helloworld.c

Ta compile nó với câu lệnh

1
arm-linux-gcc -o helloworld helloworld.c

Các bạn copy helloworld này lên board chạy là sẽ ok. hoặc ta có thể test đơn giản với qemu-arm

1
sudo apt install qemu-user

Nếu giờ bạn chạy luôn sẽ báo lỗi

1
2
zk47@ltu:~/Learning/Bootlin_practice/tmp/crosstool-ng$ qemu-arm hello 
qemu-arm: Could not open '/lib/ld-uClibc.so.0': No such file or directory

Do đó ta cần link thêm thư viện khi chạy

1
2
zk47@ltu:~/Learning/Bootlin_practice/tmp/crosstool-ng$ qemu-arm -L ~/x-tools/arm-training-linux-uclibcgnueabihf/arm-training-linux-uclibcgnueabihf/sysroot hello
Hello world!

5. Tham khảo :

Bài viết này được cấp phép bởi tác giả theo giấy phép CC BY 4.0 .