2012-07-28 16 views

Trả lời

9

Các dấu hiệu khác nhau xác định

sau
  • [CC] - Biên dịch tệp C thành tệp đối tượng được chỉ định. Tệp đối tượng chứa mã trình cấu hình của tệp .c đó. Vì nó cũng có thể tham khảo các phần bên ngoài phạm vi của nó. Ví dụ, gọi một hàm khác trong tệp .c khác. Các cuộc gọi hàm được để mở trong tệp đối tượng, sau đó được trình liên kết bao gồm. Do đó,
  • [LD] là lực lượng liên kết các đối tượng đã biên dịch với nhau và kết nối các cuộc gọi hàm đã được trình biên dịch mở lại. Tuy nhiên, nhiều phần được liên kết với nhau như là phần cốt lõi của hạt nhân, trong khi một số phần còn lại. Và do đó, bạn thấy
  • [CC (M)] cho những phần được biên dịch dưới dạng các điểm được tải vào hạt nhân khi chạy. Nhưng không liên kết với nhau trong phần nguyên khối của hạt nhân. Nhưng thay vào đó có thể được chèn khi hạt nhân được khởi động.
1

Nó sẽ hiển thị:

  • CC khi biên dịch một phần cốt lõi của hạt nhân
  • CC [M] khi biên soạn một module
  • LD khi liên kết
6

Hãy lấy một ví dụ cụ thể và tìm hiểu những gì nó làm trong hạt nhân 4.1, ví dụ: IHEX.

Find what mã không

Chỉ cần chạy:

make SHELL='sh -x' 

Làm thế nào mà làm việc: https://stackoverflow.com/a/32010960/895245

Nếu chúng ta grep đầu ra cho IHEX, chúng ta thấy các dòng:

+ echo IHEX firmware/e100/d101s_ucode.bin 
    IHEX firmware/e100/d101s_ucode.bin 
+ objcopy -Iihex -Obinary /home/ciro/git/kernel/src/firmware/e100/d101s_ucode.bin.ihex firmware/e100/d101s_ucode.bin 

vì vậy chúng tôi kết luận rằng IHEX thực hiện objcopy -Iihex.

Tìm nơi một mã số được định nghĩa

Mỗi lệnh kernel phải được xác định với một cái gì đó như:

quiet_cmd_ihex = IHEX [email protected] 
     cmd_ihex = $(OBJCOPY) -Iihex -Obinary $< [email protected] 

$(obj)/%: $(obj)/%.ihex 
     $(call cmd,ihex) 

cho các cài đặt rườm rà (ví dụ V=1make -s) để làm việc.

Vì vậy, nói chung, bạn chỉ cần phải

git grep 'cmd.* = CODE' 

để tìm CODE.

Tôi đã giải thích chi tiết cách hệ thống này hoạt động tại địa chỉ: https://stackoverflow.com/a/32023861/895245

Lấy danh sách tất cả các mã

make | grep -E '^ ' | sort -uk1,1 

CC và CC [M]

Defined trong scripts/Makefile.build :

quiet_cmd_cc_o_c = CC $(quiet_modtag) [email protected] 
     cmd_cc_o_c = $(CC) $(c_flags) -c -o [email protected] $< 

[M] xuất phát từ target specific variables:

$(real-objs-m)  : quiet_modtag := [M] 
$(real-objs-m:.o=.i) : quiet_modtag := [M] 
$(real-objs-m:.o=.s) : quiet_modtag := [M] 
$(real-objs-m:.o=.lst): quiet_modtag := [M] 
$(obj-m)    : quiet_modtag := [M] 

Nó sau đó được gọi là thông qua:

$(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE 
    [...] 
    $(call if_changed_rule,cc_o_c) 

define rule_cc_o_c 
    [...] 
    $(call echo-cmd,cc_o_c) $(cmd_cc_o_c);    \ 

nơi if_changed_rule được định nghĩa trong scripts/Kbuild.include như:

if_changed_rule = $(if $(strip $(any-prereq) $(arg-check)),     \ 
    @set -e;                \ 
    $(rule_$(1))) 

Kbuild.include được bao gồm trên Makefile cấp cao nhất.

LD

Có một vài phiên bản, nhưng đơn giản nhất có vẻ là:

quiet_cmd_link_o_target = LD  [email protected] 
cmd_link_o_target = $(if $(strip $(obj-y)),\ 
       $(LD) $(ld_flags) -r -o [email protected] $(filter $(obj-y), $^) \ 
       $(cmd_secanalysis),\ 
       rm -f [email protected]; $(AR) rcs$(KBUILD_ARFLAGS) [email protected]) 

$(builtin-target): $(obj-y) FORCE 
    $(call if_changed,link_o_target) 

và trong scripts/Kbuild.include:

# Execute command if command has changed or prerequisite(s) are updated. 
# 
if_changed = $(if $(strip $(any-prereq) $(arg-check)),      \ 
    @set -e;                \ 
    $(echo-cmd) $(cmd_$(1));            \ 
    printf '%s\n' '[email protected] := $(make-cmd)' > $(dot-target).cmd)