Linux 核心由 C 撰寫,系統工具鏈對 C 支援極致完善。掌握 Linux C 開發流程,是理解作業系統、提升底層功力的必經之路。
| 工具 | 用途 | 套件名 (Ubuntu/Debian) |
|---|---|---|
| gcc | C 編譯器 | build-essential |
| gdb | 原始碼級除錯器 | gdb |
| make | 自動化建構腳本 | make |
| objdump | 反組譯/目標檔分析 | binutils |
| ld | 連結器 | binutils |
/* hello.c */
#include <stdio.h>
int main() {
printf("hello!\n");
return 0;
}
$ gcc hello.c -o hello # 編譯連結產生執行檔 hello
$ ./hello # 執行
hello!
/* iterate.c */
#include <stdio.h>
int iterate(int value) {
if (1 == value) return 1;
return iterate(value - 1) + value;
}
int main() {
printf("%d\n", iterate(10)); // 55
return 0;
}
-g
$ gcc -g iterate.c -o iterate
$ gdb ./iterate
(gdb) break main
(gdb) run
(gdb) bt # 查看呼叫堆疊
(gdb) print value # 觀察變數
$ gcc -g hello.c -o hello
$ objdump -S -d ./hello # -S 交錯顯示原始碼,-d 反組譯
輸出片段:
int iterate(int value) {
8048374: 55 push %ebp
8048375: 89 e5 mov %esp,%ebp
8048377: 83 ec 08 sub $0x8,%esp
if(1 == value)
804837a: 83 7d 08 01 cmpl $0x1,0x8(%ebp)
804837e: 75 09 jne 8048389
return 1;
8048380: c7 45 fc 01 00 00 00 movl $0x1,0xfffffffc(%ebp)
8048387: eb 16 jmp 804839f
return iterate(value -1) + value;
8048389: 8b 45 08 mov 0x8(%ebp),%eax
804838c: 83 e8 01 sub $0x1,%eax
804838f: 89 04 24 mov %eax,(%esp)
8048392: e8 dd ff ff ff call 8048374
...
可觀察呼叫慣例、堆疊框架建立、暫存器配置等細節。
# Makefile
CC = gcc
CFLAGS = -Wall -g
TARGET = hello
SRCS = hello.c
OBJS = $(SRCS:.c=.o)
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $@ $^
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(OBJS) $(TARGET)
$ make # 編譯
$ make clean # 清理
ar、gcc -shared -fPIC、ldd、LD_LIBRARY_PATH。pthread、mutex、condition variable、-pthread 編譯選項。strace ./hello 追蹤 write、open 等 syscall。gprof、perf、valgrind --tool=callgrind。CMake、autotools、交叉編譯工具鏈。Linux C 開發不僅是語法熟悉,更是對作業系統機制、工具鏈運作的深度理解。動手實作,才是最快的捷徑。