disassemble/rs
সোর্স এবং কাঁচা বাইটগুলিও দেখানোর জন্য জিডিবি
এই ফর্ম্যাটটি সহ, এটি সত্যিই কাছাকাছি হয় objdump -S
আউটপুটটির :
gdb -batch -ex "disassemble/rs $FUNCTION" "$EXECUTABLE"
main.c
#include <assert.h>
int myfunc(int i) {
i = i + 2;
i = i * 2;
return i;
}
int main(void) {
assert(myfunc(1) == 6);
assert(myfunc(2) == 8);
return 0;
}
সংকলন এবং বিচ্ছিন্ন করা
gcc -O0 -ggdb3 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
gdb -batch -ex "disassemble/rs myfunc" main.out
বিযুক্তি:
Dump of assembler code for function myfunc:
main.c:
3 int myfunc(int i) {
0x0000000000001135 <+0>: 55 push %rbp
0x0000000000001136 <+1>: 48 89 e5 mov %rsp,%rbp
0x0000000000001139 <+4>: 89 7d fc mov %edi,-0x4(%rbp)
4 i = i + 2;
0x000000000000113c <+7>: 83 45 fc 02 addl $0x2,-0x4(%rbp)
5 i = i * 2;
0x0000000000001140 <+11>: d1 65 fc shll -0x4(%rbp)
6 return i;
0x0000000000001143 <+14>: 8b 45 fc mov -0x4(%rbp),%eax
7 }
0x0000000000001146 <+17>: 5d pop %rbp
0x0000000000001147 <+18>: c3 retq
End of assembler dump.
উবুন্টু 16.04, জিডিবি 7.11.1 এ পরীক্ষিত।
জেজডাম্প + অ্যাজক ওয়ার্কআরাউন্ডস
উল্লিখিত হিসাবে অনুচ্ছেদটি মুদ্রণ করুন: /unix/82944/how-to-grep-for-text-in-a-file-and-display-the-paragraph-that-has-the টেক্সট
objdump -d main.out | awk -v RS= '/^[[:xdigit:]]+ <FUNCTION>/'
যেমন:
objdump -d main.out | awk -v RS= '/^[[:xdigit:]]+ <myfunc>/'
শুধু দেয়:
0000000000001135 <myfunc>:
1135: 55 push %rbp
1136: 48 89 e5 mov %rsp,%rbp
1139: 89 7d fc mov %edi,-0x4(%rbp)
113c: 83 45 fc 02 addl $0x2,-0x4(%rbp)
1140: d1 65 fc shll -0x4(%rbp)
1143: 8b 45 fc mov -0x4(%rbp),%eax
1146: 5d pop %rbp
1147: c3 retq
ব্যবহার করার সময় -S
, আমি মনে করি না যে কোনও ব্যর্থ-প্রমাণের উপায় আছে, কারণ কোড মন্তব্যে কোনও সম্ভাব্য ক্রম থাকতে পারে ... তবে নিম্নলিখিতগুলি প্রায় সব সময় কাজ করে:
objdump -S main.out | awk '/^[[:xdigit:]]+ <FUNCTION>:$/{flag=1;next}/^[[:xdigit:]]+ <.*>:$/{flag=0}flag'
থেকে অভিযোজিত: কীভাবে দুটি মার্কার নিদর্শনগুলির মধ্যে লাইনগুলি নির্বাচন করতে হয় যা একাধিকবার ডাব্লু / এসডের সাথে ঘটতে পারে
মেইলিং তালিকা উত্তর
মেলিং তালিকায় একটি 2010 থ্রেড রয়েছে যা বলে যে এটি সম্ভব নয়: https://sourceware.org/ML/binutils/2010-04/msg00445.html
gdb
টম দ্বারা প্রস্তাবিত কর্মক্ষেত্রের পাশাপাশি , তারা আরও একটি (আরও খারাপ) সংকলনের কর্মপরিকল্পনা সম্পর্কে মন্তব্য করেছে-ffunction-section
কর্মক্ষেত্রের যার প্রতি বিভাগে একটি ফাংশন রাখে এবং পরে বিভাগটি ফেলে দেওয়া হয়।
নিকোলাস ক্লিফটন এটিকে একটি ডাব্লুওএনটিএফআইএক্স https://sourceware.org/ML/binutils/2015-07/msg00004.html দিয়েছে , সম্ভবত কারণ জিডিবি ওয়ার্কআরউন্ড সেই ক্ষেত্রে ব্যবহার করে।
static
এটি তার কল সাইটগুলিতে সংকলক দ্বারা ইনলাইন করা হতে পারে। এর অর্থ হ'ল প্রকৃতপক্ষে পৃথকীকরণের কোনও কার্যকারিতা নেই । আপনি যদি অন্য ফাংশনগুলির জন্য চিহ্নগুলি সন্ধান করতে পারেন তবে আপনি যে ফাংশনটি সন্ধান করছেন তা নয়, এটি একটি শক্ত ইঙ্গিত যা ফাংশনটি অন্তর্ভুক্ত করা হয়েছে। Valgrind এখনও মূল প্রাক-ইনলাইনড ফাংশনটি উল্লেখ করতে পারে কারণ নির্দেশাবলী অন্য কোথাও সরিয়ে নেওয়া সত্ত্বেও ELF ফাইল ডিবাগিং তথ্য স্টোর যেখানে প্রতিটি স্বতন্ত্র নির্দেশের সূত্রপাত হয়েছিল।