কীভাবে ld (লিঙ্কার) অনুসন্ধানের পথ মুদ্রণ করবেন


153

অনুসন্ধানের পাথগুলি কীভাবে প্রিন্ট করার উপায় যা এটি অনুসন্ধান করে ক্রমে ld দ্বারা দেখে ।

উত্তর:


95

আপনি নিম্নলিখিত কমান্ডটি প্রয়োগ করে এটি করতে পারেন:

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 ব্যবহার করার পরামর্শ দেওয়া উত্তরগুলি সঠিক নয় কারণ তারা রানটাইম ডায়নামিক লিঙ্কারের দ্বারা অনুসন্ধান করা পাথগুলি বোঝায় (যেমন যখনই কোনও প্রোগ্রাম কার্যকর করা হয়), যা এলডি দ্বারা অনুসন্ধান করা পথের মতো নয় (যেমন যখনই একটি প্রোগ্রাম লিঙ্কযুক্ত)।


2
আপনি স্পট আঘাত। আমার একটি লিঙ্কিংয়ের সমস্যা রয়েছে, লিঙ্কিংয়ের প্রক্রিয়া চলাকালীন লিঙ্কার ম্যানুয়ালি ইনস্টল করা লাইব্রেরিগুলি খুঁজে পায় /usr/local/..যার মধ্যে গ্রন্থাগারের ত্রুটি হারিয়ে যায় এবং লিঙ্কিং ব্যর্থ হয়। /usr/localসেই অনুসন্ধানের পথটি বাদ দিতে আমাকে প্রতিবার নাম পরিবর্তন করতে হবে। /usr/localপাথ বাদ দেওয়া বা ওভাররাইড করার কোনও সহজ উপায় আছে ?
কেনে

1
আপনি জিসিসির -L বিকল্পের সাহায্যে গ্রন্থাগারের পাথগুলি ম্যানুয়ালি নির্দিষ্ট করার চেষ্টা করতে পারেন, যা আমি মনে করি (নিশ্চিত নয়) সিস্টেম লাইব্রেরি পাথগুলি ওভাররাইড করবে। আপনি সংকলনের আগে LIBRARY_PATH এনভ ভেরিয়েবলটি সেট করার চেষ্টা করতে পারেন: I লাইব্রেরিপ্যাথ = / সামিডির / জিসিসি ...

1
আমি জানি যে কমান্ড লাইনের সংকলনটিতে লিঙ্কিং। আমি ldঅনুসন্ধানের পথটিকে ওভাররাইড করার একটি বিশ্বব্যাপী উপায় বলতে চাইছিলাম । উদাহরণস্বরূপ কখনও কখনও আমাকে স্ক্রিপ্ট বা makefileমেকফাইল configureথেকে CMakeLists.txtবা আরও জটিল যেমন valaবা এর থেকে উত্স কোড তৈরি করতে হয় বা তৈরি করতে হয় srt। এটা আমার পরিবর্তন করতে কঠিন ldএই ক্ষেত্রে সন্ধানের পাথ
Kenn

সিএমকে ব্যবহার করার সময় আপনি সঠিক লাইব্রেরি নির্বাচন করতে পারেন যা কনফিগারেশন পর্বের সময় ব্যবহৃত হয় (এর মধ্যে কয়েকটি প্রবেশ কেবলমাত্র উন্নত মোডে প্রদর্শিত হয়)। অটোটুলগুলি থেকে স্ক্রিপ্টগুলি কনফিগার করার জন্য, এই উত্তরটি দেখুন: স্ট্যাকওভারফ্লো / প্রশ্ন / 7561509/… । এটি সরাসরি আপনার প্রশ্নের উত্তর দেয় না, তবে আপনি যা চান তা করতে আপনাকে সহায়তা করতে পারে।
জাল হয়েছে

81

লিনাক্স, আপনি ব্যবহার করতে পারেন 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


51
তিনি লিডার (এলডি) সম্পর্কে জিজ্ঞাসা করছেন, লোডার নয় (এলডি.সো)!
Fons

3
কীভাবে সম্ভব যে যদি আমি সেট করি তবে export LD_LIBRARY_PATH=/some/other/dirএটি এই কমান্ডের আউটপুটকে প্রভাবিত করবে না! মনে হচ্ছে এটি 100% কাজ করে না?
টিএমএস

3
@ ফনস মজার বিষয় হল আমি এখানে এই উত্তরটি খুঁজছি looking :) লিঙ্ক-টাইম নাকি রান-টাইম পাথ? আমার মনে হয় এটাই প্রশ্ন। LIBRAY_PATH (লিংক সময়) বনাম এলডি_লিবারি_প্যাথ।
ড্যানিয়েল সান্টোস

2
আমি কয়েকটি প্ল্যাটফর্মে (যেমন লিনারো সরঞ্জামচইনের সাথে বাহু) পেয়েছি যে ldconfig আসলে রান টাইম লিঙ্কারের মতো একই ডিরেক্টরি অনুসন্ধান করে না। আপনি করতে পারেন এটা আউটপুট তার সন্ধানের পাথ পেতে, এবং থেকে পাথ অন্তর্ভুক্ত LD_LIBRARY_PATHডিবাগিং সক্ষম করে। উদাহরণস্বরূপ LD_DEBUG=libs /lib/ld-linux.so --list cat(আপনি যে কোনও নির্বাহযোগ্য ব্যবহার করতে পারেন, আমি catপ্রথমে যা ভাবতে পারি তা বেছে নিয়েছি)। " search path" এর জন্য গ্রেপিংয়ের মূল্য হতে পারে । মনে রাখবেন যে আপনার যদি /etc/ld.so.cacheসমস্ত প্রয়োজনীয় libs এর সাথে মেলে, তবে আপনি বিল্ট-ইন সিস্টেম অনুসন্ধানের পথটি দেখতে পাবেন না, কারণ এটি এখন পর্যন্ত পাবে না।
জন ও'ম।

