# Cross Toolchains

## เครื่องมือ Cross Toolchains

ระบบปฏิบัติการลีนุกซ์ได้จัดเตรียมเครื่องมือพื้นฐานสำหรับการพัฒนาไว้เบื้องต้นอยู่แล้วซึ่งเรียกว่า “Native Toolchain” ซึ่งตัว native toolchain จะเป็นเครื่องมือหลักในการสร้างรหัสโปรแกรมที่ให้สามารถทำงานได้ บนแพลตฟอร์มของเครื่องคอมพิวเตอร์นั้นๆ (เช่น x86 Platform) แต่ในกรณีการพัฒนาโปรแกรมสำหรับระบบสมองกลฝังตัวนั้น ไม่สามารถใช้ native toolchain ที่มากับระบบปฏิบัติการได้ เนื่องจากระบบสมองกลฝังตัวมีข้อจำกัดในเรื่องของขนาดหน่วยความจำและการเก็บข้อมูล การทำงานช้ากว่าเครื่องคอมพิวเตอร์ส่วนบุคคลและที่สำคัญไม่สามารถจะติดตั้งเครื่องมือพัฒนาทั้งหมดให้อยู่บนระบบสมองกลฝังตัวได้

ดังนั้นต้องใช้เครื่องมือพัฒนาที่สามารถแปลงรหัสเพื่อให้สามารถใช้ข้ามแพลตฟอร์มได้ซึ่งจะถูกเรียกว่า “Cross-compiling Toolchain” หรือ “Cross Toolchains” ดังรูปข้างล่างแสดงให้เห็นว่า cross-compiling toolchain จะคอมไพล์โปรแกรมที่เขียนขึ้นมาให้สามารถทำงานได้บนสถาปัตยกรรมนั้นๆ (เช่น สถาปัตยกรรม ARM) ตามที่ถูกตั้งค่าไว้ก่อนเริ่มทำการคอมไพล์ ดังตัวอย่างข้างล่าง

```shell-session
$ export ARCH=ARM
$ export CROSS_COMPILE=arm-linux-gnueabi-
$ make
```

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2F0C5J0o8xyC3FYIVpbOnM%2Fcross%20compiling.png?alt=media&#x26;token=d151b857-f214-4216-a00f-11212070f2d8" alt=""><figcaption><p>แสดงการคอมไพล์โค้ดโปรแกรมสำหรับแพลตฟอร์มทั้ง 2 แบบ</p></figcaption></figure>

## ประเภทของ Cross Toolchains

ในปัจจุบันนี้มีเครื่องมือ cross toochains ที่ช่วยในการพัฒนางานด้านสมองกลฝังตัวอยู่หลายตัว โดยอาจแบ่งออกได้เป็น 2 กลุ่มใหญ่ๆ ได้แก่

### 1. Toolchains สำเร็จรูป

