লিনাক্সে বাইনারি আকার কমাতে সংকলন সময় বিবেচনাগুলি কি কি?


1

আমি একটি ইউটিলিটি সংকলন করেছি এবং আমার লিনাক্স সিস্টেমে বাইনারি তৈরি করেছি। তবে এই বাইনারিটির আকার 2.3 মেগাবাইট এবং আমার এই বাইনারিটির আকার হ্রাস করতে হবে। আমি বাইনারিটিতে স্ট্রিপ প্রয়োগ করার চেষ্টা করেছি তবে এটি পর্যাপ্ত নয়। সুতরাং কোন বিকল্প (সম্ভবত কনফিগারেশন) আছে, যা আমি ইউটিলিটিটি সংকলনের সময় প্রয়োগ করতে পারি?

তোমার উত্তরের জন্য আগাম ধন্যবাদ.


সম্ভব হলে সংকলক যুক্ত করুন (পাশাপাশি সংকলনের জন্য ব্যবহৃত লাইন)। কেবল মনে রাখবেন যে বেশিরভাগ সংকলনের সময় স্যুইচগুলি (অপ্টিমাইজেশন ব্যতীত) কেবল কোডটি সরিয়ে ফেলবে, যেমন বাইনারি থেকে নির্ভরতাতে।
মারিও

আপনার উত্তরের জন্য মারিও ধন্যবাদ। তবে অ্যাড কমাইল দ্বারা আপনার সিসি বিকল্পটি যুক্ত করার অর্থ কী? কারণ আমি এটি ক্রস সংকলন করায় ইতিমধ্যে এটি যুক্ত করেছি।
nyk_mat

হ্যাঁ, তবে উপলভ্য বিকল্পগুলি ব্যবহৃত সংকলকটির উপর নির্ভর করে। উদাহরণস্বরূপ আপনি গতি বা আকারের জন্য অনুকূলিত করতে পারেন এবং আপনি স্থিতিশীলভাবে বা গতিশীলভাবে নির্ভরতাগুলি সংযুক্ত করতে চান কিনা তা নির্ধারণ করতে পারেন।
মারিও

@nyk_mat এটি কি লিনাক্স কার্নেল বা লিনাক্সে চালানোর উদ্দেশ্যে তৈরি এমন কোনও প্রোগ্রাম সম্পর্কে ? লিনাক্স কার্নেলের ক্ষেত্রে, make menuconfigআপনার যা প্রয়োজন তা ব্যবহার করুন এবং অক্ষম করুন। অন্যান্য প্রোগ্রামগুলির জন্য, আপনি বৈশিষ্ট্যগুলি অক্ষম করতে পারবেন কিনা তা পরীক্ষা করে দেখুন (অটোকনফ প্রকল্পগুলির জন্য, ./configure --disable-FEATURE --without-PACKAGEযেখানে বৈশিষ্ট্য এবং প্যাকেজ প্রতিস্থাপন করতে হবে See দেখুন ./configure --help)
লেকেনস্টেইন

স্পষ্টতা অনুরোধ করতে মন্তব্যগুলি ব্যবহার করুন। আপনার সম্পাদনাটিকে মন্তব্য হিসাবে পোস্ট করুন, তারপরে আপনার মূল প্রশ্নের অধীনে 'সম্পাদিত' লিঙ্ক এবং পূর্ববর্তী সংশোধনের আওতায় 'রোলব্যাক' ক্লিক করে রোলব্যাক পরিবর্তন করুন।
gronostaj

উত্তর:


3

আপনি সংকলনের জন্য জিসিসি ব্যবহার করে আপনি -os পতাকা ব্যবহার করতে পারেন। আপনি এটি এখানে জিসিসি পতাকা পৃষ্ঠাগুলিতে খুঁজে পেতে পারেন -

-Os
    Optimize for size. -Os enables all -O2 optimizations that do not typically increase code size. It also performs further optimizations designed to reduce code size.

    -Os disables the following optimization flags:

              -falign-functions  -falign-jumps  -falign-loops 
              -falign-labels  -freorder-blocks  -freorder-blocks-and-partition 
              -fprefetch-loop-arrays

যদি কোনও কারণে আপনার কাছে অবশ্যই এই পতাকাগুলি থাকে তবে ভাল, এটি আপনার পক্ষে নয়। এছাড়াও আপনি আকারের জন্য পারফরম্যান্সের সাথে আপস করছেন

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


1

