আমি সম্প্রতি প্রগতিতে এটির একটি রেফারেন্স জুড়ে এসেছি এবং (এখন হিসাবে) এটি ব্যাখ্যা করা হয়নি।
আমি সন্দেহ এই এটা হতে পারে, কিন্তু আমি নিশ্চিত জানি না।
আমি সম্প্রতি প্রগতিতে এটির একটি রেফারেন্স জুড়ে এসেছি এবং (এখন হিসাবে) এটি ব্যাখ্যা করা হয়নি।
আমি সন্দেহ এই এটা হতে পারে, কিন্তু আমি নিশ্চিত জানি না।
উত্তর:
আপনি যদি LD_PRELOAD
একটি ভাগ করা অবজেক্টের পথে সেট করেন, সেই ফাইলটি অন্য কোনও লাইব্রেরির আগে (সি রানটাইম সহ, libc.so
) লোড হবে । সুতরাং ls
আপনার বিশেষ malloc()
প্রয়োগের সাথে চালানোর জন্য , এটি করুন:
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
LD_PRELOAD
। কারণটি হ'ল এটি পরিবেশের পরিবর্তনশীল, এটি শিশু প্রক্রিয়া দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত - যার পিতামাতার প্রক্রিয়ার চেয়ে আলাদা ওয়ার্কিং ডিরেক্টরি থাকতে পারে। সুতরাং কোনও আপেক্ষিক পাথ লাইব্রেরিটি প্রিলোডের জন্য সনাক্ত করতে ব্যর্থ হবে।
আপনি স্টক লাইব্রেরিতে একই চিহ্নগুলির সাথে একটি লাইব্রেরি তৈরি করে এবং এতে লাইব্রেরিটি উল্লেখ করে ওভাররাইড করতে পারেন LD_PRELOAD
।
কিছু লোক অমানুষিক অবস্থানগুলিতে লাইব্রেরি নির্দিষ্ট করতে এটি ব্যবহার করে তবে LD_LIBRARY_PATH
সে উদ্দেশ্যে আরও ভাল।
LD_PRELOAD
আপনি লাইব্রেরি অগ্রাধিকার দিতে পারেন সঙ্গে ।
উদাহরণস্বরূপ আপনি একটি লাইব্রেরি লিখতে পারেন যা বাস্তবায়ন করে malloc
এবং free
। এবং এগুলি LD_PRELOAD
আপনার সাথে লোড করে malloc
এবং free
মানকগুলির চেয়ে কার্যকর করা হবে।
calloc
? সব কি গোলযোগ হবে না?
malloc
এবং ফ্রি বিশেষত গ্লিবিতে নকশা করা হয়েছে যাতে স্টকটি calloc
আপনার আমদানি করা কল করতে পারে malloc
। অন্য কোনও ফাংশন দিয়ে এটি চেষ্টা করবেন না। এটি এত ভাল কাজ করবে না।
অনেক লোক উল্লেখ করেছেন, LD_PRELOAD
লাইব্রেরি প্রিলোড করতে ব্যবহার করে। BTW, আপনি পারেন চেক যদি সেটিং দ্বারা উপলব্ধ ldd
কমান্ড।
উদাহরণ: ধরুন আপনার নিজের প্রিলোড করা দরকার libselinux.so.1
।
> ldd /bin/ls
...
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f3927b1d000)
libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f3927914000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f392754f000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f3927311000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f392710c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3927d65000)
libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f3926f07000)
সুতরাং, আপনার প্রিলোড পরিবেশ সেট করুন:
export LD_PRELOAD=/home/patric/libselinux.so.1
আপনার লাইব্রেরি আবার পরীক্ষা করুন:
>ldd /bin/ls
...
libselinux.so.1 =>
/home/patric/libselinux.so.1 (0x00007fb9245d8000)
...
LD_PRELOAD
স্ট্যান্ডার্ড সেটটিকে ওভাররাইড করে এমন ফাংশনগুলির সাথে ভাগ করা লাইব্রেরি তালিকাবদ্ধ /etc/ld.so.preload
করে। এগুলি লোডার দ্বারা প্রয়োগ করা হয় /lib/ld-linux.so
। আপনি যদি কয়েকটি নির্বাচিত ফাংশন ওভাররাইড করতে চান তবে আপনি একটি ওভাররাইডিং অবজেক্ট ফাইল তৈরি করে সেটিংস করে এটি করতে পারেনLD_PRELOAD
; এই অবজেক্ট ফাইলে থাকা ফাংশনগুলি অন্যদের যেমন ছিল তেমন ফেলে রেখে কেবল সেই ফাংশনগুলিকে ওভাররাইড করবে।
ভাগ করা লাইব্রেরিগুলির সম্পর্কে আরও তথ্যের জন্য http://tldp.org/HOWTO/Program-Library-HOWTO/ Shared-libraries.html দেখুন
এখানে প্রিলোডিং সম্পর্কে একটি বিস্তারিত ব্লগ পোস্ট:
mylib.so
এনভির কাছে রফতানি করা সহজ :
$ export LD_PRELOAD=/path/mylib.so
$ ./mybin
অক্ষম করতে:
$ export LD_PRELOAD=
unset LD_PRELOAD
যখন LD_PRELOAD ব্যবহার করা হয় তখন ফাইলটি লোড হওয়ার আগে অন্য কোনও
$export LD_PRELOAD=/path/lib
lib করার আগে লোড হবে, এমনকি এটি প্রোগ্রামগুলিতেও ব্যবহার করা যেতে পারে
ব্যবহার LD_PRELOAD
পাথ আপনি অ্যাপ্লিকেশন লোডারকে ডিফল্টরূপে সরবরাহিত শেয়ার্ড অবজেক্টটি লোড করতে বাধ্য করতে পারেন।
বিকাশকারীরা ভাগ করে নেওয়া অবজেক্টগুলির বিভিন্ন সংস্করণ সরবরাহ করে তাদের অ্যাপ্লিকেশনগুলি ডিবাগ করতে এটি ব্যবহার করে।
আমরা এটি প্রস্তুত অ্যাপ্লিকেশনগুলি ব্যবহার করে বিদ্যমান ফাংশনগুলিকে ওভাররাইড করে নির্দিষ্ট অ্যাপ্লিকেশন হ্যাক করতে ব্যবহার করেছি।