2012-07-28 22 views
6

लिनक्स को स्क्रैच से संकलित करते समय मुझे एहसास हुआ कि संकलन करते समय संकलित कोड होते हैं।लिनक्स कर्नेल संकलित करते समय सीसी, एलडी और सीसी [एम] आउटपुट जैसे कोड क्या हैं?

उदाहरण के लिए सीसी फ़ाइल नाम, एलडी फ़ाइल नाम, सीसी [एम] फ़ाइल नाम।

इन कोडों का क्या अर्थ है?

+0

http://unix.stackexchange.com/प्रश्न/199,060/क्या करते हैं--terms-cc-ld और भेज दिया-उल्लेख करने वाली दौरान-कर्नेल-स्रोत-compilati –

उत्तर

9

जोड़ने अलग चिह्नों निम्नलिखित

निर्दिष्ट
  • [सीसी] - सी फ़ाइल को एक निर्दिष्ट ऑब्जेक्ट फ़ाइल में संकलित करता है। ऑब्जेक्ट फ़ाइल में उस .c फ़ाइल का आर्किटेक्चर असेंबलर कोड होता है। क्योंकि यह इसके दायरे के बाहर के हिस्सों को भी संदर्भित कर सकता है। उदाहरण के लिए किसी अन्य फ़ंक्शन को किसी अन्य .c फ़ाइल में कॉल करना। फ़ंक्शन कॉल ऑब्जेक्ट फ़ाइल के भीतर खुली रहती हैं, जिसे बाद में लिंकर द्वारा शामिल किया जाता है। इसलिए
  • [एलडी] संकलित वस्तुओं को एक साथ जोड़ने की प्रक्रिया है, और कंपाइलर द्वारा खोले गए फ़ंक्शन कॉल को तारित करें। हालांकि, कई हिस्सों को कर्नेल के मुख्य भाग के रूप में एक साथ जोड़ा जाता है, जबकि कुछ हिस्सों को छोड़ दिया जाता है। और इस प्रकार आप
  • [सीसी (एम)] उन हिस्सों के लिए देखते हैं जिन्हें रनटाइम पर कर्नेल में लोड करने के लिए अंक के रूप में संकलित किया जाता है। लेकिन कर्नेल के मोनोलिथिक हिस्से में जो एक साथ जुड़े नहीं हैं। लेकिन कर्नेल बूट होने पर इसके बजाय डाला जा सकता है।
1

यह दिखाना चाहिए:

  • CC जब गिरी
  • CC [M] का एक प्रमुख हिस्सा संकलन जब एक मॉड्यूल
  • LD संकलन जब
6

चलो एक विशिष्ट उदाहरण लें और यह पता लगाएं कि यह कर्नेल 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 

इसलिए हमने निष्कर्ष निकाला कि IHEXobjcopy -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) 
संबंधित मुद्दे