কোনও প্রোগ্রাম পুনরায় সংশ্লেষ করা কি বিট-ফর-বিট অভিন্ন অভিন্ন বাইনারি তৈরি করে?


25

যদি আমি একটি প্রোগ্রাম একটি একক বাইনারি মধ্যে কম্পাইল করতে পারি, একটি চেকসাম তৈরি করি এবং তারপরে একই মেশিনে একই সংকলক এবং সংকলক সেটিংস এবং পুনরায় সংযুক্ত প্রোগ্রামের সাথে চেকসামটি ব্যর্থ করি, তবে চেকসাম ব্যর্থ হবে?

যদি তাই হয় তবে এটি কেন? যদি তা না হয় তবে একটি অ-অভিন্ন শৈশবালায় আলাদা সিপিইউর ফলাফল থাকবে?


8
এটি সংকলক উপর নির্ভর করে। তাদের মধ্যে কিছু সময় স্ট্যাম্প এম্বেড করে, সুতরাং উত্তরগুলির জন্য তাদের "না"।
ta.speot.is

আসলে এটি নির্বাহী বিন্যাসের উপর নির্ভর করে , সংকলক নয়। উইন্ডোজ 'পিই ফর্ম্যাটের মতো কয়েকটি এক্সিকিউটেবল ফর্ম্যাটে একটি টাইমস্ট্যাম্প অন্তর্ভুক্ত থাকে যা সংকলনের সময় এবং তারিখের সাথে স্পর্শ করা হয়, অন্যদিকে লিনাক্স' ইএলএফ ফর্ম্যাটের মতো অন্য ফর্ম্যাটগুলি না। যেভাবেই হোক না কেন, এই প্রশ্নটি "অভিন্ন বাইনারি" সংজ্ঞাটির উপর নির্ভর করে। একই উত্স ফাইলটি একই সংকলক এবং লাইব্রেরি এবং সুইচ এবং সমস্ত কিছুর সাথে সংকলিত থাকলে চিত্রটি নিজেই বিটওয়াইজ অভিন্ন হবে / শিরোনাম এবং অন্যান্য মেটাডেটা আলাদা হতে পারে।
সিনিটেক

উত্তর:


19
  1. একই মেশিনে একই সেটিংস সহ একই প্রোগ্রামটি সংকলন করুন:

    যদিও এর চূড়ান্ত উত্তরটি "এটি নির্ভর করে", তবে এটি আশা করা যুক্তিযুক্ত যে বেশিরভাগ সংকলক বেশিরভাগ সময় নির্দ্বিধায় থাকবেন এবং উত্পাদিত বাইনারিগুলি অভিন্ন হবে। আসলে, কিছু সংস্করণ নিয়ন্ত্রণ সিস্টেমগুলি এর উপর নির্ভর করে। এখনও, সর্বদা ব্যতিক্রম আছে; এটি বেশ সম্ভব যে কোনও কোনও সংকলক কোথাও একটি টাইমস্ট্যাম্প বা এই জাতীয় কিছু সন্নিবেশ করানোর সিদ্ধান্ত নেবে (উদাহরণস্বরূপ, আইরিক, ডেলফি করেন)। বা বিল্ড প্রক্রিয়া নিজেই এটি করতে পারে; আমি সি প্রোগ্রামগুলির জন্য মেকফিলগুলি দেখেছি যা বর্তমান টাইমস্ট্যাম্পে প্রিপ্রসেসর ম্যাক্রো সেট করে। (আমার ধারণা, যদিও এটি একটি আলাদা সংকলক সেটিং হিসাবে গণনা করা হবে))

    এছাড়াও, সচেতন হন যে আপনি যদি বাইনারিটিকে স্থিতিশীলভাবে সংযুক্ত করেন, তবে আপনি কার্যকরভাবে আপনার মেশিনে সমস্ত প্রাসঙ্গিক গ্রন্থাগারগুলির স্থিতি সংযোজন করছেন এবং এর মধ্যে যে কোনও একটিতেও পরিবর্তন আপনার বাইনারিকে প্রভাবিত করবে। সুতরাং এটি কেবল প্রাসঙ্গিক সেটিংসই প্রাসঙ্গিক নয়।

  2. একটি আলাদা সিপিইউ দিয়ে একটি ভিন্ন মেশিনে একই প্রোগ্রামটি সংকলন করুন।

    এখানে, সমস্ত বেট বন্ধ আছে। বেশিরভাগ আধুনিক সংকলক লক্ষ্য-নির্দিষ্ট অপ্টিমাইজেশন করতে সক্ষম; যদি এই বিকল্পটি সক্ষম করা থাকে তবে সিপিইউগুলি সমান না হলে বাইনারিগুলি পৃথক হতে পারে (এবং তারপরেও এটি সম্ভব)। এছাড়াও, স্ট্যাটিক লিঙ্কিং সম্পর্কে উপরের নোটটি দেখুন: কনফিগারেশন পরিবেশটি সংকলক সেটিংসের চেয়ে অনেক বেশি। আপনার যদি খুব কড়া কনফিগারেশন নিয়ন্ত্রণ না থাকে তবে দুটি মেশিনের মধ্যেই কিছু আলাদা হওয়ার সম্ভাবনা খুব বেশি।