* **CodeSourcery** (<http://www.codesourcery.com>/)

CodeSourcery เป็นตัวที่ออกแบบเพื่อให้สามารถใช้กับ Sourcery G++ และ Eclipse IDE ที่ทำงานร่วมกันกับ GNU Toolchain (gcc, gdb เป็นต้น) ที่รองรับสถาปัตยกรรม ARM, Coldfire, MIPS, SuperH และ PowerPC &#x20;

* **Linaro** (<http://linaro.org>/)

Linaro เป็นองค์กรที่ไม่แสวงหากำไร ซึ่งเป็นการรวมตัวกันของเหล่าวิศวกรมือดี เพื่อร่วมกันสร้างและปรับแต่ง open source และเครื่องมือต่างๆ ให้กับสถาปัตยกรรม ARM ทาง Linaro เองก็ได้จ้างคนที่พัฒนา CodeSourcery เพื่อเน้นให้เป็นเครื่องมือที่เหมาะกับสถาปัตยกรรม ARM ให้มากที่สุด&#x20;

* **DENX ELDK** (<http://www.denx.de>/)

DENX Embedded Linux Development Kit (ELDK) จะเป็นชุดเครื่องมือที่เหมาะกับระบบสมองกลฝังตัวที่ทำงานแบบเวลาจริง (real-time) บนสถาปัตยกรรม ARM, PowerPC และ MIPS ชุดเครื่องมือที่สามารถใช้ได้ฟรีตามเงื่อนไข GPL และ Free Software Licenses ประกอบไปด้วย Cross Development Tools (Compiler, Assembler, Linker เป็นต้น), Native Tools (Shell, commands และ libraries), U-Boot, Linux kernel ที่มีโค้ดโปรแกรม ไลบรารีสำหรับบอร์ดสมองกล, Xenomai (RTOS Emulation framework) และ SELF (Simple Embedded Linux Framework)

* **Scratchbox** (<http://www.scratchbox.org>/)

Scratchbox เป็นเครื่องมือที่ใช้ในการพัฒนา Maemo (Nokia [770](http://en.wikipedia.org/wiki/Nokia_770_Internet_Tablet), [N800](http://en.wikipedia.org/wiki/N800), [N810](http://en.wikipedia.org/wiki/N810) Internet Tablets และ Nokia [N900](http://en.wikipedia.org/wiki/Nokia_N900)) ซึ่งเน้นสนับสนุนสถาปัตยกรรม ARM และ x86&#x20;

### 2. Toolchain ที่ต้องสร้างเอง

* **Buildroot** (<http://buildroot.uclibc.org>/)

Buildroot เป็นเครื่องมือที่สมบูรณ์ที่นิยมตัวหนึ่งสำหรับการพัฒนาในระบบสมองกลฝังตัว และรองรับสถาปัตยกรรมหลากหลาย นักพัฒนาสามารถสร้าง RFS image (Root File System Image) ที่พร้อมจะสามารถเขียนลงแฟลช (flash) ได้ทันที นอกจากนั้นยังสามารถปรับแต่งหรือเพิ่มเติม open source อื่นเข้าไปใน RFS Image ได้ โดยตัว buildroot นี้จะสนับสนุนไลบรารีเพียง uClibc แต่ไม่สนับสนุนไลบรารี glibc

* **Crosstool-NG** (<http://crosstool-ng.org>/)

Crosstool-NG  เป็นเครื่องมือพัฒนาที่ได้รับความนิยมไม่แพ้ตัว buildroot โดยมีรูปแบบในการปรับแต่งเคอร์เนลผ่าน make menuconfig เช่นเดียวกับตัว buildroot สามารถรองรับได้ทั้ง uClibc และ glibc และมาพร้อมกับเครื่องมือในการดีบักโปรแกรม เช่น gdb, strace, dmalloc&#x20;

* **Bitbake**

Bitbake คือเครื่องมืออย่างง่ายที่ใช้ในการสร้างชุดแพกเก็ต ซึ่งถูกนำมาใช้ในโครงการ OpenEmbedded เช่น บอร์ด Ångström เป็นต้น

## องค์ประกอบหลักภายใน Cross Toolchains

รายละเอียดภายในเครื่องมือ cross toolchains ที่จะต้องนำมาใช้ในการตั้งค่าการคอมไพล์ตัวซอร์สของลีนุกซ์คอร์เนล โปรแกรมที่จำเป็นสำหรับระบบสมองกลฝังตัว (เช่น BusyBox, Openssh, DirectFB เป็นต้น) และไลบรารีที่เกี่ยวข้องต่างๆ ประกอบไปด้วย

* **Binutils** - เป็นชุดเครื่องมือที่เอาไว้ใช้ในการสร้างและจัดการไบนารีภายในโปรแกรมเพื่อให้เหมาะกับสภาพแวดล้อมบนสถาปัตยกรรมนั้นๆตัวอย่างคำสั่งได้แก่ as (Assembler), ld (Linker), ar, ranlib (สำหรับสร้างไลบรารีแบบ static), objdump, readelf, size, nm, strings, strip เป็นต้น
* **GCC Compiler** - ชุด GNU C Compiler ซึ่งเป็นชุดที่แจกฟรีสำหรับใช้ในการคอมไพล์ภาษาโปรแกรมต่างๆ เช่น C, C++, Ada, Fortran, Java, Objective-C, Objective-C++ เป็นต้น เพื่อให้สามารถทำงานได้บนสถาปัตยกรรมที่หลากหลายเช่น ARM, AVR, Blackfin, CRIS, FRV, M32, MIPS, MN10300, PowerPC, SH, v850, i386, x86\_64, IA64, Xtensa เป็นต้น
* **C/C++ Libraries** - เป็นชุดไลบรารีที่มีความสำคัญต่อระบบปฏิบัติการลีนุกซ์เป็นอย่างมากซึ่งทำหน้าที่เป็นตัวกลางในการเชื่อมต่อระหว่างโปรแกรมและลีนุกซ์คอร์เนลสำหรับการพัฒนาในระบบสมองกลฝังตัว C Libraries มีอยู่หลายแบบเช่น glibc, uClibc, eglibc, dietlibc, newlib เป็นต้น&#x20;
* **GDB Debugger** - GDB เริ่มพัฒนาโดยนายริชาร์ด สตอลแมน เมื่อ พ.ศ. 2529 เพื่อให้เป็นส่วนหนึ่งของระบบ GNU หลังจากที่เขาพัฒนา GNU Emacs จนมีความเสถียรในระดับที่น่าพอใจ ซึ่งแนวความคิดของ GDB นั้นได้มาจาก Dbx ซึ่งเป็นโปรแกรมดีบั๊กเกอร์ที่มากับระบบปฏิบัติการ Unix BSD และในปัจจุบัน GDB ก็ได้ถูกดูแลโดย GDB Steering Committee ซึ่งเป็นคณะกรรมการที่ถูกตั้งโดยมูลนิธิซอฟต์แวร์เสรี (FSF) โดย GDB จะทำงานในแบบการพิมพ์คำสั่ง (command line) ผ่านหน้าจอ Console แต่ถ้าหากต้องการดีบักผ่านโปรแกรมในลักษณะกราฟฟิก (GUI) ก็สามารถใช้โปรแกรมชื่อว่า [DDD](http://th.wikipedia.org/w/index.php?title=DDD\&action=edit\&redlink=1) แทนได้ ซึ่งโปรแกรมนี้จะทำการเรียกใช้คำสั่งของ GDB อีกต่อหนึ่ง

รูปข้างล่างเป็นตัวอย่างการนำชุดเครื่องมือ **Buildroot** มาใช้ในการสร้างและประกอบลีนุกซ์เคอร์เนล ไลบรารีและโปรแกรมประยุกต์ เพื่อนำไปฝังเข้าไปในบอร์ดสมองกลที่มีสถาปัตยกรรม ARM ต่อไปได้

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2FRSRFaTYB2fqa1jZENWZV%2Fbuildroot.png?alt=media&#x26;token=d7692d02-864a-49c8-a933-e61e912397d8" alt=""><figcaption><p>แสดงรายละเอียดโปรแกรมต่างๆ และผลลัพธ์จากการสร้างระบบไฟล์ด้วย Buildroot</p></figcaption></figure>
