LD_PRELOAD কৌশলটি কী?


341

আমি সম্প্রতি প্রগতিতে এটির একটি রেফারেন্স জুড়ে এসেছি এবং (এখন হিসাবে) এটি ব্যাখ্যা করা হয়নি।

আমি সন্দেহ এই এটা হতে পারে, কিন্তু আমি নিশ্চিত জানি না।


1
সত্যিই কোনও উত্তর নয় তাই আমি এটিকে একটি হিসাবে পোস্ট করব না ... স্টিফেন কেল এই ভিডিওতে তাঁর লাইবোলোক লাইব্রেরির জন্য LD_PRELOAD ব্যবহার করছেন এবং আপনি যদি পূর্ববর্তী বিটগুলি দেখেন তবে আপনি কীভাবে / কেন তার আরও ভাল ধারণা পেতে পারেন। অন্যান্য গতিশীল ভাষা একে অপরের সাথে কথা বলতে পারে তাই লিবলোকগুলি ব্যবহার করা হচ্ছে বলে মনে হয়। এই আলাপটির মধ্যে কিছু গভীর ইন্টার্নাল ব্যাখ্যা করা হয়েছে। youtu.be/LwicN2u6Dro?t=24m10s
এলিজা লিন

উত্তর:


415

আপনি যদি LD_PRELOADএকটি ভাগ করা অবজেক্টের পথে সেট করেন, সেই ফাইলটি অন্য কোনও লাইব্রেরির আগে (সি রানটাইম সহ, libc.so) লোড হবে । সুতরাং lsআপনার বিশেষ malloc()প্রয়োগের সাথে চালানোর জন্য , এটি করুন:

$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls

12
এটির অস্তিত্ব সম্পর্কে আমার কোনও ধারণা ছিল না ... দেখে মনে হচ্ছে এটি সুরক্ষা আক্রমণগুলির জন্য একটি বড় ভেক্টর হবে। কোনও ধারণা কীভাবে এটি সুরক্ষিত?
rmeador

141
এটি সত্যতা দ্বারা সুরক্ষিত হয় যে লোডার যদি অজ্ঞান হয়ে যায় তবে LD_PRELOAD উপেক্ষা করবে! = ইইউড - জোশুয়া
জোশুয়া

18
@ জোশুয়া: রুজি ও ইওইড কী?
heinrich5991


59
একটি গুরুত্বপূর্ণ বিষয় মনে রাখা: আপনি সাধারণত একটি নিখুঁত পথ নির্দিষ্ট করতে চান LD_PRELOAD। কারণটি হ'ল এটি পরিবেশের পরিবর্তনশীল, এটি শিশু প্রক্রিয়া দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত - যার পিতামাতার প্রক্রিয়ার চেয়ে আলাদা ওয়ার্কিং ডিরেক্টরি থাকতে পারে। সুতরাং কোনও আপেক্ষিক পাথ লাইব্রেরিটি প্রিলোডের জন্য সনাক্ত করতে ব্যর্থ হবে।
ফ্রেরিচ রাবাবে

49

আপনি স্টক লাইব্রেরিতে একই চিহ্নগুলির সাথে একটি লাইব্রেরি তৈরি করে এবং এতে লাইব্রেরিটি উল্লেখ করে ওভাররাইড করতে পারেন LD_PRELOAD

কিছু লোক অমানুষিক অবস্থানগুলিতে লাইব্রেরি নির্দিষ্ট করতে এটি ব্যবহার করে তবে LD_LIBRARY_PATHসে উদ্দেশ্যে আরও ভাল।


17
"কিছু লোক এটি মানহীন লোকেশনে লাইব্রেরি নির্দিষ্ট করতে ব্যবহার করে" ... সত্যই? "কিছু লোক এটি ভুল ব্যবহার করে" এর মতো শব্দ!
টম

6
LD_PRELOAD লোড অর্ডার ইন্টারসেপ্ট অ্যাপ্লিকেশন-নির্দিষ্ট হার্ডকোডযুক্ত পাথের কারণে করতে পারে।
জোশুয়া

1
এটি কোনও সামঞ্জস্যপূর্ণ বলে ধরে নিলে কোনও গ্রন্থাগারের আলাদা সংস্করণটি আগে থেকে লোড করা কোনও অপব্যবহার হবে ?
z0r

2
আমি দেখেছি এটি কোনও ডিবাগ বা চালিত রূপটি লোড করতে বা এমন একটি লাইব্রেরি লোড করতে ব্যবহৃত হয়েছিল যা বেস লাইব্রেরি থেকে পুরোপুরি কিছুটা আলাদা করে তোলে যেমন অন্য কোনও সিস্টেমকে অনুকরণ করে।
জোশুয়া