1
বলুন আমি জিসিসি ব্যবহার করছিলাম, এবং আমি মার্চ বিকল্পটি ব্যবহার করছিলাম না (সিপিইউ'র নির্দিষ্ট পরিবারের জন্য বাইনারিটি অনুকূল করে এমন বিকল্প), এবং আমাকে একটি সিপিইউ সহ একটি বাইনারি সংকলন করতে হয়েছিল, এবং তারপরে অন্য সিপিইউতে একটি বিকল্প থাকবে পার্থক্য কি?
ডেভিড

1
@ ডেভিড: এটি এখনও নির্ভর করে। প্রথমত, আপনি যে লাইব্রেরিগুলির সাথে লিঙ্ক করছেন সেটিতে স্থাপত্য-নির্দিষ্ট বিল্ড থাকতে পারে have সুতরাং আউটপুট gcc -cভাল একই হতে পারে, তবে লিঙ্কযুক্ত সংস্করণ পৃথক। এছাড়াও, এটি শুধু নয় -march; এছাড়াও রয়েছে -mtune/-mcpu এবং -mfpmatch(এবং সম্ভবত অন্যরাও)। এর মধ্যে কিছুগুলির বিভিন্ন ইনস্টলেশনতে বিভিন্ন ডিফল্ট থাকতে পারে, সুতরাং আপনার মেশিনগুলির জন্য আপনাকে সম্ভবত সবচেয়ে খারাপ ক্ষেত্রে বাধ্য করতে হবে; এটি করা পারফরম্যান্সকে উল্লেখযোগ্যভাবে হ্রাস করতে পারে, বিশেষত যদি আপনি sse ছাড়াই i386 এ ফিরে যান। এবং, অবশ্যই, যদি আপনার
সিপাসের

1
এছাড়াও, জিসিসি প্রশ্নযুক্ত একটি সংকলক যা বাইনারিগুলিতে টাইমস্ট্যাম্প যুক্ত করে?
ডেভিড

@ ডেভিড: আফাইক, না
ধনী

8

আপনারা যা জিজ্ঞাসা করছেন তা হ'ল আউটপুট নির্ধারক " আপনি যদি প্রোগ্রামটি একবার সংকলন করেন, তাৎক্ষণিকভাবে আবার এটি সংকলিত আপনি সম্ভবত একই আউটপুট ফাইলটি দিয়ে শেষ করবেন। যাইহোক, যদি কিছু পরিবর্তিত হয় - এমনকি একটি ছোট পরিবর্তনও - বিশেষত কোনও উপাদানগুলিতে সংকলিত প্রোগ্রামটি ব্যবহার করে, তবে সংকলকটির আউটপুটও পরিবর্তন হতে পারে।


2
সত্যিই খুব ভাল পয়েন্ট। এই নিবন্ধটি কিছু খুব আকর্ষণীয় পর্যবেক্ষণ আছে। বিশেষত, জিসিসির সাথে সংকলন নির্দিষ্ট ক্ষেত্রে ইনপুটগুলির ক্ষেত্রে সংজ্ঞাবাদী নাও হতে পারে, উদাহরণস্বরূপ এটি কীভাবে বেনামে নেমস্পেসে কাজ করে, যার জন্য এটি অভ্যন্তরীণভাবে একটি এলোমেলো সংখ্যার জেনারেটর ব্যবহার করে। এই বিশেষ ক্ষেত্রে স্থিরতা পেতে, বিকল্পটি উল্লেখ করে একটি প্রাথমিক এলোমেলো বীজ সরবরাহ করুন -frandom-seed=string
ack

7

কোনও প্রোগ্রাম পুনরায় সংশ্লেষ করা কি বিট-ফর-বিট অভিন্ন অভিন্ন বাইনারি তৈরি করে?

সমস্ত সংকলক জন্য? নং সি # সংকলক, কমপক্ষে, এর অনুমতি নেই।

সংকলকটির আউটপুট কেন নির্বিচারক নয় তা নিয়ে এরিক লিপার্টের খুব বিস্তৃত ভাঙ্গন রয়েছে

[টি] ডিজাইন দ্বারা সে সি # সংকলক কখনও একই বাইনারি দুবার উত্পাদন করে না। সি # সংকলক প্রতিটি অ্যাসেমব্লিতে নতুনভাবে উত্পন্ন জিইউইডি এম্বেড করে, আপনি যতবার এটি চালান, ততক্ষণ নিশ্চিত করে যে কোনও দুটি অ্যাসেমব্লি কখনও বিট-বিট অভিন্ন নয়। সিএলআই স্পেসিফিকেশন থেকে উদ্ধৃতি:

এমভিআইডি কলামে একটি অনন্য জিইউইডি [...] সূচী করবে যা মডিউলটির এই উদাহরণটি সনাক্ত করে। [...] এমভিড প্রতিটি মডিউলের জন্য নতুন তৈরি করা উচিত [...] যদিও [রানটাইম] নিজেই এমভিডের কোনও ব্যবহার না করে, অন্য সরঞ্জামগুলি (যেমন ডিবাগারগুলি [...]) তার উপর নির্ভর করে এমভিড প্রায় সবসময় একটি মডিউল থেকে অন্য মডিউলে আলাদা হয়।

যদিও এটি সি # সংকলকের একটি সংস্করণের সাথে নির্দিষ্ট, নিবন্ধের অনেকগুলি পয়েন্ট যে কোনও সংকলকটিতে প্রয়োগ করা যেতে পারে ।

প্রথমে, আমরা ধরে নিচ্ছি যে আমরা সর্বদা একই ক্রমে ফাইলগুলির একই তালিকা পাই। তবে এটি কিছু ক্ষেত্রে অপারেটিং সিস্টেম পর্যন্ত। আপনি যখন "সিএসসি * .সিএস" বলবেন, অপারেটিং সিস্টেমটি ক্রমযুক্ত ফাইলগুলির তালিকার উপরে ক্রমটি ব্যবহার করে তা অপারেটিং সিস্টেমের একটি বাস্তবায়ন বিশদ; সংকলক সেই তালিকাটিকে একটি প্রমিত ক্রম অনুসারে বাছাই করে না।


বিল্টটিকে পুনরুত্পাদনযোগ্য করে তোলা কঠিন হবে না (সংকলনের সময় এবং সমাবেশ জিইউডির মতো কয়েকটি সহজে ফেলে দেওয়া ক্ষেত্রগুলি বাদে)। উদাহরণস্বরূপ ইনপুট ফাইলগুলিকে ক্যানোনিকাল অর্ডারে বাছাই করা হ'ল এক-লাইনার। এমনকি যে জিইউইডি নতুন উত্পন্ন হওয়ার পরিবর্তে সমাবেশের বাকী অংশগুলির একটি হ্যাশ হতে পারে।
কোডসইনচাউস

আমি ধরে নিয়েছি আপনি মাইক্রোসফ্ট সি # সংকলকটি বোঝাচ্ছেন, বা এটি নির্দিষ্টকরণের প্রয়োজন?
ডেভিড

@ ডেভিড সিএলআই স্পেকটির এটির প্রয়োজন। মনো এর সি # সংকলক একই কাজ করতে হবে। যে কোনও ভিবি। নেট সংকলকের জন্য ডিট্টো।
ta.speot.is

4
ইসিএমএ স্ট্যান্ডার্ডের টাইমস্ট্যাম্প বা এমভিআইডি পার্থক্য থাকতে হবে না। সেগুলি ব্যতীত, সি # তে অভিন্ন বাইনারিগুলির পক্ষে কমপক্ষে এটি সম্ভব। সুতরাং মূল কারণটি একটি সন্দেহজনক ডিজাইনের সিদ্ধান্ত এবং আসল প্রযুক্তিগত বাধা নয়।
শিব

7
  • -frandom-seed=123কিছু জিসিসির অভ্যন্তরীণ এলোমেলোতা নিয়ন্ত্রণ করে। man gccবলেছেন:

    এই বিকল্পটি এমন একটি বীজ সরবরাহ করে যা জিসিসি নির্দিষ্ট সংখ্যার নাম তৈরির ক্ষেত্রে এলোমেলো সংখ্যার জায়গায় ব্যবহার করে যা প্রতিটি সংকলিত ফাইলের চেয়ে আলাদা হতে হবে। এটি কভারেজ ডেটা ফাইল এবং তাদের উত্পাদিত অবজেক্ট ফাইলগুলিতে অনন্য স্ট্যাম্পগুলি রাখার জন্যও ব্যবহৃত হয়। প্রজননযোগ্যভাবে অভিন্ন বস্তু ফাইল তৈরি করতে আপনি -ফ্রেডম-বীজ বিকল্পটি ব্যবহার করতে পারেন।

  • __FILE__: উত্সটিকে একটি নির্দিষ্ট ফোল্ডারে রাখুন (উদাঃ /tmp/build)

  • জন্য __DATE__, __TIME__, __TIMESTAMP__:
    • libfaketime: https://github.com/wolfcw/libfaketime
    • those ম্যাক্রোগুলিকে ওভাররাইড করুন -D
    • -Wdate-timeবা -Werror=date-time: সতর্কতা বা ব্যর্থ হয় যদি হয় __TIME__, __DATE__বা __TIMESTAMP__ব্যবহৃত হয়। লিনাক্স কার্নেল ৪.৪ এটি ডিফল্টরূপে ব্যবহার করে।
  • স্ট্যাম্পগুলি মুছতে https://github.com/nh2/ar-timestamp-wiper/tree/master এরD সাথে পতাকা ব্যবহার করুন arবা ব্যবহার করুন
  • -fno-guess-branch-probability: পুরানো ম্যানুয়াল সংস্করণগুলি বলে যে এটি অ-নির্ধারণবাদের উত্স, তবে আর নয় । নিশ্চিত যদি এই দ্বারা আচ্ছাদিত করা হয় না -frandom-seedবা না।

দেবিয়ান পুনঃপ্রজননযোগ্য বিল্ট প্রকল্পটি বায়-বাই বাই ডেবিয়ান প্যাকেজগুলিকে মানক করার জন্য প্রচেষ্টা চালায় এবং সম্প্রতি একটি লিনাক্স ফাউন্ডেশন অনুদান পেয়েছে । এর মধ্যে কেবল সংকলন করার চেয়ে আরও কিছু রয়েছে, তবে এটি আগ্রহী হওয়া উচিত।

বিল্ড্রূটের একটি BR2_REPRODUCIBLEবিকল্প রয়েছে যা প্যাকেজ স্তরের কিছু ধারণা দিতে পারে, তবে এটি এখানের সম্পূর্ণ থেকে দূরে।

সম্পর্কিত থ্রেড:


3

প্রকল্প https://reproducible-builds.org/ এ সবই, এবং আপনার প্রশ্নের উত্তরটি "না, তারা আলাদা হবে না" যতটা সম্ভব সম্ভব করার জন্য যথাসাধ্য চেষ্টা করছে। নিক্সস এবং ডেবিয়ান এখন তাদের প্যাকেজগুলির পুনরুত্পাদনযোগ্যতায় 90% এরও বেশি।

যদি আপনি একটি বাইনারি সংকলন করেন এবং আমি একটি বাইনারি সংকলন করি এবং তারা বিট-বিট একরকম হয় তবে আমি নিশ্চিত হতে পারি যে উত্স কোড এবং সরঞ্জামগুলি আউটপুট নির্ধারণ করে এবং আপনি কিছুতে লুকিয়ে থাকেননি পথে ট্রোজান কোড।

যদি আমরা মানব-পঠনযোগ্য উত্স থেকে বুটস্ট্রাপ্প্যাবিলিটিটির সাথে প্রজননযোগ্যতা একত্রিত করি, যেমন http://bootstrappable.org/ কাজ করার জন্য কাজ করে থাকে, আমরা মানব-পঠনযোগ্য উত্স দ্বারা স্থলভাগ থেকে নির্ধারিত একটি সিস্টেম পাই এবং কেবল তখনই আমরা এমন এক জায়গায় পৌঁছে যাই যেখানে আমরা বিশ্বাস করতে পারি যে সিস্টেমটি কী করছে তা আমরা জানি।


1
দুর্দান্ত লিঙ্ক। আমি একজন বিল্ড্রুট ফ্যানবয়, তবে কেউ যদি আমাকে নিক্স এআরএম ক্রস আর্চ সেটআপ দেয় যা কিউইএমইউতে বুট করে, আমি খুশি হব :-)
সিওরো সান্তিলি 事件 改造 中心 法轮功 六四 事件

