2013-02-01 15 views
11

मैं एक बहुत विनियमित वातावरण में काम करता हूं जहां हमें समान बाइनरी इनपुट का उत्पादन करने में सक्षम होना चाहिए, हर बार उत्पाद बनाने के लिए एक ही स्रोत कोड दें। वर्तमान में हम जी ++ के एक प्राचीन संस्करण का उपयोग करते हैं जिसे परिणामस्वरूप द्विआधारी में दिनांक/समय जैसी कुछ भी लिखने के लिए तैयार नहीं किया गया है जो बिल्ड से निर्माण में बदल जाएगा, लेकिन मैं g ++ 4.7.2 को अपडेट करना चाहता हूं। क्या किसी को पैच के बारे में पता है, या मुझे कोड कोड के दो समान टुकड़े लेने और समान बाइनरी आउटपुट बनाने के लिए क्या चाहिए, इसके बारे में सुझाव हैं?जी ++ के साथ निर्धारक बाइनरी आउटपुट कैसे उत्पन्न करें?

उत्तर

6

हम भी बिट-समान पुनर्निर्माण पर निर्भर करते हैं, और gcc-4.7.x का उपयोग कर रहे हैं।

PWD=/proc/self/cwd सेट करने और -frandom-seed=<input-file-name> का उपयोग करने के अलावा, कुछ हद तक पैच हैं, जो svn://gcc.gnu.org/svn/gcc/branches/google/gcc-4_7 शाखा में पाए जा सकते हैं।

+0

पीडब्ल्यूडी =/proc/self/CWD क्या करता है? –

+3

@StevenBehnke हम डीबग जानकारी के साथ निर्माण करते हैं। लिनक्स पर, जीसीसी वर्तमान संकलन निर्देशिका के रूप में 'पीडब्ल्यूडी' (जो कि वर्तमान कार्यशील निर्देशिका में खोल सेट करता है) रिकॉर्ड करता है। चूंकि हम निर्माण को निष्पादित करने वाली निर्देशिका के बावजूद बिट-समान बनना चाहते हैं, इसलिए हम अनुमानित मूल्य पर 'पीडब्ल्यूडी' सेट करते हैं। –

+1

जीसीसी में यादृच्छिकता के मुख्य अनुप्रयोग क्या हैं? –

5

डेबियन Reproducible builds project डेबियन पैकेज बाइट-बाय-बाइट को मानकीकृत करने का प्रयास करता है, और हाल ही में Linux Foundation grant मिला है।

हालांकि इसमें संकलन से अधिक शामिल हो सकता है, आपको इसे देखना चाहिए।

यह भी मुझे this article की ओर इशारा किया है, जो क्या @Employed कहा करने के लिए निम्नलिखित बातों को जोड़ता है:

  • एक निश्चित फ़ोल्डर में स्रोत डाल (जैसे /tmp/build) __FILE__
  • __DATE__ के लिए
  • , __TIME__ से निपटने के लिए , __TIMESTAMP__:
    • libfaketime: https://github.com/wolfcw/libfaketime
    • ओवरराइड टी -D
    • -Wdate-time या -Werror=date-time साथ नली मैक्रो: चेतावनी दी है या असफल रहे हैं या तो __TIME__, __DATE__ या __TIMESTAMP__ प्रयोग किया जाता है। लिनक्स कर्नेल 4.4 डिफ़ॉल्ट रूप से इसका उपयोग करता है।
  • ar साथ
  • उपयोग D झंडा, या टिकटों
  • -fno-guess-branch-probability साफ करने के लिए https://github.com/nh2/ar-timestamp-wiper/tree/master का उपयोग करें: older manual versions कहना है कि यह गैर नियतिवाद, लेकिन not anymore का एक स्रोत है। सुनिश्चित नहीं है कि यह -frandom-seed द्वारा कवर किया गया है या नहीं।

Buildroot एक BR2_REPRODUCIBLE विकल्प जो पैकेज स्तर पर कुछ विचार दे सकता है, लेकिन यह इस बिंदु पर पूरा नहीं हुआ है।

संबंधित धागे:

संबंधित मुद्दे