gdb एक एल्फ फाइल से फ़ंक्शन प्रोटोटाइप कैसे निकालें?



elf objdump (1)

मैं इस प्रश्न पर उत्तर पाने में सफल नहीं रहा हूं।

जीडीबी का उपयोग कर, मैं एक समारोह के प्रोटोटाइप को प्राप्त करने के लिए "कॉल" कमांड का उपयोग कर सकता हूं। उदाहरण:

(gdb) call fn
$1 = {void (int, int)} 0x8048414 <fn>

इसलिए, जीडीबी केवल एल्फ फाइल से ही पता लगा सकता है, कि एफएन () रिटर्न शून्य और तर्क के रूप में दो पूर्णांक लेता है।

हालांकि, मुझे एक एल्फ फाइल से फंक्शन प्रोटोटाइप निकालने के लिए कुछ अन्य टूल का उपयोग करने की आवश्यकता है I अधिमानतः, मैं objdump / readelf का उपयोग करना चाहता हूं।

यदि संभव है तो किस प्रकार, क्या कोई जानता है? यदि यह संभव नहीं है, तो जीडीबी यह कैसे करता है? योगिनी फाइल में कौन से भाग में फ़ंक्शन प्रोटोटाइप संग्रहीत है?


जीडीबी डीडब्ल्यूएआरएफ़ डीबगिनो के माध्यम से किसी फ़ंक्शन के हस्ताक्षर को जानता है। readelf -w ELF उस डंप करेंगे शायद आप माइकल जे इगार द्वारा डीडब्ल्यूएआरएफ़ डीबगिंग प्रारूप का परिचय पढ़ना चाहते हैं। पिएल्फ़टोल्स का उपयोग करके आप एक इंटरैक्टिव पायथन सत्र से पता लगा सकते हैं और DWARF के साथ प्रयोग कर सकते हैं।

फ़ंक्शन प्रोटोटाइप निकालने के लिए, आप subprogram डीबग जानकारी प्रविष्टियां चाहते हैं। DWARF प्रारूप ट्यूटोरियल में एक उदाहरण है:

strndup.c

 1: #include "ansidecl.h"
 2: #include <stddef.h>
 3:
 4: extern size_t strlen (const char*);
 5: extern PTR malloc (size_t);
 6: extern PTR memcpy (PTR, const PTR, size_t);
 7:
 8: char *
 9: strndup (const char *s, size_t n)
10: {
11: char *result;
12: size_t len = strlen (s);
13:
14: if (n < len)
15: len = n;
16:
17: result = (char *) malloc (len + 1);
18: if (!result)
19: return 0;
20:
21: result[len] = '\0';
22: return (char *) memcpy (result, s, len);
23: }

स्ट्रैंडअप.c के लिए DWARF विवरण

<1>: DW_TAG_base_type
   DW_AT_name = int
   DW_AT_byte_size = 4
   DW_AT_encoding = signed
<2>: DW_TAG_typedef
   DW_AT_name = size_t
   DW_AT_type = <3>
<3>: DW_TAG_base_type
   DW_AT_name = unsigned int
   DW_AT_byte_size = 4
   DW_AT_encoding = unsigned
<4>: DW_TAG_base_type
   DW_AT_name = long int
   DW_AT_byte_size = 4
   DW_AT_encoding = signed
<5>: DW_TAG_subprogram
   DW_AT_sibling = <10>
   DW_AT_external = 1
   DW_AT_name = strndup
   DW_AT_prototyped = 1
   DW_AT_type = <10>
   DW_AT_low_pc = 0
   DW_AT_high_pc = 0x7b
<6>: DW_TAG_formal_parameter
   DW_AT_name = s
   DW_AT_type = <12>
   DW_AT_location =
   (DW_OP_fbreg: 0)
<7>: DW_TAG_formal_parameter
   DW_AT_name = n
   DW_AT_type = <2>
   DW_AT_location =
   (DW_OP_fbreg: 4)
<8>: DW_TAG_variable
   DW_AT_name = result
   DW_AT_type = <10>
   DW_AT_location =
   (DW_OP_fbreg: -28)
<9>: DW_TAG_variable
   DW_AT_name = len
   DW_AT_type = <2>
   DW_AT_location =
   (DW_OP_fbreg: -24)
<10>: DW_TAG_pointer_type
   DW_AT_byte_size = 4
   DW_AT_type = <11>
<11>: DW_TAG_base_type
   DW_AT_name = char
   DW_AT_byte_size = 1
   DW_AT_encoding =
   signed char
<12>: DW_TAG_pointer_type
   DW_AT_byte_size = 4
   DW_AT_type = <13>
<13>: DW_TAG_const_type
   DW_AT_type = <11>

अधिक पूर्ण नमूना कार्यान्वयन के लिए, Petr Machata द्वारा इस सी प्रतिबिंब पुस्तकालय पर एक नज़र डालें। आपके पास निम्न चेतावनी के साथ क्या करना है, यह कोड है:

  • रिफ्लेक्शन आउट-ऑफ-प्रोसेस के बजाय जीडीबी जैसे की प्रक्रिया में चलता है
  • यह libdwfl से libdw और libdwfl पर निर्भर करता है। सुनिश्चित नहीं हैं कि आप उन बाह्य पुस्तकालय निर्भरताओं को बढ़ने के बारे में कैसा महसूस करेंगे