c++ - क्या मैं एक सादे फ़ाइल को अपने निष्पादन योग्य में जोड़ सकता हूं?




gcc linker (2)

आप यह कर सकते हैं:

objcopy --input binary \
        --output elf32-i386 \
        --binary-architecture i386 my_file.xml myfile.o

यह एक ऑब्जेक्ट फ़ाइल बनाता है जिसे आप अपने निष्पादन योग्य में जोड़ सकते हैं। इस फ़ाइल में इन प्रतीकों को शामिल किया जाएगा जिन्हें आपको अपने सी कोड में घोषित करने में सक्षम होना होगा

00000550 D _binary_my_file_xml_end
00000550 A _binary_my_file_xml_size 
00000000 D _binary_my_file_xml_start

कुछ ढांचे (क्यूटी, विंडोज़, जीटीके ...) आपके बाइनरी में संसाधन जोड़ने के लिए कार्यक्षमता प्रदान करते हैं। मुझे आश्चर्य है कि ढांचे के बिना इसे हासिल करना संभव होगा, क्योंकि वास्तव में इसकी जरूरत है

  1. बाइनरी (डेटा सेगमेंट) के भीतर संसाधन का पता रखने का प्रतीक
  2. संसाधन की लंबाई का प्रतिनिधित्व करने के लिए एक प्रतीक
  3. संसाधन स्वयं

यह gcc टूलचेन के साथ कैसे प्राप्त किया जा सकता है?


इसके सबसे बुनियादी पर, बराबर बाइट से भरा एक char सरणी है।

लिनक्स पर आप xxd -i <file> फ़ाइलों को char सरणी में "संकलित" करने के लिए उपयोग कर सकते हैं, फिर अपने बाइनरी में सरणी को लिंक कर सकते हैं और घटक बाइट्स का उपयोग कर सकते हैं।

यहां मेरे अपने कोड के makefile से एक उदाहरण दिया गया है, जो templates.h नामक एक "संसाधन फ़ाइल" बनाता है जिसे HTML टेम्पलेट का प्रतिनिधित्व करने वाले char सरणी का एक समूह होता है:

templates.h:
    @echo "#ifndef REDACTED_TEMPLATES_H" > templates.h
    @echo "#define REDACTED_TEMPLATES_H" >> templates.h
    @echo "// Auto-generated file! Do not modify!" >> templates.h
    @echo "// NB: arrays are not null-terminated" >> templates.h
    @echo "// (anonymous namespace used to force internal linkage)" >> templates.h
    @echo "namespace {" >> templates.h
    @echo "namespace templates {" >> templates.h
    @cd templates;\
    for i in * ;\
    do \
        echo "Compiling $$i...";\
        xxd -i $$i | sed -e 's/ =/ __attribute__((unused)) =/' >> ../templates.h;\
    done;\
    cd ..
    @echo "}" >> templates.h
    @echo "}" >> templates.h
    @echo "#endif" >> templates.h

( यह भी देखें: मैं इन स्वचालित रूप से उत्पन्न वस्तुओं के लिए '__attribute__ ((अप्रयुक्त)) प्रोग्रामेटिक रूप से कैसे लागू कर सकता हूं? )

नतीजा थोड़ा सा दिखता है:

#ifndef REDACTED_TEMPLATES_H
#define REDACTED_TEMPLATES_H
// Auto-generated file! Do not modify!
// NB: arrays are not null-terminated
// (anonymous namespace used to force internal linkage)
namespace {
namespace templates {
unsigned char alert_email_finished_events_html[] __attribute__((unused)) = {
  0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
  0x3d, 0x22, 0x6e, 0x6f, 0x64, 0x65, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x2d,
[..]
  0x7d, 0x7d, 0x0d, 0x0a, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e,
  0x0d, 0x0a
};
unsigned int alert_email_finished_events_html_len __attribute__((unused)) = 290;
unsigned char alert_email_finished_events_list_html[] __attribute__((unused)) = {
  0x3c, 0x74, 0x72, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73,
  0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x2d, 0x70, 0x72, 0x65, 0x76,
[..]
  0x73, 0x74, 0x7d, 0x7d, 0x0d, 0x0a
};
unsigned int alert_email_finished_events_list_html_len __attribute__((unused)) = 42;
}
}
#endif

ध्यान दें कि केवल एक अनुवाद इकाई में संसाधन का उपयोग करते समय यह विशेष उदाहरण इष्टतम है, लेकिन सामान्य दृष्टिकोण को आपकी आवश्यकताओं के अनुसार अनुकूलित किया जा सकता है।





embedded-resource