# 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="/files/nKW6Zb6OBy3HfcAmVSyW" 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="/files/JniZs1Q1V6SyjSNzllhu" alt=""><figcaption><p>แสดงรายละเอียดโปรแกรมต่างๆ และผลลัพธ์จากการสร้างระบบไฟล์ด้วย Buildroot</p></figcaption></figure>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.aic-eec.com/computer-operation-systems/zero-to-linux-hero/anatomy-of-embedded-linux/cross-toolchains.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
