क्या स्ट्रिप किए गए कर्नेल स्रोतों का एक सेट प्राप्त करने के लिए कोई कुशल तरीका है (शायद जीसीसी प्रीप्रोसेसर का दुरुपयोग करके?) जहां कॉन्फ़िगरेशन के अनुसार सभी कोड की आवश्यकता नहीं है?स्ट्रिप लिनक्स कर्नेल स्रोत .config
उत्तर
अच्छी तरह से समाधान में कुछ कदम उठाए गए।
सबसे पहले, एक एक करके
make KBUILD_VERBOSE=1 | tee build.log
grep '^ gcc' build.log
इस्तेमाल किया संकलक आदेशों प्राप्त कर सकते हैं अभी के लिए, मैं अगले चरण के लिए केवल एक जीसीसी आदेश पंक्ति का चयन करें। उदाहरण के लिए कर्नेल/kmod.c के निर्माण, ऐसा लगता है:
gcc <LIST OF MANY OPTIONS> -c -o kernel/kmod.o kernel/kmod.c
मैं अब विकल्प -c
, -o ...
हटाने और -E
जोड़ने के लिए, इस प्रकार संकलन को अक्षम और स्क्रीन के लिए पूर्वप्रक्रमक उत्पादन लेखन। आगे मैं जीएनयू परिभाषित मैक्रो परिभाषाओं को हटाने के लिए मैक्रो विस्तार और -undef
को रोकने के लिए -fdirectives-only
जोड़ता हूं। मानक सी हेडर को हटाने के लिए -nostdinc
पहले से ही कर्नेल मेकफ़ाइल द्वारा जोड़ा गया है।
अब अभी भी शामिल हैं और प्रीप्रोसेसर आउटपुट पर विस्तारित हैं। इस प्रकार मैं उन्हें हटाकर grep के माध्यम से इनपुट फ़ाइल पाइप: grep -v '#include' kernel/kmod.c
। अब केवल एक ही शामिल है: autoconf.h मेकफ़ाइल की कमांड लाइन द्वारा शामिल किया गया है। यह बहुत अच्छा है क्योंकि यह वास्तव में सक्रिय कर्नेल कोड का चयन करने के लिए #ifdef CONFIG_...
द्वारा उपयोग किए गए मैक्रोज़ को परिभाषित करता है।
एकमात्र चीज प्रीप्रोसेसर टिप्पणियों को फ़िल्टर करना और के माध्यम से autoconf.h से शेष #define
एस को फ़िल्टर करना है।
पूरे पाइप लगता है:
grep -v '#include' kernel/kmod.c | gcc -E -fdirectives-only -undef <ORIGINAL KERNEL BUILD GCC OPTIONS WITHOUT -c AND -o ...> - |grep -v '^#'
और परिणाम कोड है कि वास्तव में kmod.o. में निर्माण युक्त कर्नेल/kmod.c की फ़िल्टर संस्करण है
प्रश्न बने रहे: पूरे स्रोत पेड़ के लिए यह कैसे करें? क्या ऐसी फाइलें हैं जो वास्तव में निर्मित होती हैं लेकिन लिंकिंग पर कभी भी इस्तेमाल नहीं होतीं और छीन ली जाती हैं?
सबकुछ संकलित करें और पता लगाएं कि कौन सी फाइलों का उपयोग नहीं किया गया था। यह बहुत सटीक नहीं हो सकता है लेकिन यह शायद एक कोशिश के लायक है।
यह #ifdef के रूप में काम नहीं करेगा ... स्रोत फ़ाइलों के अंदर कथन का मूल्यांकन किया जाता है इस प्रकार अप्रयुक्त फाइलें और लगभग अप्रयुक्त फ़ाइलों को भी संकलित किया जाता है। – dronus
@ ड्रोनस: यह एकमात्र आसान तरीका है जिसे मैं सोच सकता हूं (अगला, मूल रूप से, सी प्रीप्रोसेसर लिखना या संशोधित करना)। इसे अप्रयुक्त मॉड्यूल और आर्क जैसे चीजों को हटा देना चाहिए। क्या आपको वास्तव में अधिक सटीक होने की आवश्यकता है? आप क्या हासिल करने का प्रयास कर रहे हैं? –
वैसे मैं कर्नेल कैसे काम करता है, इसके बारे में कुछ जोरदार अवलोकन प्राप्त करना चाहता हूं, लेकिन कोड के सौ एमबी पढ़ने के लिए लगभग असंभव है। इसलिए मैं एक न्यूनतम कर्नेल बनाना चाहता हूं और इसके वास्तविक इस्तेमाल कोड को पढ़ना चाहता हूं। – dronus