.So ফাইল থেকে রফতানি করা প্রতীকগুলি কীভাবে আমি তালিকা করব? যদি সম্ভব হয় তবে আমি তাদের উত্সটিও জানতে চাই (উদাহরণস্বরূপ যদি তারা একটি স্ট্যাটিক লাইব্রেরি থেকে টানা হয়)।
আমি জিসিসি ৩.০.২ ব্যবহার করছি, যদি এটি কোনও পার্থক্য করে।
nm, জিএনইউ নয় nm।
.So ফাইল থেকে রফতানি করা প্রতীকগুলি কীভাবে আমি তালিকা করব? যদি সম্ভব হয় তবে আমি তাদের উত্সটিও জানতে চাই (উদাহরণস্বরূপ যদি তারা একটি স্ট্যাটিক লাইব্রেরি থেকে টানা হয়)।
আমি জিসিসি ৩.০.২ ব্যবহার করছি, যদি এটি কোনও পার্থক্য করে।
nm, জিএনইউ নয় nm।
উত্তর:
প্রতীক তালিকার জন্য আদর্শ সরঞ্জামটি হ'ল nm, আপনি এটিকে সহজভাবে ব্যবহার করতে পারেন:
nm -gD yourLib.so
আপনি যদি কোনও সি ++ লাইব্রেরির প্রতীক দেখতে চান তবে "-C" বিকল্পটি যুক্ত করুন যা প্রতীকগুলি ডিমেংল করে (এটি আরও বেশি পঠনযোগ্য ডিমেংলড)।
nm -gDC yourLib.so
যদি আপনার .so ফাইলটি এলফ ফর্ম্যাটে থাকে তবে আপনার কাছে দুটি বিকল্প রয়েছে:
হয় objdump( -Cসি ++ ডিমেংলিংয়ের জন্যও কার্যকর):
$ objdump -TC libz.so
libz.so: file format elf64-x86-64
DYNAMIC SYMBOL TABLE:
0000000000002010 l d .init 0000000000000000 .init
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 free
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __errno_location
0000000000000000 w D *UND* 0000000000000000 _ITM_deregisterTMCloneTable
বা ব্যবহার করুন readelf:
$ readelf -Ws libz.so
Symbol table '.dynsym' contains 112 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000002010 0 SECTION LOCAL DEFAULT 10
2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND free@GLIBC_2.2.5 (14)
3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __errno_location@GLIBC_2.2.5 (14)
4: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTable
readelf -Wsআপনাকে সমস্ত চিহ্ন nm -gদেখায় এবং কেবল বাহ্যিকভাবে দৃশ্যমান প্রতীকগুলি দেখায়। আপনি যদি একাধিক প্রতীক ফাইলগুলি পরীক্ষা করে দেখেন এবং আপনার আদেশগুলি অন্তর্ভুক্ত করেন তবে এটি বিভ্রান্তিকর হতে পারে।
objectdump -TCতালিকায় যুক্ত করব। বিপরীতে readelf -Ws, এটি ম্যাঙ্গেল করা নামগুলি দেখায় না।
.soফাইলগুলির জন্য --dynamicআপনার nmকমান্ড লাইনে যুক্ত হতে পারে ।
যদি আপনার .soফাইলটি এলফ ফর্ম্যাটে থাকে তবে আপনি বাইনারি থেকে প্রতীক তথ্যগুলি বের করতে রিডফল প্রোগ্রাম ব্যবহার করতে পারেন। এই আদেশ আপনাকে প্রতীক টেবিল দেবে:
readelf -Ws /usr/lib/libexample.so
আপনার কেবল এইগুলি .soফাইলে সংজ্ঞায়িত লাইব্রেরিগুলিতে নয়, এগুলি নির্ধারণ করা উচিত । সপ্তম কলামে এই ক্ষেত্রে একটি সংখ্যা থাকা উচিত। আপনি একটি সাধারণ রেজেেক্স ব্যবহার করে এটি নিষ্কাশন করতে পারেন:
readelf -Ws /usr/lib/libstdc++.so.6 | grep '^\([[:space:]]\+[^[:space:]]\+\)\{6\}[[:space:]]\+[[:digit:]]\+'
বা, ক্যাস্পিনের প্রস্তাবিত হিসাবে :
readelf -Ws /usr/lib/libstdc++.so.6 | awk '{print $8}';
objdump -TC /usr/lib/libexample.so
আমি হতাশ রাখা কেন -fvisibility = গোপন এবং #pragma জিসিসি দৃশ্যমানতা কোন প্রভাব আছে বলে মনে হচ্ছে না হিসাবে সব চিহ্ন সবসময় কিভাবে আছে কি NM - যতক্ষণ না আমি এই পোস্টে যে আমার প্রতি ইঙ্গিত পাওয়া readelf এবং objdump , যা আমাকে তৈরি বুঝতে পারছি সেখানে আসলে দুটি প্রতীক টেবিল বলে মনে হচ্ছে :
আমি মনে করি পূর্ববর্তীটিতে ডিবাগিং প্রতীক রয়েছে যা আপনি লিঙ্কার বা ইনস্টল কমান্ডকে দিতে পারেন এমন স্ট্রিপ বা -s সুইচ দিয়ে ফেলা যেতে পারে । এমনকি এনএম যদি আর কোনও তালিকা না দেয় তবে আপনার রফতানি প্রতীকগুলি এখনও রফতানি করা হয় কারণ সেগুলি ইএলএফ "গতিশীল প্রতীক টেবিল" এ রয়েছে যা পরেরটি।
সি ++ .soফাইলের জন্য, চূড়ান্তnm কমান্ডnm --demangle --dynamic --defined-only --extern-only <my.so>
# nm --demangle --dynamic --defined-only --extern-only /usr/lib64/libqpid-proton-cpp.so | grep work | grep add
0000000000049500 T proton::work_queue::add(proton::internal::v03::work)
0000000000049580 T proton::work_queue::add(proton::void_function0&)
000000000002e7b0 W proton::work_queue::impl::add_void(proton::internal::v03::work)
000000000002b1f0 T proton::container::impl::add_work_queue()
000000000002dc50 T proton::container::impl::container_work_queue::add(proton::internal::v03::work)
000000000002db60 T proton::container::impl::connection_work_queue::add(proton::internal::v03::work)
প্রতিটি চিহ্নের উত্স পাওয়ার জন্য এনএম পতাকাগুলিতে -l যুক্ত করার চেষ্টা করুন। লাইব্রেরি যদি ডিবাগিং তথ্য (জিসিসি-জি) দিয়ে সংকলিত হয় তবে এটি উত্স ফাইল এবং লাইন নম্বর হওয়া উচিত। কনরাড যেমন বলেছিলেন, অবজেক্ট ফাইল / স্ট্যাটিক লাইব্রেরি সম্ভবত এই সময়ে অজানা।
আপনি nm -gবাইনুটিস সরঞ্জামচেন থেকে সরঞ্জামটি ব্যবহার করতে পারেন । তবে, তাদের উত্স সর্বদা সহজেই পাওয়া যায় না। এবং আমি আসলেও নিশ্চিত নই যে এই তথ্যটি সর্বদা পুনরুদ্ধার করা যায়। সম্ভবত objcopyআরও তথ্য প্রকাশ।
/ সম্পাদনা: সরঞ্জামটির নাম অবশ্যই nm। পতাকাটি -gকেবল রফতানি প্রতীক দেখানোর জন্য ব্যবহৃত হয়।
এনএম -g বাহ্যিক চলক তালিকাবদ্ধ করে, যা প্রয়োজনীয় রফতানি প্রতীক নয় necessary যে কোনও অ স্থিতিশীল ফাইল স্কোপ ভেরিয়েবল (সি তে) সমস্ত বাহ্যিক চলক।
এনএম-ডি গতিশীল টেবিলের মধ্যে প্রতীকটি তালিকাভুক্ত করবে, যা আপনি এটির ঠিকানাটি dlsym দ্বারা খুঁজে পেতে পারেন।
এনএম - রূপান্তর
জিএনইউ এনএম 2.17.50.0.6-12.el5 20061020
আপনি যদি কেবল জানতে চান যে উপস্থিত কোনও চিহ্ন রয়েছে তবে আপনি ব্যবহার করতে পারেন
objdump -h /path/to/object
বা ডিবাগ তথ্য তালিকাগুলি
objdump -g /path/to/object
nmকিছু বিকল্প যেমন,-Dএবং-g(আইআইআরসি) তে সাড়া দেয় না ।