2009-11-06 18 views
48

मैं लिनक्स ईएलएफ बाइनरी में असेंबली कोड देखने के लिए objdump का उपयोग कर रहा हूं।मैं लिनक्स पर ईएलएफ फ़ाइल के डेटा सेक्शन की सामग्री कैसे देख सकता हूं?

कभी-कभी rodata (केवल-पढ़ने वाले डेटा) अनुभाग में संग्रहीत एक कूद तालिका के माध्यम से अप्रत्यक्ष कूद है।

objdump या इस डेटा अनुभाग की सामग्री को दिखाने के लिए कोई अन्य उपकरण कैसे प्राप्त करें?

मैं प्रोग्राम निष्पादित कर सकता हूं और डीबगर में प्रासंगिक पते की जांच कर सकता हूं, लेकिन मैं ऐसा नहीं करना चाहता क्योंकि इसे अंतःक्रियात्मक रूप से किया जाना है।

आदर्श उत्तर एक उपकरण की पहचान करेगा जो न केवल मुझे सामग्री दिखाएगा बल्कि मुझे प्रदर्शन प्रारूप को नियंत्रित करने देगा, जितना od करता है।

उत्तर

67
objdump -s -j .rodata exefile 

rodata खंड की तरह की सामग्री का एक पक्ष-साथ हेक्स/प्रिंट योग्य ASCII डंप देता है:

Contents of section .rodata: 
0000 67452301 efcdab89 67452301 efcdab89 gE#.....gE#..... 
0010 64636261 68676665 64636261 68676665 dcbahgfedcbahgfe 

यह वहाँ में कुछ भी स्वरूपण नियंत्रित करने के लिए है की तरह नहीं दिखता है, लेकिन यह एक शुरुआत है। तुम हमेशा हेक्स undump और यह आयुध डिपो को खिलाने सकता है, मुझे लगता है :)

+2

शानदार! मैंने कोशिश की लेकिन मैंने खूनी डॉट को शामिल नहीं किया ... –

+3

ईएलएफ सेक्शन में बाइनरी प्रारूप में डेटा को कैसे हटाया जा सकता है? Objdump -s -j -binary

कुछ ऐसा होगा। – Bogatyr

+0

@ बोगेटिर: सीएफ। मेरा जवाब। – ysdx

13
readelf -x .rodata hello_world.o 

देता है:

Hex dump of section '.rodata': 
    0x00000000 48656c6c 6f20776f 726c6421 0a  Hello world!. 

आप readelf को प्राथमिकता देनी चाहिए जब objdump के बाद से संभव बस .symtab की तरह कुछ वर्गों प्रदर्शित नहीं करता है: Why does objdump not show .bss, .shstratab, .symtab and .strtab sections?

आप इन तकनीकों के साथ कच्चे बाइट को भी निकाल सकते हैं: How do you extract only the contents of an ELF section और जैसा कि by ysdx का उल्लेख किया गया है।

7

आप रॉ (नहीं hexdump एड) ELF अनुभाग के साथ प्राप्त कर सकते हैं:

# To a file: 
objcopy file /dev/null --dump-section .text=text.data 
# To stdout: 
objcopy file /dev/null --dump-section .text=/dev/stdout | cat 

यहाँ मैं आदेश में एक पाइप होने के लिए मजबूर करने के लिए stdout में | cat उपयोग कर रहा हूँ। /dev/stdout अप्रत्याशित रूप से काम कर सकता है अगर stdout एक फ़ाइल है। .text=- stdout पर नहीं भेजता है लेकिन - फ़ाइल पर भेजता है।

हालांकि objcopy and objdump have some deficiencies (क्योंकि वे बीएफडी पर आधारित हैं जो विभिन्न निष्पादन योग्य प्रारूपों को सारणीबद्ध करता है)।

अद्यतन: मैंने ऐसा करने के लिए tool लिखा है जो बीएफडी पर भरोसा नहीं करता है।

+0

'- डंप-सेक्शन' थोड़ा हालिया है। इसे यहां जोड़ा गया था: http://sourceware-org.1504.n7.nabble.com/Commit-objcopy- Add-dump-section-option-td256052.html यह '--only-section' से बेहतर क्यों है? –

+0

मुझे मेरे उत्तर में से एक से अधिक उद्देश्य-निर्मित टूल खोजने (और लिखने!) खोजने के लिए मुझसे एक वोट मिलता है। – hobbs

संबंधित मुद्दे