ما هي الرموز مثل CC وLD وCC[M] التي يتم إخراجها عند تجميع نواة Linux؟

StackOverflow https://stackoverflow.com//questions/11697800

سؤال

أثناء تجميع Linux من البداية، أدركت أن هناك رموز ترجمة تظهر أثناء التجميع.

على سبيل المثال اسم ملف CC، اسم ملف LD، اسم ملف CC[M].

ماذا تعني هذه الرموز؟

هل كانت مفيدة؟

المحلول

العلامات المختلفة تحدد ما يلي

  • [CC] - يجمع ملف C إلى ملف كائن معين.يحتوي ملف الكائن على رمز مجمع Archicture الخاص بهذا .C.كما قد تشير أيضا إلى أجزاء خارج نطاقها.على سبيل المثال، استدعاء وظيفة أخرى في ملف .c آخر.يتم ترك مكالمات الوظيفة مفتوحة داخل ملف الكائنات، والتي يتم تضمينها لاحقا بواسطة الرابط.لذلك
  • [LD] هو promes من ربط الكائنات المترجمة معا، وسلك مكالمات الوظيفة التي تم تركها مفتوحة من قبل المحول البرمجي.ومع ذلك، فإن أجزاء كثيرة مرتبطة معا كجزء أساسي من النواة، في حين يتم استبعاد بعض الأجزاء.وبالتالي ترى
  • [CC (M)] بالنسبة لأولئك الأجزاء التي يتم تجميعها كأجاوز النقاط التي سيتم تحميلها في Kernel في وقت التشغيل.ولكن والتي لا ترتبط معا في الجزء المكتوب من النواة.ولكن بدلا من ذلك، يمكن إدراجها عند تمهيد النواة.

نصائح أخرى

لنأخذ مثالاً محددًا ونكتشف ما يفعله في النواة 4.1، على سبيل المثال. IHEX.

اكتشف ما يفعله الرمز

فقط قم بتشغيل:

make SHELL='sh -x'

كيف يعمل ذلك: https://stackoverflow.com/a/32010960/895245

إذا قمنا بإخراج الناتج لـ IHEX, ، نجد الأسطر:

+ 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.

ابحث عن المكان الذي تم فيه تعريف الرمز

يجب تعريف كل أمر kernel بشيء مثل:

quiet_cmd_ihex  = IHEX    $@
      cmd_ihex  = $(OBJCOPY) -Iihex -Obinary $< $@

$(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

CC و CC [M]

المعرفة في scripts/Makefile.build:

quiet_cmd_cc_o_c = CC $(quiet_modtag)  $@
      cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<

و ال [M] يأتي من استهداف متغيرات محددة:

$(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 يتم تضمينه في Makefile المستوى الأعلى.

إل دي

هناك عدد قليل من الإصدارات، ولكن يبدو أن أبسطها هو:

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

$(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' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd)

يجب أن تظهر:

  • CC عند تجميع جزء أساسي من النواة
  • CC [M] عند تجميع الوحدة النمطية
  • LD عند الربط
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top