चलो एक विशिष्ट उदाहरण लें और यह पता लगाएं कि यह कर्नेल 4.1 में क्या करता है, उदाहरण के लिए IHEX
।
खोजें अभी दिखाए जाते हैं तो एक कोड
करता है:
make SHELL='sh -x'
कैसे काम करता है:
:
https://stackoverflow.com/a/32010960/895245
हम IHEX
के लिए उत्पादन grep, तो हम पाते हैं लाइनों
+ 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
इसलिए हमने निष्कर्ष निकाला कि IHEX
objcopy -Iihex
करता है।
quiet_cmd_ihex = IHEX [email protected]
cmd_ihex = $(OBJCOPY) -Iihex -Obinary $< [email protected]
$(obj)/%: $(obj)/%.ihex
$(call cmd,ihex)
शब्दाडंबर सेटिंग्स के लिए
(जैसे V=1
और make -s
) काम करने के लिए:
ढूँढें जहां एक कोड
हर कर्नेल कमांड परिभाषित किया गया है की तरह कुछ के साथ परिभाषित किया जाना चाहिए।
तो सामान्य रूप में, तुम सिर्फ
git grep 'cmd.* = CODE'
को CODE
लगाना होगा।
मैं विस्तार से समझाया गया है कि कैसे इस प्रणाली पर काम करता है: https://stackoverflow.com/a/32023861/895245
सभी कोड
make | grep -E '^ ' | sort -uk1,1
सीसी और सीसी [एम]
की सूची 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]
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]
यह तो के माध्यम से कहा जाता है:
$(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); \
जहां if_changed_rule
रूप scripts/Kbuild.include
में परिभाषित किया गया है:
if_changed_rule = $(if $(strip $(any-prereq) $(arg-check)), \
@set -e; \
$(rule_$(1)))
और Kbuild.include
शामिल हो जाता है शीर्ष स्तर मेकफ़ाइल पर।
एलडी
कुछ संस्करण हैं, लेकिन सबसे सरल प्रतीत हो रहा है:
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)
और 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/प्रश्न/199,060/क्या करते हैं--terms-cc-ld और भेज दिया-उल्लेख करने वाली दौरान-कर्नेल-स्रोत-compilati –