2013-04-12 6 views
17

पर प्रतीकों को वापस जोड़ें मेरे पास एक बाधित बाइनरी और प्रतीक फ़ाइल है। क्या प्रतीकों को बाइनरी में वापस जोड़ना और एक अप्रचलित बाइनरी बनाना संभव है।स्ट्रिप को पूर्ववत करने के लिए कैसे करें - यानी छीनने वाली बाइनरी

मेरा उपयोग-मामला इस बाइनरी डब्ल्यू/वालग्रींड का उपयोग कर रहा है।

+3

मैं recompile कहूंगा, किसी और चीज के बारे में नहीं सोच सकता :) – mata

उत्तर

4

वालग्रिंड separate debug files का समर्थन करता है, इसलिए आपको answer here का उपयोग करना चाहिए, और valgrind को बाहरी डीबग फ़ाइल के साथ ठीक से काम करना चाहिए।

+0

और नहीं: आप एक छीनने वाले (कम से कम आसानी से नहीं) से एक अप्रचलित बाइनरी नहीं बना सकते हैं। लेकिन आपको यह जवाब देने की आवश्यकता नहीं है, क्योंकि यह उत्तर सही ढंग से बताता है। –

+0

मुझे खेद है, लेकिन यह स्पष्ट नहीं है कि मैं इस डीबग फ़ाइल w/valgrind का उपयोग कैसे कर सकता हूं। किसी भी पॉइंटर्स की सराहना करेंगे। – cached

+0

"यहां जवाब" में दिए गए निर्देश काफी स्पष्ट हैं। आप अलग डीबगिनोफो बनाते हैं, और फिर वालग्रिंड और जीडीबी स्वचालित रूप से उन्हें लोड कर देंगे। –

12

उन उपकरणों के लिए जो डीबग जानकारी के लिए अलग-अलग फ़ाइलों का समर्थन नहीं करते हैं, आप डीबग अनुभाग को मूल बाइनरी पर वापस कर सकते हैं।

आप इन पंक्तियों के साथ कुछ कर सकते हैं, उदाहरण के लिए:

  • सबसे पहले एक छोटा सा प्रोग्राम है जो कुशलता से एक फ़ाइल से एक मनमाना हिस्सा अर्क का निर्माण

    (ध्यान दें कि dd इस कुशलता से काम नहीं चलेगा क्योंकि हमें bs=1 का उपयोग मनमाने ढंग से ऑफसेट और लंबाई, और objcopy -O binary का समर्थन करने के लिए ALLOC, LOAD नहीं है)

    cat <<EOF | gcc -xc -o ./mydd - 
    #include <errno.h> 
    #include <fcntl.h> 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <sys/stat.h> 
    #include <unistd.h> 
    #include <macros.h> 
    
    char buf[1024*1024]; 
    
    int main(int argc, char** argv) { 
        char *fin, *fout; 
        int  fdin, fdout; 
        off_t off; 
        size_t len; 
        ssize_t rd; 
        int  status; 
    
        if (argc != 5) { 
        fprintf(stderr, "Usage: %s fin skip count fout\n", argv[0]); 
        return 1; 
        } 
    
        fin = argv[1]; 
        off = strtoul(argv[2], NULL, 0); 
        len = strtoul(argv[3], NULL, 0); 
        fout = argv[4]; 
        fdin = -1; 
        fdout = -1; 
    
        if ((fdin = open(fin, O_RDONLY)) < 0) { 
        status = errno; 
        perror(fin); 
        } else if ((fdout = open(fout, O_WRONLY|O_TRUNC|O_CREAT, 0660)) < 0) { 
        status = errno; 
        perror(fout); 
        } else if (lseek(fdin, off, SEEK_SET) == (off_t)-1) { 
        status = errno; 
        perror("Seeking input"); 
        } else { 
        while (len > 0 && (rd = read(fdin, buf, min(len, sizeof(buf)))) > 0) { 
         if (write(fdout, buf, rd) != rd) { 
         /*don't bother with partial writes or EINTR/EAGAIN*/ 
         status = errno; 
         perror(fin); 
         break; 
         } 
         len -= rd; 
        } 
        if (rd < 0) { 
         status = errno; 
         perror(fin); 
        } 
        } 
        if (fdin >= 0) close(fdin); 
        if (fdout >= 0) close(fdout); 
        return status; 
    } 
    EOF 
    
  • अंत में, .debug वर्गों निकालें और उन्हें छीन बाइनरी में गोंद।

    objcopy ` 
        objdump -h program.dbg | 
        awk '$2~/^\.debug/' | 
        while read idx name size vma lma off algn ; do 
         echo "$name" >&2 
         echo " --add-section=$name=$name.raw" 
         ./mydd program.dbg 0x$off 0x$size $name".raw" 
        done 
    ` program program_with_dbg 
    
0

elfutils उपकरण eu-unstrip जो निष्पादनयोग्य के साथ प्रतीक फ़ाइलें विलय करने के लिए इस्तेमाल किया जा सकता के साथ आता है। इसके परिणामस्वरूप स्ट्रिप किए गए संस्करण के स्थान पर उपयोग किया जा सकता है।

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