এক্সিকিউটেবল আকার হ্রাস করতে আপনি নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করতে পারেন:

  • নির্ধারণযোগ্য চিহ্নগুলি ডিবাগিং ছাড়াই সংকলন করা হয়েছে তা নিশ্চিত করুন। আপনার মেকফিলের কমান্ড লাইনের বিকল্পগুলিতে পতাকা -gউপস্থিত থাকলে এটি ঘটবে gcc। এটি সাধারণত ডিফল্ট, কারণ এটি সহজেই এইরকম এক্সিকিউটেবল ডিবাগ করতে দেয়। আপনি stripবিদ্যমান এক্সিকিউটেবল থেকে ডিবাগিং প্রতীকগুলি অপসারণ করতে ইউটিলিটিটি ব্যবহার করতে পারেন । খুব প্রায়ই, এটি একা এক্সিকিউটেবলের আকার 2 বা ততোধিক বার হ্রাস করতে পারে, কখনও কখনও 10 বারেরও বেশি।
  • সমস্ত প্রয়োজনীয় গ্রন্থাগারগুলি গতিশীলভাবে সঙ্কলন করুন (বিশেষত glibcলিনাক্সে সি রানটাইম লাইব্রেরি )। স্থিতিশীল সংকলন ( -s) নির্ভরতা এড়ানোর জন্য ভাল, তবে এটি কার্যকরভাবে বাড়ানো আকারের দামে আসে। উদাহরণস্বরূপ, যদি আপনার এক্সিকিউটেবলের libxML2 প্রয়োজন হয়, গতিশীলভাবে লিঙ্ক -lxml2করতে gccকমান্ড লাইনে যুক্ত করুন libxml2। এই পদ্ধতির খারাপ দিকটি হ'ল আপনার টার্গেট সিস্টেমে প্রয়োজনীয় লাইব্রেরি ইনস্টল না করা থাকলে আপনার নির্বাহযোগ্য ক্রাশ হবে (আপনাকে অবশ্যই sudo apt-get install libxml2প্রথমে চালানোর বিষয়টি নিশ্চিত করতে হবে )।
  • আকার অনুসারে অপ্টিমাইজেশন সক্ষম করুন -Os। তবে, সাধারণ লাভগুলি খুব সামান্য, খুব কমই 5% -10% এর বেশি।
  • আপনার এক্সিকিউটেবল ব্যবহার করে সংকুচিত করুন upx(এটি দিয়ে ইনস্টল করুন sudo apt-get install upx-ucl)। upxপ্যাকিং না শুধুমাত্র ইন্টেল প্ল্যাটফর্মের জন্য, কিন্তু অনেক অন্যান্য প্ল্যাটফর্মের জন্য, আর্ম mips, PowerPC, ইত্যাদি উল্লেখ্য, যখন মত সমর্থন upxআকার চিত্তাকর্ষক রিডাকশন (2x-5x) দিতে পারে, এটা অন্ধভাবে ব্যবহার করা উচিত নয়। স্ট্যান্ডার্ড এক্সিকিউটেবলের বিপরীতে, সংকুচিতরা upxএকই ক্যাশে পৃষ্ঠা ভাগ করতে পারে না। উদাহরণস্বরূপ, যদি আপনার প্রোগ্রামটি 2MB আকারের হয় এবং আপনি এটির 100 টি অনুলিপি শুরু করেন তবে এটি কেবল 2 এমবি মেমরি ব্যবহার করবে - কার্নেল ক্যাশেড পৃষ্ঠাগুলি পুনরায় ব্যবহার করবে। আপনি যদি upx1 এমবি বলার সাথে সংক্ষেপ করে 100 টি কপি শুরু করেন তবে এটি 200 এমবি মেমরি গ্রহণ করবে। তবে, এটির জন্য কেবল ডিস্ক থেকে 1 এমবি পড়তে হবে এবং এটি প্রথম অনুলিপিটির জন্য সূচনার সময়কে হ্রাস করবে কারণ এটি যথেষ্ট কারণupx সঙ্কোচন খুব দ্রুত (ডিস্ক থেকে পড়ার চেয়ে অনেক দ্রুত)।

ধন্যবাদ জার্নম্যান গিক, আমি অপ্টিমাইজেশন পতাকাগুলি সম্পর্কে সম্পূর্ণরূপে ভুলে গেছি। আমি এটি ব্যবহার করব। তবে আমি আপেক্স সম্পর্কে জানতাম না, তাই আমার সিস্টেমে কি আমার এটি সংকলন করা দরকার? আমি যদি এটি আমার পিসিতে সংকলন করি এবং বাইনারিগুলি সংকুচিত করি এবং সেগুলি বোর্ডে অনুলিপি করি তবে এটি কি কাজ করবে? বা আমার সিস্টেমের জন্য আমার এটি সংকলন করা দরকার?
nyk_mat

1. আমি জার্নিম্যান গীক নই। ২. না, আপনি আপনার সিস্টেমের জন্য আপস সংকলন করবেন না - এটি ইতিমধ্যে ক্রস প্ল্যাটফর্ম এবং "বিদেশী" এক্সিকিউটেবলকে ঠিক জরিমানা করতে পারে
এমভিপি

দুঃখিত, আমার খারাপ। এবং উত্তরের জন্য ধন্যবাদ। আমার সিস্টেমে আই 686 প্রসেসর রয়েছে, তাই আমি ইউসিএল-1.03-10.fc14.i686 আরপিএম ডাউনলোড করেছি। আমি যখন এটি ইনস্টল করার চেষ্টা করব, এটি দেখায় যে প্যাকেজটি ইতিমধ্যে 57bbccba ইনস্টল নয় এমন সতর্কতার সাথে ইনস্টল করা আছে। তবে যখন আমি rpm -q ucl-1.03-10.fc14.i686 চেষ্টা করেছি, এটি দেখায় যে প্যাকেজ ইনস্টল করা নেই। তাহলে কি আমার সিস্টেমে এই কীটি ইনস্টল করা দরকার?
nyk_mat

দেখে মনে হচ্ছে আপনি পুরানো ফেডোরা বাক্সটি ব্যবহার করছেন। আপনি সহজেই এটি ইনস্টল করতে সক্ষম হবেন sudo yum install upx(এটি আমি আমার ফেডোরা 16 বাক্সে এটি ইনস্টল করেছি)।
এমভিপি

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