শুধুমাত্র মন্তব্য সহ দুটি বাইনারি প্রোগ্রামগুলি জিসিসিতে হুবহু মিলে না কেন?


110

আমি দুটি সি প্রোগ্রাম তৈরি করেছি

  1. প্রোগ্রাম 1

    int main()
    {
    }
    
  2. প্রোগ্রাম 2

    int main()
    {
    //Some Harmless comments
    }
    

আফাইক, সংকলন করার সময়, সংকলক (জিসিসি) মন্তব্য এবং অপ্রয়োজনীয় হোয়াইটস্পেসগুলি উপেক্ষা করবে এবং সুতরাং আউটপুটটি অবশ্যই সমান হতে হবে।

কিন্তু যখন আমি আউটপুট বাইনারিগুলির md5sums পরীক্ষা করেছিলাম তখন সেগুলি মেলে না। আমিও অপ্টিমাইজেশান সঙ্গে সংকলন চেষ্টা -O3এবং -Ofastকিন্তু এখনও তারা মেলেনি।

এখানে কি হচ্ছে?

সম্পাদনা করুন: সঠিক কমান্ড এবং md5sums রয়েছে (t1.c প্রোগ্রাম 1 এবং t2.c প্রোগ্রাম 2)

gcc ./t1.c -o aaa
gcc ./t2.c -o bbb
98c1a86e593fd0181383662e68bac22f  aaa
c10293cbe6031b13dc6244d01b4d2793  bbb

gcc ./t2.c -Ofast -o bbb
gcc ./t1.c -Ofast -o aaa
2f65a6d5bc9bf1351bdd6919a766fa10  aaa
c0bee139c47183ce62e10c3dbc13c614  bbb


gcc ./t1.c -O3 -o aaa
gcc ./t2.c -O3 -o bbb
564a39d982710b0070bb9349bfc0e2cd  aaa
ad89b15e73b26e32026fd0f1dc152cd2  bbb

এবং হ্যাঁ, md5sums একই পতাকা সহ একাধিক সংকলন জুড়ে।

বিটিডাব্লু আমার সিস্টেম gcc (GCC) 5.2.0এবংLinux 4.2.0-1-MANJARO #1 SMP PREEMPT x86_64 GNU/Linux


17
আপনার সঠিক কমান্ড লাইন পতাকা অন্তর্ভুক্ত করুন। উদাহরণস্বরূপ, ডিবাগ তথ্য কি আদৌ বাইনারিগুলিতে অন্তর্ভুক্ত থাকে? যদি তা হয়, পরিবর্তন করা লাইন নম্বরগুলি স্পষ্টতই এটির উপর প্রভাব ফেলবে ...
জন স্কিটে

4
একই কোডের একাধিক বিল্ড জুড়ে MD5 যোগফল কি সামঞ্জস্য হয়?
unenthusiasticuser

3
আমি এটি পুনরুত্পাদন করতে পারি না। আমি অনুমান করেছি যে জিসিসি মেটাডেটার পুরো গোছা বাইনারিগুলিতে সংকলন করার সময় (টাইমস্ট্যাম্প সহ) এই কারণে ঘটেছিল। আপনি যদি সুনির্দিষ্ট কমান্ড লাইন পতাকা ব্যবহার করেছেন তবে এটি কার্যকর হবে।
সাইফার

2
এমডি 5sums যাচাই করা এবং আটকে যাওয়ার পরিবর্তে হেক্সডাম্প এবং ঠিক কোনটি বাইটগুলি পৃথক করে তা দেখতে আলাদা
এমএম

