Trong khi biên dịch Linux từ đầu tôi nhận ra rằng có các mã biên dịch xuất hiện trong khi biên dịch.Các mã như đầu ra CC, LD và CC [M] khi biên dịch hạt nhân Linux là gì?
Ví dụ: tên tệp CC, tên tệp LD, tên tệp CC [M].
Các mã này có ý nghĩa gì?
Trong khi biên dịch Linux từ đầu tôi nhận ra rằng có các mã biên dịch xuất hiện trong khi biên dịch.Các mã như đầu ra CC, LD và CC [M] khi biên dịch hạt nhân Linux là gì?
Ví dụ: tên tệp CC, tên tệp LD, tên tệp CC [M].
Các mã này có ý nghĩa gì?
Các dấu hiệu khác nhau xác định
sauNó sẽ hiển thị:
CC
khi biên dịch một phần cốt lõi của hạt nhânCC [M]
khi biên soạn một moduleLD
khi liên kếtHã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=1
và make -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] $<
và [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)))
và 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)
http://unix.stackexchange.com/questions/199060/what-do-the-terms-cc-ld-và-vận chuyển-refer-to-trong-the-kernel-source-compilati –