disassemble/rs
स्रोत और कच्चे बाइट्स को दिखाने के लिए gdb
इस प्रारूप के साथ, यह वास्तव में 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
disassembly:
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, GDB 7.11.1 पर परीक्षण किया गया।
objdump + awk workarounds
अनुच्छेद का उल्लेख करें : /unix/82944/how-to-grep-for-text-in-a-file-and-display-the-paragraph-bhat-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'
से अनुकूलित: दो मार्कर पैटर्न के बीच लाइनों का चयन कैसे करें जो awk / sed के साथ कई बार हो सकता है
मेलिंग सूची जवाब
मेलिंग सूची पर 2010 का एक सूत्र है जो कहता है कि यह संभव नहीं है: https://sourceware.org/ml/binutils/2010-04/msg00445.html
gdb
टॉम द्वारा प्रस्तावित वर्कअराउंड के अलावा , वे संकलन के दूसरे (बदतर) वर्कअराउंड पर भी टिप्पणी करते हैं -ffunction-section
जिसके साथ प्रति अनुभाग एक फ़ंक्शन डालता है और फिर अनुभाग को डंप करता है।
निकोलस क्लिफ्टन ने इसे एक WONTFIX https://sourceware.org/ml/binutils/2015-07/msg00004.html दिया , संभावना है क्योंकि GDB वर्कअराउंड उस केस का उपयोग करता है।
static
, तो यह संकलक द्वारा अपनी कॉल साइटों में इनलाइन किया जा सकता है। इसका मतलब यह हो सकता है कि वास्तव में किसी भी कार्य को अलग करने के लिए कोई कार्य नहीं हो सकता है । यदि आप अन्य कार्यों के लिए प्रतीकों को देख सकते हैं, लेकिन जिस फ़ंक्शन की आप तलाश कर रहे हैं, यह एक मजबूत संकेत नहीं है कि फ़ंक्शन को इनलाइन किया गया है। Valgrind अभी भी मूल पूर्व-इनलाइन फ़ंक्शन को संदर्भित कर सकता है क्योंकि ELF फ़ाइल डिबगिंग सूचना भंडार है जहां से प्रत्येक व्यक्तिगत निर्देश उत्पन्न होता है, भले ही निर्देश कहीं और स्थानांतरित किए गए हों।