https://github.com/lam-embedded/training-linux-programming
Training linux programming
https://github.com/lam-embedded/training-linux-programming
Last synced: 5 months ago
JSON representation
Training linux programming
- Host: GitHub
- URL: https://github.com/lam-embedded/training-linux-programming
- Owner: Lam-Embedded
- Created: 2025-07-10T15:34:12.000Z (12 months ago)
- Default Branch: main
- Last Pushed: 2025-07-28T18:36:05.000Z (11 months ago)
- Last Synced: 2025-07-28T20:39:27.335Z (11 months ago)
- Size: 6.84 KB
- Stars: 1
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
Training linux programming
# 1. GIỚI THIỆU MAKEFILE
- Makefile là một tệp văn bản dùng để tự động hóa việc biên dịch và xây dựng chương trình.
- make sẽ đọc Makefile và thực hiện các rules để tạo ra chương trình cuối cùng.
- Mục đích: Tiết kiệm thời gian, chỉ biên dịch lại các file đã thay đổi thay vì build lại toàn bộ.
## Cấu trúc cơ bản của Makefile
## Biến trong Makefile
- Ví dụ cho 1 file make file có nội dung như sau:
Trong đó:
- var1 = $(var) : Được gọi là phép gán đệ quy -> trong quá trình thực thi, nếu viến var1 thay đôi thì khi chạy biến var1 sẽ thay đổi
- var2 := $(var): Được gọi là phép gán trực tiếp -> sau khi gán thì cố định giá trị
- var3 ?= $(var): kiểm tra xem var3 có giá trị hay chưa, nếu var3 có giá trị rồi thì không gán giá trị cho var3 nữa
Kiểm chứng ta có thể chạy lệnh: make rule3 để xem giá trị của các biến sau khi chạy như sau:
-> Có thể thấy rằng rõ ràng đặc điểm của các biến sau khi khi biên dịch được tin lên màn hình
Tiếp theo:
- Ở rule1 và rule2 khác nhau ở @echo và echo: thì @echo sẽ in ra lệch chạy và kết quả khi chạy lệnh đó, ngược lại thì echo chỉ in ra kết quả thôi
## Tách 1 file makefile thành nhiều file makefile nhỏ
Tạo 1 file có tên abcd.mk có nội dung như sau:

trong file Makefile thêm dòng: include abcd.mk
--> Toàn bộ code trong file abcd.mk sẽ truyền trực tiếp qua file Makefile
CHÚ Ý:
- KHI GÕ make THÌ SẼ ƯU TIÊN THỰC THI RULE ĐẦU TIÊN
- KHI MUỐN THỰC THI 1 FILE .MK NÀO ĐÓ THÌ TA CÓ THỂ DÙNG CÂU LỆNH: make -f abcd.mk
CHÚ Ý: ĐỂ NGĂN NGỪA VIỆC CÓ FILE .mk NÀO ĐÓ TRÙNG TÊN VỚI RULE TRONG FILE Makefile THÌ TA CÓ DÒNG LỆNH .PHONY ...
## Ví Dụ
Tạo 1 file Makefile có nội dụng như sau:
Khi ta chạy lệnh make, thì sẽ chạy rule test có kết quả như sau:
Trong đó:
- @echo $@: cho ra tên target
- @echo $<: cho ra giá trị đầu tiên nằm bên phải dấu :
- @echo $^: cho ra toàn bộ dependence
Tiếp theo thêm nội dung sau vào file Makefile:
Chạy lênh: make hellomake sẽ cho kết quả như sau:
Trong đó:
- $(CC) -o $@ main.o hello.o $(CFLASS): là câu lệnh ẩn, tức là khi chạy lênh này chương trình sẽ tìm xem file main.o và hello.o (.o được gọi là file opject) đã được tạo hay chưa, nếu chưa thì tạo ra 2 file này và kết hợp 2 file này để biên dịch chương trình, còn nếu đã có rồi thì xét xem có thay đổi không, nếu không thì không chạy rule ẩn nữa mà biên dịch trực tiếp luông, còn nếu có thay đổi thì chạy rule ẩn
- > Không nên dùng vì tồn tại 1 số rủi do
- thay vào đó ta có thể viết như sau:
hoặc:
- Khi chạy lệnh make hellomake lại thì kết quả vẫn là:
# 2. QUÁ TRÌNH BIÊN DỊCH 1 CHƯƠNG TRÌNH C
## 2.1 Giai đoạn tiền xử lý (pre-processing)
- Loại bỏ comment
- Mở rộng macros
- Mở rộng include file
- Biên dịch các câu lệnh điều kiện
> kết quả thu được là 1 file .i
## 2.2 Giai đoạn dịch ngôn ngữ bậc cao sang asm (compilation)
- Biên dịch từ file .i sang file .S (assembly)
## 2.3 Biên dịch asm sang mã máy (Assembly)
- Biên dịch file .s sang file .0
- Thông qua Assembler output thu được là file .o. Đây là file chứa các chỉ lệnh cấp độ ngôn ngữ máy (machine language)
## 2.4 Giai đoạn Linker (Linking)
- Mỗi file .o thu được ở giai đoạn Assembly là 1 phần của chương trình
- ở giai đoạn linking sẽ liên kết chúng lại với nhau để tạo ra 1 file thực thi hoàn chình