অপ্রয়োজনীয় বিশ্লেষণ সহ লিনাক্স ন্যূনতম চলমান উদাহরণ
যেহেতু এটি একটি বাস্তবায়নের বিশদটি মান দ্বারা নির্দিষ্ট নয়, তাই আসুন কেবল একটি বিশেষ প্রয়োগের ক্ষেত্রে সংকলকটি কী করছে তা একবার দেখে নেওয়া যাক।
এই উত্তরে, আমি হয় সুনির্দিষ্ট উত্তরের সাথে লিঙ্ক করব যা বিশ্লেষণ করে, বা বিশ্লেষণ সরাসরি এখানে সরবরাহ করে এবং এখানে সমস্ত ফলাফল সংক্ষিপ্ত করে রাখি।
এগুলির সমস্তগুলি বিভিন্ন উবুন্টু / জিসিসি সংস্করণে রয়েছে এবং ফলাফলগুলি সম্ভবত সংস্করণগুলিতে বেশ স্থিতিশীল, তবে আমরা যদি কোনও প্রকারের সন্ধান পাই তবে আসুন আমরা আরও সুনির্দিষ্ট সংস্করণগুলি নির্দিষ্ট করি।
একটি ফাংশনের ভিতরে স্থানীয় পরিবর্তনশীল vari
সে হোক main
বা অন্য যে কোনও ফাংশন:
void f(void) {
int my_local_var;
}
যেমন দেখানো হয়েছে: জিডিবিতে <মান অপ্টিমাইজড> এর অর্থ কী?
-O0
: স্ট্যাক
-O3
: নিবন্ধন যদি তারা স্পিল না করে, অন্যথায় স্ট্যাক করুন
স্ট্যাকটি কেন বিদ্যমান তা অনুপ্রেরণার জন্য: x86 অ্যাসেমব্লিতে রেজিস্টারগুলিতে ব্যবহৃত পুশ / পপ নির্দেশাবলীর কাজ কী?
গ্লোবাল ভেরিয়েবল এবং static
ফাংশন ভেরিয়েবল
/* BSS */
int my_global_implicit;
int my_global_implicit_explicit_0 = 0;
/* DATA */
int my_global_implicit_explicit_1 = 1;
void f(void) {
/* BSS */
static int my_static_local_var_implicit;
static int my_static_local_var_explicit_0 = 0;
/* DATA */
static int my_static_local_var_explicit_1 = 1;
}
- যদি আরম্ভ হয়
0
বা না হয় (আর তাই সুস্পষ্টভাবে আরম্ভ করা হয় 0
): .bss
বিভাগে, আরও দেখুন: .bss বিভাগটি কেন প্রয়োজন?
- অন্যথায়:
.data
বিভাগ
char *
এবং char c[]
যেমন দেখানো হয়েছে: সি এবং সি ++ এ স্ট্যাটিক ভেরিয়েবলগুলি কোথায় রয়েছে?
void f(void) {
/* RODATA / TEXT */
char *a = "abc";
/* Stack. */
char b[] = "abc";
char c[] = {'a', 'b', 'c', '\0'};
}
টোডো কি খুব বড় স্ট্রিং লিটারেলগুলি স্ট্যাকের উপরে রাখা হবে? নাকি .data
? বা সংকলন ব্যর্থ হয়?
ফাংশন যুক্তি
void f(int i, int j);
প্রাসঙ্গিক কলিং কনভেনশনটি অবশ্যই যেতে হবে, যেমন: এক্স ৮86 এর জন্য https://en.wikedia.org/wiki/X86_calling_conventions , যা প্রতিটি ভেরিয়েবলের জন্য নির্দিষ্ট রেজিস্টার বা স্ট্যাকের অবস্থান নির্দিষ্ট করে।
তারপরে জিডিবিতে <মান অপ্টিমাইজড> এর অর্থ কী? , -O0
তারপরে স্ট্যাকের মধ্যে সমস্ত কিছু স্লਪਰ্পস করে, -O3
যতটা সম্ভব রেজিস্টারগুলি ব্যবহার করার চেষ্টা করে।
যদি ফাংশনটি অন্তর্ভুক্ত হয় তবে তাদের নিয়মিত স্থানীয়দের মতোই চিকিত্সা করা হবে।
const
আমি বিশ্বাস করি যে এটি কোনও পার্থক্য করে না কারণ আপনি এটিকে দূরে টাইপকাস্ট করতে পারেন।
বিপরীতভাবে, যদি সংকলকটি নির্ধারণ করতে সক্ষম হয় যে কিছু ডেটা কখনও লিখিত হয় না, তবে এটি তাত্ত্বিকভাবে এটি স্থাপন করতে .rodata
পারে তবে কনস্ট নাও।
টোডো বিশ্লেষণ।
পয়েন্টার
এগুলি ভেরিয়েবল (এতে অ্যাড্রেস রয়েছে, যা সংখ্যা রয়েছে), তবে বাকি সমস্তগুলির মতো :-)
যদি malloc
প্রশ্নটি malloc
যেহেতু malloc
কোনও ফাংশন, এবং এর জন্য: তেমন কোনও অর্থবোধ করে না:
int *i = malloc(sizeof(int));
*i
একটি পরিবর্তনশীল যা একটি ঠিকানা রয়েছে, সুতরাং এটি উপরের ক্ষেত্রে পড়ে।
অভ্যন্তরীণভাবে মলোক কীভাবে কাজ করে আপনি যখন লিনাক্স কার্নেলটি তার অভ্যন্তরীণ ডেটা স্ট্রাকচারগুলিতে নির্দিষ্ট ঠিকানাগুলি লিখনযোগ্য হিসাবে চিহ্নিত করেন এবং যখন প্রাথমিকভাবে তারা প্রোগ্রামটি স্পর্শ করেন, ত্রুটি ঘটে এবং কার্নেল পৃষ্ঠার সারণিগুলিকে সক্ষম করে, যা অ্যাক্সেস করতে দেয় সেগফুল ছাড়াই ঘটে: x86 পেজিং কীভাবে কাজ করে?
তবে খেয়াল করুন যে exec
আপনি যখন এক্সিকিউটেবল চালনার চেষ্টা করেন তখন সিস্কলটি হুডের নীচে ঠিক কী ঘটে: এটি যে পৃষ্ঠাগুলিতে লোড করতে চায় তা চিহ্নিত করে এবং সেখানে প্রোগ্রামটি লেখেন, এটিও দেখুন: কার্নেল কীভাবে এক্সিকিউটেবল বাইনারি ফাইলটি চলমান তা পেতে পারে? লিনাক্স? exec
কোথায় লোড করতে হবে তার উপর কিছু অতিরিক্ত সীমাবদ্ধতা ব্যতীত (যেমন কোডটি স্থানান্তরযোগ্য নয় )।
সঠিক ব্যবহার করা প্রাপ্ত syscall malloc
হয় mmap
আধুনিক 2020 বাস্তবায়নের, এবং অতীতে brk
ব্যবহার করা হয়েছে: নেই যদি malloc () ব্যবহার brk () বা mmap ()?
ডায়নামিক লাইব্রেরি
মূলত mmap
মেমরিতে এড করুন: /unix/226524/ কি- সিস্টেমে-call-is- used-to- load-libraries-in-linux/462710# 462710
এনভাইন্রোমেন্ট ভেরিয়েবল এবং main
এরargv
প্রাথমিক স্ট্যাকের উপরে: /unix/75939/ कहीं-is-the-en वातावरण- স্ট্রিং- অ্যাক্টুয়াল-স্টোরড টোডো কেন .ডাটাতে নেই?