1
যে ক্ষেত্রে লাইব্রেরিগুলি সঠিকভাবে সংকলন করা হয়নি (এটি পুরোপুরি মাইএসকিএল দিয়ে চালানো হত যেখানে এটি একটি জেনেরিক লাইবমিস্কেল_স্লায়েন্টের সাথে looseিলে coupালা সংযোগ স্থাপন করে যা কোনও পুরানো সংস্করণের সিমিলিংকে ওভাররোট করে - আপনি যে পার্ল ব্যবহার করেছিলেন তার উপর নির্ভর করে আপনি নির্দিষ্ট সংস্করণটি ব্যবহার করেছেন / এটি LD_PRELOAD দিয়ে কার্যকর করুন .. দরকারী কৌশল trickআমি যদি সঠিকভাবে মনে রাখি তবে ভালগ্রাইন্ড এই কৌশলটি পুনরায় সংকলনের প্রয়োজন ছাড়াই বাইনারিগুলিতে ডিবাগিংয়ের ক্ষমতা সরবরাহ করতে ব্যবহার করে .. এটি বেশ কার্যকর
সিনথেসাইজারপ্যাটেল

37

LD_PRELOADআপনি লাইব্রেরি অগ্রাধিকার দিতে পারেন সঙ্গে ।

উদাহরণস্বরূপ আপনি একটি লাইব্রেরি লিখতে পারেন যা বাস্তবায়ন করে mallocএবং free। এবং এগুলি LD_PRELOADআপনার সাথে লোড করে mallocএবং freeমানকগুলির চেয়ে কার্যকর করা হবে।


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

7
@ জানুস ট্রেলসন যদি আপনার লেখার লাইব্রেরি একটি নির্দিষ্ট অংশ প্রয়োগ না করে তবে সেই অংশটি মূল লাইব্রেরি থেকে লোড করা হবে।
উড্রো বার্লো 14

@ জ্যানুসট্রেলসন, অন্য কথায়, এলডিপ্রেলএড আপনাকে নির্দিষ্ট চিহ্নের কোন প্রয়োগটি ব্যবহৃত হয় তা নির্দিষ্ট করতে দেয় । প্রিললোডড লাইব্রেরি যদি একটি প্রতীক রফতানি না করে তবে এটি অন্যত্র পাওয়া যাবে।
sherrellbc

1
@ জ্যানুসট্রেলসেন: দেখা যাচ্ছে যে এটি mallocএবং ফ্রি বিশেষত গ্লিবিতে নকশা করা হয়েছে যাতে স্টকটি callocআপনার আমদানি করা কল করতে পারে malloc। অন্য কোনও ফাংশন দিয়ে এটি চেষ্টা করবেন না। এটি এত ভাল কাজ করবে না।
জোশুয়া

30

অনেক লোক উল্লেখ করেছেন, 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)
    ...

9

LD_PRELOADস্ট্যান্ডার্ড সেটটিকে ওভাররাইড করে এমন ফাংশনগুলির সাথে ভাগ করা লাইব্রেরি তালিকাবদ্ধ /etc/ld.so.preloadকরে। এগুলি লোডার দ্বারা প্রয়োগ করা হয় /lib/ld-linux.so। আপনি যদি কয়েকটি নির্বাচিত ফাংশন ওভাররাইড করতে চান তবে আপনি একটি ওভাররাইডিং অবজেক্ট ফাইল তৈরি করে সেটিংস করে এটি করতে পারেনLD_PRELOAD ; এই অবজেক্ট ফাইলে থাকা ফাংশনগুলি অন্যদের যেমন ছিল তেমন ফেলে রেখে কেবল সেই ফাংশনগুলিকে ওভাররাইড করবে।

ভাগ করা লাইব্রেরিগুলির সম্পর্কে আরও তথ্যের জন্য http://tldp.org/HOWTO/Program-Library-HOWTO/ Shared-libraries.html দেখুন


3

এখানে প্রিলোডিং সম্পর্কে একটি বিস্তারিত ব্লগ পোস্ট:

https://blog.cryptomilk.org/2014/07/21/what-is-preloading/


13
আপনার উত্তর পোস্ট করার জন্য ধন্যবাদ! দয়া করে মনে রাখবেন যে উত্তরের প্রয়োজনীয় অংশগুলি এখানে, এই সাইটে আপনার পোস্ট করা উচিত, বা আপনার পোস্ট ঝুঁকিগুলি মুছে ফেলা উচিত FAQ দেখুন যেখানে এটি এমন উত্তরগুলির উল্লেখ করে যেখানে 'লিঙ্কের চেয়ে সবেমাত্র বেশি'। আপনি চাইলে লিঙ্কটি অন্তর্ভুক্ত করতে পারেন তবে কেবল 'রেফারেন্স' হিসাবে। উত্তরটি লিঙ্কটির প্রয়োজন ছাড়াই নিজেরাই দাঁড়ানো উচিত।
তারিন

3

mylib.soএনভির কাছে রফতানি করা সহজ :

$ export LD_PRELOAD=/path/mylib.so
$ ./mybin

অক্ষম করতে:

$ export LD_PRELOAD=

7
বাunset LD_PRELOAD
মর্টেন

2

যখন LD_PRELOAD ব্যবহার করা হয় তখন ফাইলটি লোড হওয়ার আগে অন্য কোনও $export LD_PRELOAD=/path/liblib করার আগে লোড হবে, এমনকি এটি প্রোগ্রামগুলিতেও ব্যবহার করা যেতে পারে


1

ব্যবহার LD_PRELOADপাথ আপনি অ্যাপ্লিকেশন লোডারকে ডিফল্টরূপে সরবরাহিত শেয়ার্ড অবজেক্টটি লোড করতে বাধ্য করতে পারেন।

বিকাশকারীরা ভাগ করে নেওয়া অবজেক্টগুলির বিভিন্ন সংস্করণ সরবরাহ করে তাদের অ্যাপ্লিকেশনগুলি ডিবাগ করতে এটি ব্যবহার করে।

আমরা এটি প্রস্তুত অ্যাপ্লিকেশনগুলি ব্যবহার করে বিদ্যমান ফাংশনগুলিকে ওভাররাইড করে নির্দিষ্ট অ্যাপ্লিকেশন হ্যাক করতে ব্যবহার করেছি।

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