gccএগুলির সাথে কি অনুসন্ধানের পথটি একই?
nn0p

67

আমি নিশ্চিত না যে কেবলমাত্র কার্যকর কার্যকর অনুসন্ধানের পথ মুদ্রণের জন্য কোনও বিকল্প আছে।

তবে: অনুসন্ধানের পথে -Lকমান্ড লাইনের বিকল্পগুলির দ্বারা নির্ধারিত ডিরেক্টরিগুলি থাকে এবং তারপরে SEARCH_DIR("...")লিংক স্ক্রিপ্টের নির্দেশাবলী দ্বারা অনুসন্ধানের পথে যুক্ত ডিরেক্টরিগুলি থাকে । সুতরাং আপনি যদি সেগুলি উভয়ই দেখতে পান তবে এটি কার্যকর করতে পারেন, যা আপনি নীচে হিসাবে করতে পারেন:

আপনি যদি ldসরাসরি অনুরোধ করছেন :

  • -Lবিকল্প যাই হোক না কেন বলেন করেছি তারা আছে।
  • লিঙ্কার স্ক্রিপ্টটি দেখতে --verboseবিকল্পটি যুক্ত করুন । দেখুন SEARCH_DIR("...")নির্দেশনা সাধারণত আউটপুট উপরের অংশে। (মনে রাখবেন যে প্রতিটি অনুরোধের জন্য এগুলি অগত্যা একইরকম নয় ld- লিঙ্কারের বিভিন্ন বিল্ট-ইন ডিফল্ট লিঙ্কার স্ক্রিপ্ট রয়েছে এবং অন্যান্য লিঙ্কার বিকল্পগুলির উপর ভিত্তি করে এগুলির মধ্যে চয়ন করে))

আপনি যদি এর মাধ্যমে সংযোগ দিচ্ছেন gcc:

  • আপনি -vবিকল্পটি পাস করতে gccপারেন যাতে এটি আপনাকে লিঙ্কারে কীভাবে আবেদন করে তা আপনাকে দেখায়। প্রকৃতপক্ষে, এটি সাধারণত ldসরাসরি ডাকে না, তবে পরোক্ষভাবে একটি সরঞ্জাম collect2(যা তার অভ্যন্তরীণ ডিরেক্টরিগুলির মধ্যে একটিতে থাকে) এর মাধ্যমে আক্রমনাত্মকভাবে অনুরোধ করে ld। এটি আপনাকে কী -Lবিকল্পগুলি ব্যবহার করা হচ্ছে তা দেখাবে ।
  • আপনি যোগ করতে পারেন -Wl,--verboseথেকে gccএটা পাস করতে অপশন --verbose, linker মাধ্যমে উপরে বর্ণিত linker স্ক্রিপ্ট দেখতে।

5
লিঙ্কারের জন্য --verbose বিকল্পটি কৌশলটি করেছিল। খুব উপকারী!
এরি

লিঙ্কারটি কোথায় খুঁজছেন তা খুঁজে বের করার জন্য আমি প্রচুর চেষ্টা করছিলাম এবং আউটপুটটিতে SEARCH_DIR পাইনি। আমি -T scriptআমার স্ক্রিপ্টটি সম্পূর্ণরূপে ld এর ডিফল্ট স্ক্রিপ্টটি প্রতিস্থাপন করেছি এবং কেবল যেখানে আমি নির্দেশ করেছি সেখানেই সন্ধান করলাম।
থোমাস88৮

29

লিনাক্সে জিসিসি এবং ঝাঁকুনির জন্য আমি সর্বাধিক সামঞ্জস্যপূর্ণ কমান্ডটি পেয়েছি (আর্ম্যান্ডো.সানোকে ধন্যবাদ):

$ 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

ধন্যবাদ! কিশোরী বর্ধন - একটি গ্রেপ বা দুটি থেকে পরিত্রাণ পান: সেড-এন 'গুলি / অনুসন্ধান_ডির ("= \? ([^"] \ +) ")); * / \ 1 \ n / জিপি'
ব্রুস কে

2
এটি কেন এই ধরণের অস্পষ্ট পদ্ধতি প্রয়োজন?
বমাকনফটন

এটা চমত্কার ভাবে কাজ করেছে ! লিঙ্কার অনুসন্ধানের পথে আমরা কীভাবে এই তালিকার ডিরেক্টরিগুলি যুক্ত করব?
পরী

6

প্রশ্নটি লিনাক্স ট্যাগ করা, তবে এটি লিনাক্সের অধীনেও কাজ করে?

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। সুতরাং @ রাফাল লন্ডেক্সের উত্তরটি আরও ভাল।
পেভিক

2

ম্যাক সংস্করণ: d ld -v 2, কীভাবে বিশদ পথ পাবে তা জানেন না। আউটপুট

Library search paths:
    /usr/lib
    /usr/local/lib
Framework search paths:
    /Library/Frameworks/
    /System/Library/Frameworks/

3
আমি "2 খুলতে পারি না: এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই"। চলমানld -v 2
জ্যাক

2
প্রশ্নটি ওএস এক্স নয়, লিনাক্স ট্যাগ করেছে I আমি বিশ্বাস করি না যে ওএস এক্স জিএনইউ ব্যবহার করে ld। বিন্টিল লোকেরা এটি বিল্ড স্ক্রিপ্টগুলিতে অক্ষম করে। এটি বছরের পর বছর ধরে অক্ষম।
jww
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.