2009-04-30 5 views
8

में निष्पादन योग्य में ऑब्जेक्ट फ़ाइलें क्या ऑब्जेक्ट फ़ाइलों को खोजने का कोई तरीका है जिससे वर्तमान निष्पादन योग्य लिनक्स में उत्पन्न होता है (RHEL विशिष्ट होना)। मैं समझता हूं कि निर्यातित प्रतीकों को खोजने के लिए "एनएम" का उपयोग कर सकते हैं, निर्भर साझा ऑब्जेक्ट खोजने के लिए "ldd"।लिनक्स

लेकिन ऑब्जेक्ट (.o) फ़ाइलों का नाम खोजने के लिए मुझे आदेश नहीं मिला, जिसमें निष्पादन योग्य है। क्या यह संभव है?

उत्तर

6

यदि इसे डीबगिंग जानकारी हां से संकलित किया गया है। जानकारी खोजने के लिए जीडीबी (मैन जीडीबी) का प्रयोग करें।

यदि इसे डीबग जानकारी के बिना संकलित नहीं किया गया है। आप भाग्य से बाहर हैं।

1

अलावा nullptr करने के लिए, "साझा वस्तु", अन्य साझा पुस्तकालयों को संदर्भित करता है (लिंक किए गए) मूल वस्तुओं (जुड़ा हुआ नहीं)

1

तुम भी objdump रूप में लंबे समय के लिए निष्पादन योग्य के रूप में उपयोग कर सकते हैं (और वस्तुओं के साथ संकलित किया गया के लिए नहीं डिबगिंग जानकारी):

# gcc -g -c -o /tmp/some_object.o /tmp/some_object.c 
# gcc -g -o /tmp/file /tmp/file.c /tmp/some_object.o 
# objdump -g /tmp/file | awk 'BEGIN{out=0} /Directory Table/{out=1} /Line Number Statements/{out=0} {if(out){print $0}}' 
The Directory Table (offset 0x1b): 
    1  /tmp 

The File Name Table (offset 0x21): 
    Entry Dir  Time Size Name 
    1  1  0  0  file.c 

The Directory Table (offset 0x5a): 
    1  /tmp 

The File Name Table (offset 0x60): 
    Entry Dir  Time Size Name 
    1  1  0  0  some_object.c 

awk सिर्फ प्रासंगिक जानकारी निकालने के लिए प्रयोग किया जाता है (यदि आप उपयोग नहीं करते हैं, तो आप निष्पादन योग्य और वस्तुओं) में पूर्ण डिबग जानकारी मिल जाएगा।

4

ऑब्जेक्ट फ़ाइलों के मूल नाम DWARF डिबगिंग जानकारी में संग्रहीत नहीं हैं।

प्रत्येक ऑब्जेक्ट फ़ाइल में .debug_info अनुभाग में DW_TAG_compile_unit प्रविष्टि है। इस प्रविष्टि में "प्राथमिक स्रोत फ़ाइल का संदर्भ है जिसमें से संकलन इकाई व्युत्पन्न हुई", लेकिन ऑब्जेक्ट फ़ाइल का नाम नहीं है। The DWARF standard में उन गुणों की एक सूची शामिल है जिन्हें प्रत्येक संकलन इकाई (अनुभाग 3.1.1, पृष्ठ संख्या 44, पीडीएफ पृष्ठ 58) के लिए संग्रहीत किया जा सकता है।

आप जानकारी है कि निम्न आदेश के साथ संग्रहीत किया जाता है देख सकते हैं:

$ readelf --debug-dump=info --dwarf-depth=1 hw 

आउटपुट:

Contents of the .debug_info section: 
<some compilation units removed>  
    Compilation Unit @ offset 0x133: 
    Length:  0x8b (32-bit) 
    Version:  4 
    Abbrev Offset: 0x64 
    Pointer Size: 4 
<0><13e>: Abbrev Number: 1 (DW_TAG_compile_unit) 
    <13f> DW_AT_producer : (indirect string, offset: 0x131): GNU C11 5.3.0 -mtune=generic -march=pentiumpro -g 
    <143> DW_AT_language : 12  (ANSI C99) 
    <144> DW_AT_name  : (indirect string, offset: 0x163): hw.c 
    <148> DW_AT_comp_dir : (indirect string, offset: 0x168): /home/mikel/src/hw 
    <14c> DW_AT_low_pc  : 0x80483db 
    <150> DW_AT_high_pc  : 0x2e 
    <154> DW_AT_stmt_list : 0xea 
<1><158>: ... 
<some compilation units removed> 
1

एक वस्तु फ़ाइल लिंक करने के बाद एक निष्पादन करने के लिए अनुवाद। यदि लिंकिंग साझा की जाती है, तो आप इसे साझा पुस्तकालयों (ldd) के माध्यम से प्राप्त कर सकते हैं। हालांकि अगर लिंकिंग स्थिर है, तो डीबग जानकारी के माध्यम से एकमात्र तरीका है। आप आरएचईएल (या उस मामले के लिए फेडोरा) में debuginfo संकुल को संस्थापित कर सकते हैं।

यह आपको एक एल देना होगा: यहाँ निर्देश

और फिर का उपयोग gdb info sources का वर्णन यहां स्रोत फ़ाइलों का आईएसटी। लेकिन वास्तव में ऑब्जेक्ट फ़ाइलों को प्राप्त करने के लिए, आपको बिल्ड टूल्स (rpmbuild) में गहराई से देखना होगा।और तुम स्रोत RPM पैकेज की आवश्यकता होगी वास्तव में rpmbuild को चलाने के लिए, आपको यहां दिए गए निर्देशों का उपयोग कर प्राप्त कर सकते हैं जो:

अब आप पैकेज अपने आप का निर्माण कर सकते हैं, और काटना जो .o फ़ाइल हुई निष्पादन योग्य में।

मुझे उम्मीद है कि इससे मदद मिलती है।