12
যদিও এই প্রশ্নের উত্তর "দুটি সংকলক আউটপুটগুলির মধ্যে কী আলাদা?" আকর্ষণীয়, আমি নোট করি যে প্রশ্নটির একটি অনিচ্ছাকৃত ধারণা আছে: যে দুটি ফলাফল একই হওয়া উচিত এবং কেন সেগুলি আলাদা সে সম্পর্কে আমাদের কিছু ব্যাখ্যা প্রয়োজন । সমস্ত সংকলক আপনাকে প্রতিশ্রুতি দেয় যে আপনি যখন এটিকে একটি আইনী সি প্রোগ্রাম দেন, আউটপুটটি একটি আইনী এক্সিকিউটেবল যা সেই প্রোগ্রামটি কার্যকর করে। সংকলকটির যে কোনও দুটি মৃত্যুদণ্ড একই বাইনারি তৈরি করে তা সি স্ট্যান্ডার্ডের গ্যারান্টি নয়।
এরিক লিপার্ট

উত্তর:


159

এটি ফাইলের নামগুলি পৃথক হওয়ার কারণে (যদিও স্ট্রিং আউটপুট একই)। যদি আপনি নিজে ফাইলটি পরিবর্তনের চেষ্টা করেন (দুটি ফাইল রাখার চেয়ে) তবে আপনি লক্ষ্য করবেন যে আউটপুট বাইনারিগুলি আর আলাদা নয়। জেনস এবং আমি উভয়েই বলেছি, এটি হ'ল কারণ, জিসিসি সঠিক উত্স ফাইলের নাম (এবং এএএএএআইসিএস যেমন ঝনঝন করে) সহ এটি তৈরি করে বাইনারিগুলিতে পুরো মেটাডেটার পুরো বোঝা ফেলে দেয়।

এটা চেষ্টা কর:

$ cp code.c code2.c subdir/code.c
$ gcc code.c -o a
$ gcc code2.c -o b
$ gcc subdir/code.c -o a2
$ diff a b
Binary files a and b differ
$ diff a2 b
Binary files a2 and b differ
$ diff -s a a2
Files a and a2 are identical

আপনার md5sums বিল্ডগুলির মধ্যে কেন পরিবর্তন হয় না তা এটি ব্যাখ্যা করে তবে তারা বিভিন্ন ফাইলের মধ্যে পৃথক। আপনি যদি চান, আপনি জেনস পরামর্শ মতো যা করতে পারেন এবং stringsপ্রতিটি বাইনারিটির আউটপুট তুলনা করে দেখতে পাবেন যে ফাইলনামগুলি বাইনারিতে এমবেড করা আছে। আপনি যদি এটি "ফিক্স" করতে চান তবে আপনি stripবাইনারিগুলি এবং মেটাডেটা সরিয়ে ফেলতে পারবেন:

$ strip a a2 b
$ diff -s a b
Files a and b are identical
$ diff -s a2 b
Files a2 and b are identical
$ diff -s a a2
Files a and a2 are identical

সম্পাদনা: আপনি সমস্যাটিকে "ফিক্স" করতে বাইনারি ফেলাতে পারেন তা জানাতে আপডেট হয়েছে।
সাইফার

30
এবং এই কারণেই আপনার সমাবেশের আউটপুট তুলনা করা উচিত, MD5 চেকসামগুলি নয়।
অরবিটে 4-1015

1
আমি এখানে একটি ফলো-আপ প্রশ্ন জিজ্ঞাসা করেছি ।
ফেডেরিকো পোলোনি

4
অবজেক্ট ফাইল ফর্ম্যাট উপর নির্ভর করে সংকলন সময় অবজেক্ট ফাইলে সংরক্ষণ করা হয়। সুতরাং সিএফএফ ফাইলগুলি উদাহরণস্বরূপ ফাইল এবং a2 ফাইলগুলি অভিন্ন হবে না।
মার্টিন রোজনৌ

28

সর্বাধিক সাধারণ কারণ হ'ল সংকলক দ্বারা ফাইলের নাম এবং সময় স্ট্যাম্পগুলি যুক্ত করা হয় (সাধারণত ইএলএফ বিভাগগুলির ডিবাগ তথ্য অংশে)।

চালানোর চেষ্টা করুন

 $ strings -a program > x
 ...recompile program...
 $ strings -a program > y
 $ diff x y