আমি গুইসের কথা উল্লেখ করিনি কারণ আমি তাদের সংখ্যাগুলি কোথায় সন্ধান করব তা জানি না, তবে তারা যাচাইকরণ টুলিং এবং এর মতো পুনরুত্পাদন ট্রেনে নিক্সসের আগে ছিল, তাই আমি নিশ্চিত যে তারা সমান পদক্ষেপে বা আরও উন্নত।
ক্লেক

2

আমি বলব না, এটি 100% নির্বিচারবাদী নয়। আমি এর আগে জিসিসির একটি সংস্করণ নিয়ে কাজ করেছি যা হিটাচি এইচ 8 প্রসেসরের লক্ষ্যবস্তু বাইনারি তৈরি করে।

টাইম স্ট্যাম্প নিয়ে সমস্যা নেই। এমনকি সময় স্ট্যাম্প ইস্যুটিকে উপেক্ষা করা হলেও, নির্দিষ্ট প্রসেসরের আর্কিটেকচার একই নির্দেশকে 2 টি ভিন্ন ভিন্ন উপায়ে এনকোড করার অনুমতি দিতে পারে যেখানে কিছু বিট 1 বা 0 হতে পারে My আমার পূর্ববর্তী অভিজ্ঞতাটি দেখায় যে উত্পন্ন বাইনারিগুলি একই সময়ের সবচেয়ে বেশি ছিল তবে মাঝে মাঝে জিসিসি অভিন্ন আকারের বাইনারি তৈরি করতে পারে তবে কিছু বাইট কেবল 1 বিটের দ্বারা আলাদা হয় 0xE0 0XE1 হয়।


এবং এটি কি ভিন্ন আচরণ বা "গুরুতর সমস্যা" বাড়ে?
ফ্লোরিয়ান স্ট্রাব

1

সাধারণভাবে, না। বেশিরভাগ যুক্তিযুক্ত পরিশীলিত সংকলকগুলি বস্তু মডিউলে সংকলনের সময় অন্তর্ভুক্ত করবে। এমনকি আপনি যখন ঘড়িটি পুনরায় সেট করতে চেয়েছিলেন তখন আপনি যখন কম্পাইলটি চালু করলেন তখন (এবং তারপরে আশা করুন যে ডিস্ক অ্যাক্সেস ইত্যাদি পূর্বের মতোই গতি ছিল)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.