আমার একটি ভাগ করা বস্তু রয়েছে (dll)। সমস্ত চিহ্নগুলি কী থেকে রফতানি করা হয় তা আমি কীভাবে খুঁজে পাব?
আমার একটি ভাগ করা বস্তু রয়েছে (dll)। সমস্ত চিহ্নগুলি কী থেকে রফতানি করা হয় তা আমি কীভাবে খুঁজে পাব?
উত্তর:
আপনার কি কোনও "শেয়ার্ড অবজেক্ট" (সাধারণত এআইএক্স-এ একটি শেয়ার্ড লাইব্রেরি), একটি ইউএনএক্স শেয়ার্ড লাইব্রেরি, বা উইন্ডোজ ডিএলএল আছে? এগুলি সমস্ত ভিন্ন জিনিস, এবং আপনার প্রশ্ন এগুলি সমস্তগুলিকে সংযুক্ত করে :-(
dump -Tv /path/to/foo.o
।readelf -Ws /path/to/libfoo.so
বা (আপনার যদি জিএনইউ এনএম থাকে) nm -D /path/to/libfoo.so
।dumpbin /EXPORTS foo.dll
।nm
ব্যতীত MacOSX এও কাজ করে -D
। অথবা brew install binutils
এবং এর মাধ্যমে জিএনইউ সংস্করণ ব্যবহার করুন gnm
। গনুহ জন্য nm
, --demangle
এছাড়াও দরকারী। এছাড়াও gobjdump
।
linux
হয়েছে বলে আমি মনে করি এটি নিরাপদ বলে @ চ্যাপার একটি লিনাক্স শেয়ার করা লাইব্রেরি আছে।
যদি এটি একটি উইন্ডোজ ডিএলএল ফাইল এবং আপনার ওএস লিনাক্স হয় তবে উইনডাম্প ব্যবহার করুন :
$ winedump -j export pcre.dll
Contents of pcre.dll: 229888 bytes
Exports table:
Name: pcre.dll
Characteristics: 00000000
TimeDateStamp: 53BBA519 Tue Jul 8 10:00:25 2014
Version: 0.00
Ordinal base: 1
# of functions: 31
# of Names: 31
Addresses of functions: 000375C8
Addresses of name ordinals: 000376C0
Addresses of names: 00037644
Entry Pt Ordn Name
0001FDA0 1 pcre_assign_jit_stack
000380B8 2 pcre_callout
00009030 3 pcre_compile
...
* নিক্স চেক এনএম এ। উইন্ডোতে প্রোগ্রাম নির্ভরতা ওয়াকার ব্যবহার করুন
nm --defined-only -g something.so
গ্রন্থাগারে এবং বাহ্যিক চিহ্নগুলিতে সংজ্ঞায়িত চিহ্নগুলি মুদ্রণ করবে, যা সম্ভবত ওপি চায়।
ব্যবহার করুন: nm --demangle <libname>.so
nm: /usr/lib/i386-linux-gnu/libtemplates_parser.so.11.6: no symbols
। readelf
বা -D
পতাকা কাজ করে।
ক্রস প্ল্যাটফর্মের উপায় (কেবল ক্রস প্ল্যাটফর্ম নিজেই নয়, কাজ করে খুব কমপক্ষে, উভয় *.so
এবং *.dll
) বিপরীত ইঞ্জিনিয়ারিং ফ্রেমওয়ার্ক রাডার 2 ব্যবহার করছে । উদাহরণ:
$ rabin2 -s glew32.dll | head -n 5
[Symbols]
vaddr=0x62afda8d paddr=0x0005ba8d ord=000 fwd=NONE sz=0 bind=GLOBAL type=FUNC name=glew32.dll___GLEW_3DFX_multisample
vaddr=0x62afda8e paddr=0x0005ba8e ord=001 fwd=NONE sz=0 bind=GLOBAL type=FUNC name=glew32.dll___GLEW_3DFX_tbuffer
vaddr=0x62afda8f paddr=0x0005ba8f ord=002 fwd=NONE sz=0 bind=GLOBAL type=FUNC name=glew32.dll___GLEW_3DFX_texture_compression_FXT1
vaddr=0x62afdab8 paddr=0x0005bab8 ord=003 fwd=NONE sz=0 bind=GLOBAL type=FUNC name=glew32.dll___GLEW_AMD_blend_minmax_factor
বোনাস হিসাবে, rabin2
সি ++ নাম ম্যাঙ্গলিং সনাক্ত করে, উদাহরণস্বরূপ (এবং .so
ফাইলের সাথেও ) :
$ rabin2 -s /usr/lib/libabw-0.1.so.1.0.1 | head -n 5
[Symbols]
vaddr=0x00027590 paddr=0x00027590 ord=124 fwd=NONE sz=430 bind=GLOBAL type=FUNC name=libabw::AbiDocument::isFileFormatSupported
vaddr=0x0000a730 paddr=0x0000a730 ord=125 fwd=NONE sz=58 bind=UNKNOWN type=FUNC name=boost::exception::~exception
vaddr=0x00232680 paddr=0x00032680 ord=126 fwd=NONE sz=16 bind=UNKNOWN type=OBJECT name=typeinfoforboost::exception_detail::clone_base
vaddr=0x00027740 paddr=0x00027740 ord=127 fwd=NONE sz=235 bind=GLOBAL type=FUNC name=libabw::AbiDocument::parse
অবজেক্ট ফাইলগুলির সাথেও কাজ করে:
$ g++ test.cpp -c -o a.o
$ rabin2 -s a.o | head -n 5
Warning: Cannot initialize program headers
Warning: Cannot initialize dynamic strings
Warning: Cannot initialize dynamic section
[Symbols]
vaddr=0x08000149 paddr=0x00000149 ord=006 fwd=NONE sz=1 bind=LOCAL type=OBJECT name=std::piecewise_construct
vaddr=0x08000149 paddr=0x00000149 ord=007 fwd=NONE sz=1 bind=LOCAL type=OBJECT name=std::__ioinit
vaddr=0x080000eb paddr=0x000000eb ord=017 fwd=NONE sz=73 bind=LOCAL type=FUNC name=__static_initialization_and_destruction_0
vaddr=0x08000134 paddr=0x00000134 ord=018 fwd=NONE sz=21 bind=LOCAL type=FUNC name=_GLOBAL__sub_I__Z4funcP6Animal
সাধারণত, চিহ্নগুলির অ্যাক্সেসের জন্য আপনার একটি শিরোনাম ফাইলও থাকে যা আপনি আপনার কোডে অন্তর্ভুক্ত করেন।