আমি সম্প্রতি প্রগতিতে এটির একটি রেফারেন্স জুড়ে এসেছি এবং (এখন হিসাবে) এটি ব্যাখ্যা করা হয়নি।
আমি সন্দেহ এই এটা হতে পারে, কিন্তু আমি নিশ্চিত জানি না।
আমি সম্প্রতি প্রগতিতে এটির একটি রেফারেন্স জুড়ে এসেছি এবং (এখন হিসাবে) এটি ব্যাখ্যা করা হয়নি।
আমি সন্দেহ এই এটা হতে পারে, কিন্তু আমি নিশ্চিত জানি না।
উত্তর:
আপনি যদি 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/liblib করার আগে লোড হবে, এমনকি এটি প্রোগ্রামগুলিতেও ব্যবহার করা যেতে পারে
ব্যবহার LD_PRELOADপাথ আপনি অ্যাপ্লিকেশন লোডারকে ডিফল্টরূপে সরবরাহিত শেয়ার্ড অবজেক্টটি লোড করতে বাধ্য করতে পারেন।
বিকাশকারীরা ভাগ করে নেওয়া অবজেক্টগুলির বিভিন্ন সংস্করণ সরবরাহ করে তাদের অ্যাপ্লিকেশনগুলি ডিবাগ করতে এটি ব্যবহার করে।
আমরা এটি প্রস্তুত অ্যাপ্লিকেশনগুলি ব্যবহার করে বিদ্যমান ফাংশনগুলিকে ওভাররাইড করে নির্দিষ্ট অ্যাপ্লিকেশন হ্যাক করতে ব্যবহার করেছি।