এবং আপনি কারণ দেখতে পারেন। আমি একবার এটি ব্যবহার করেছি কেন একই উত্সটি বিভিন্ন ডিরেক্টরিতে সংকলিত হওয়ার পরে বিভিন্ন কোডের কারণ ঘটায়। সন্ধানটি হ'ল __FILE__ম্যাক্রো একটি সম্পূর্ণ ফাইলের আকারে প্রসারিত হয়েছে , উভয় গাছের চেয়ে আলাদা।


1
Gcc.gnu.org/ML/gcc-help/2007-05/msg00138.html অনুসারে (পুরানো, আমি জানি) তারা টাইমস্ট্যাম্পগুলি সংরক্ষণ করে না এবং এটি লিঙ্কারের সমস্যা হতে পারে। যদিও, আমি সম্প্রতি একটি গল্প পড়ে মনে করি কীভাবে একটি সুরক্ষা সংস্থা তাদের বাইনারিগুলিতে জিসিসির টাইমস্ট্যাম্প তথ্য ব্যবহার করে কোনও হ্যাকিং দলের কাজের অভ্যাসকে প্রমাণ করেছিল।
সাইফার

3
এবং ওপি বলেছে না যে "এমডি 5sums একই পতাকাগুলির সাথে একাধিক সংকলন জুড়ে মেলে" যা এটি ইঙ্গিত করে যে এটি সম্ভবত টাইমস্ট্যাম্পগুলি নয় যা সমস্যাটি সৃষ্টি করছে। এগুলি সম্ভবত বিভিন্ন ফাইলের নাম হওয়ার কারণে ঘটেছিল।
সাইফার

1
@cyphar বিভিন্ন ফাইলের নামও স্ট্রিং / ডিফ পদ্ধতির মাধ্যমে ধরা উচিত।
জেনস

15

দ্রষ্টব্য : মনে রাখবেন যে উত্স ফাইলের নামটি আনস্ট্রিপড বাইনারিতে চলে যায়, সুতরাং আলাদাভাবে নামযুক্ত উত্স ফাইল থেকে আসা দুটি প্রোগ্রামের বিভিন্ন হ্যাশ থাকবে।

অনুরূপ পরিস্থিতিতে, উপরেরগুলি প্রয়োগ করা উচিত নয় , আপনি চেষ্টা করতে পারেন:

  • stripকিছু মেদ অপসারণ করতে বাইনারি বিরুদ্ধে চলছে । যদি স্ট্রিপড বাইনারিগুলি একই হয় তবে এটি কিছু মেটাডেটা ছিল যা প্রোগ্রাম অপারেশনের জন্য অত্যাবশ্যক নয়।
  • একটি সমাবেশ অন্তর্বর্তী আউটপুট উৎপাদিত তা যাচাই করতে পার্থক্য প্রকৃত CPU- র নির্দেশাবলী নয় (ভাল উৎস সন্ধান করতে বা অবশ্য যেখানে পার্থক্য আসলে হয় )
  • stringsউভয় প্রোগ্রামকে হেক্সে ব্যবহার করুন বা ডাম্প করুন এবং দুটি হেক্স ডাম্পের উপর একটি পৃথক চালান। পার্থক্যটি (গুলি) স্থাপন করার পরে আপনি চেষ্টা করে দেখতে পারেন যে তাদের কিছু ছড়া আছে বা কারণ রয়েছে (পিআইডি, টাইমস্ট্যাম্পস, উত্স ফাইল টাইমস্ট্যাম্প ...)। উদাহরণস্বরূপ, ডায়াগনস্টিক উদ্দেশ্যে সংকলন সময়ে আপনার টাইমস্ট্যাম্প সংরক্ষণ করার একটি রুটিন থাকতে পারে ।

আমার সিস্টেমটি হল gcc (GCC) 5.2.0এবংLinux 4.2.0-1-MANJARO #1 SMP PREEMPT x86_64 GNU/Linux
নিবন্ধিত ব্যবহারকারী

2
আপনি চেষ্টা করা উচিত আসলে দুটি পৃথক ফাইল করে। আমি কোনও একটি ফাইলই সংশোধন করে এটি পুনরুত্পাদন করতে পারিনি।
সাইফার

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