অনুসন্ধানের পাথগুলি কীভাবে প্রিন্ট করার উপায় যা এটি অনুসন্ধান করে ক্রমে ld দ্বারা দেখে ।
অনুসন্ধানের পাথগুলি কীভাবে প্রিন্ট করার উপায় যা এটি অনুসন্ধান করে ক্রমে ld দ্বারা দেখে ।
উত্তর:
আপনি নিম্নলিখিত কমান্ডটি প্রয়োগ করে এটি করতে পারেন:
ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012
জিসিসি লিঙ্কারে কিছু অতিরিক্ত -L পাথ পাস করেছে, যা আপনি নিম্নলিখিত কমান্ডের সাথে তালিকাবদ্ধ করতে পারেন:
gcc -print-search-dirs | sed '/^lib/b 1;d;:1;s,/[^/.][^/]*/\.\./,/,;t 1;s,:[^=]*=,:;,;s,;,; ,g' | tr \; \\012
Ld.so.conf এবং ldconfig ব্যবহার করার পরামর্শ দেওয়া উত্তরগুলি সঠিক নয় কারণ তারা রানটাইম ডায়নামিক লিঙ্কারের দ্বারা অনুসন্ধান করা পাথগুলি বোঝায় (যেমন যখনই কোনও প্রোগ্রাম কার্যকর করা হয়), যা এলডি দ্বারা অনুসন্ধান করা পথের মতো নয় (যেমন যখনই একটি প্রোগ্রাম লিঙ্কযুক্ত)।
ld
অনুসন্ধানের পথটিকে ওভাররাইড করার একটি বিশ্বব্যাপী উপায় বলতে চাইছিলাম । উদাহরণস্বরূপ কখনও কখনও আমাকে স্ক্রিপ্ট বা makefile
মেকফাইল configure
থেকে CMakeLists.txt
বা আরও জটিল যেমন vala
বা এর থেকে উত্স কোড তৈরি করতে হয় বা তৈরি করতে হয় srt
। এটা আমার পরিবর্তন করতে কঠিন ld
এই ক্ষেত্রে সন্ধানের পাথ
লিনাক্স, আপনি ব্যবহার করতে পারেন ldconfig
যা ld.so কনফিগারেশন এবং ক্যাশে বজায় রাখে, ডিরেক্টরি দ্বারা অনুসন্ধান প্রিন্ট আউট করতে ld.so
সঙ্গে
ldconfig -v 2>/dev/null | grep -v ^$'\t'
ldconfig -v
লিঙ্কারের সাহায্যে ডিরেক্টরিগুলি অনুসন্ধান করে (কোনও শীর্ষস্থানীয় ট্যাব ছাড়াই) এবং সেই ডিরেক্টরিগুলিতে (একটি শীর্ষস্থানীয় ট্যাব সহ) পাওয়া ভাগ করা লাইব্রেরিগুলি মুদ্রণ করে; grep
ডিরেক্টরি পায়। আমার মেশিনে, এই লাইনটি প্রিন্ট করে
/usr/lib64/atlas:
/usr/lib/llvm:
/usr/lib64/llvm:
/usr/lib64/mysql:
/usr/lib64/nvidia:
/usr/lib64/tracker-0.12:
/usr/lib/wine:
/usr/lib64/wine:
/usr/lib64/xulrunner-2:
/lib:
/lib64:
/usr/lib:
/usr/lib64:
/usr/lib64/nvidia/tls: (hwcap: 0x8000000000000000)
/lib/i686: (hwcap: 0x0008000000000000)
/lib64/tls: (hwcap: 0x8000000000000000)
/usr/lib/sse2: (hwcap: 0x0000000004000000)
/usr/lib64/tls: (hwcap: 0x8000000000000000)
/usr/lib64/sse2: (hwcap: 0x0000000004000000)
hwcap
লাইনটি ছাড়াই প্রথম পাথগুলি অন্তর্নির্মিত বা /etc/ld.so.conf থেকে পড়ে read লিঙ্কার তারপরে sse2
অতিরিক্ত সিপিইউ সামর্থ্যের সাথে মিল রেখে নাম সহ মৌলিক গ্রন্থাগার অনুসন্ধানের পথের অধীনে অতিরিক্ত ডিরেক্টরি অনুসন্ধান করতে পারে। এই পাথগুলিতে, hwcap
লাইনে থাকা, এই সিপিইউ সক্ষমতার জন্য উপযুক্ত অতিরিক্ত লাইব্রেরি থাকতে পারে।
একটি চূড়ান্ত নোট: উপরের -p
পরিবর্তে ব্যবহার করে পরিবর্তে ক্যাশে -v
অনুসন্ধান করে ld.so
।
export LD_LIBRARY_PATH=/some/other/dir
এটি এই কমান্ডের আউটপুটকে প্রভাবিত করবে না! মনে হচ্ছে এটি 100% কাজ করে না?
LD_LIBRARY_PATH
ডিবাগিং সক্ষম করে। উদাহরণস্বরূপ LD_DEBUG=libs /lib/ld-linux.so --list cat
(আপনি যে কোনও নির্বাহযোগ্য ব্যবহার করতে পারেন, আমি cat
প্রথমে যা ভাবতে পারি তা বেছে নিয়েছি)। " search path
" এর জন্য গ্রেপিংয়ের মূল্য হতে পারে । মনে রাখবেন যে আপনার যদি /etc/ld.so.cache
সমস্ত প্রয়োজনীয় libs এর সাথে মেলে, তবে আপনি বিল্ট-ইন সিস্টেম অনুসন্ধানের পথটি দেখতে পাবেন না, কারণ এটি এখন পর্যন্ত পাবে না।
gcc
এগুলির সাথে কি অনুসন্ধানের পথটি একই?
আমি নিশ্চিত না যে কেবলমাত্র কার্যকর কার্যকর অনুসন্ধানের পথ মুদ্রণের জন্য কোনও বিকল্প আছে।
তবে: অনুসন্ধানের পথে -L
কমান্ড লাইনের বিকল্পগুলির দ্বারা নির্ধারিত ডিরেক্টরিগুলি থাকে এবং তারপরে SEARCH_DIR("...")
লিংক স্ক্রিপ্টের নির্দেশাবলী দ্বারা অনুসন্ধানের পথে যুক্ত ডিরেক্টরিগুলি থাকে । সুতরাং আপনি যদি সেগুলি উভয়ই দেখতে পান তবে এটি কার্যকর করতে পারেন, যা আপনি নীচে হিসাবে করতে পারেন:
আপনি যদি ld
সরাসরি অনুরোধ করছেন :
-L
বিকল্প যাই হোক না কেন বলেন করেছি তারা আছে।--verbose
বিকল্পটি যুক্ত করুন । দেখুন SEARCH_DIR("...")
নির্দেশনা সাধারণত আউটপুট উপরের অংশে। (মনে রাখবেন যে প্রতিটি অনুরোধের জন্য এগুলি অগত্যা একইরকম নয় ld
- লিঙ্কারের বিভিন্ন বিল্ট-ইন ডিফল্ট লিঙ্কার স্ক্রিপ্ট রয়েছে এবং অন্যান্য লিঙ্কার বিকল্পগুলির উপর ভিত্তি করে এগুলির মধ্যে চয়ন করে))আপনি যদি এর মাধ্যমে সংযোগ দিচ্ছেন gcc
:
-v
বিকল্পটি পাস করতে gcc
পারেন যাতে এটি আপনাকে লিঙ্কারে কীভাবে আবেদন করে তা আপনাকে দেখায়। প্রকৃতপক্ষে, এটি সাধারণত ld
সরাসরি ডাকে না, তবে পরোক্ষভাবে একটি সরঞ্জাম collect2
(যা তার অভ্যন্তরীণ ডিরেক্টরিগুলির মধ্যে একটিতে থাকে) এর মাধ্যমে আক্রমনাত্মকভাবে অনুরোধ করে ld
। এটি আপনাকে কী -L
বিকল্পগুলি ব্যবহার করা হচ্ছে তা দেখাবে ।-Wl,--verbose
থেকে gcc
এটা পাস করতে অপশন --verbose
, linker মাধ্যমে উপরে বর্ণিত linker স্ক্রিপ্ট দেখতে।-T script
আমার স্ক্রিপ্টটি সম্পূর্ণরূপে ld এর ডিফল্ট স্ক্রিপ্টটি প্রতিস্থাপন করেছি এবং কেবল যেখানে আমি নির্দেশ করেছি সেখানেই সন্ধান করলাম।
লিনাক্সে জিসিসি এবং ঝাঁকুনির জন্য আমি সর্বাধিক সামঞ্জস্যপূর্ণ কমান্ডটি পেয়েছি (আর্ম্যান্ডো.সানোকে ধন্যবাদ):
$ gcc -m64 -Xlinker --verbose 2>/dev/null | grep SEARCH | sed 's/SEARCH_DIR("=\?\([^"]\+\)"); */\1\n/g' | grep -vE '^$'
যদি আপনি দেন -m32
, এটি সঠিক গ্রন্থাগার ডিরেক্টরিগুলি আউটপুট দেবে।
আমার মেশিনে উদাহরণ:
জন্য g++ -m64
:
/usr/x86_64-linux-gnu/lib64
/usr/i686-linux-gnu/lib64
/usr/local/lib/x86_64-linux-gnu
/usr/local/lib64
/lib/x86_64-linux-gnu
/lib64
/usr/lib/x86_64-linux-gnu
/usr/lib64
/usr/local/lib
/lib
/usr/lib
জন্য g++ -m32
:
/usr/i686-linux-gnu/lib32
/usr/local/lib32
/lib32
/usr/lib32
/usr/local/lib/i386-linux-gnu
/usr/local/lib
/lib/i386-linux-gnu
/lib
/usr/lib/i386-linux-gnu
/usr/lib
প্রশ্নটি লিনাক্স ট্যাগ করা, তবে এটি লিনাক্সের অধীনেও কাজ করে?
gcc -Xlinker -v
ম্যাক ওএস এক্স এর অধীনে, এই মুদ্রণ:
@(#)PROGRAM:ld PROJECT:ld64-224.1
configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 armv6m armv7m armv7em
Library search paths:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/lib
Framework search paths:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/
[...]
-Xlinker
বিকল্প gcc
শুধুমাত্র উপরের পাসের -v
জন্য ld
। যাহোক:
ld -v
অনুসন্ধানের পথটি মুদ্রণ করে না।
-Lpath
। সুতরাং @ রাফাল লন্ডেক্সের উত্তরটি আরও ভাল।
ম্যাক সংস্করণ: d ld -v 2, কীভাবে বিশদ পথ পাবে তা জানেন না। আউটপুট
Library search paths:
/usr/lib
/usr/local/lib
Framework search paths:
/Library/Frameworks/
/System/Library/Frameworks/
ld -v 2
ld
। বিন্টিল লোকেরা এটি বিল্ড স্ক্রিপ্টগুলিতে অক্ষম করে। এটি বছরের পর বছর ধরে অক্ষম।
/usr/local/..
যার মধ্যে গ্রন্থাগারের ত্রুটি হারিয়ে যায় এবং লিঙ্কিং ব্যর্থ হয়।/usr/local
সেই অনুসন্ধানের পথটি বাদ দিতে আমাকে প্রতিবার নাম পরিবর্তন করতে হবে।/usr/local
পাথ বাদ দেওয়া বা ওভাররাইড করার কোনও সহজ উপায় আছে ?