2013-04-12 42 views
17

Tôi có một tệp nhị phân và ký hiệu bị tước bỏ. Có thể thêm các biểu tượng trở lại nhị phân và tạo một nhị phân chưa được đặt.Cách hoàn tác dải - tức là thêm các biểu tượng trở lại để tước số nhị phân

Trường hợp sử dụng của tôi đang sử dụng số nhị phân này/valgrind.

+3

tôi muốn nói biên dịch lại, không thể nghĩ ra bất cứ điều gì khác :) – mata

Trả lời

4

Valgrind hỗ trợ separate debug files, vì vậy bạn nên sử dụng answer here và valgrind sẽ hoạt động đúng với tệp gỡ lỗi được bên ngoài.

+0

Và không: bạn không thể tạo một tệp nhị phân chưa được tách khỏi một tệp nhị phân (ít nhất là không dễ dàng). Nhưng bạn không nên cần phải, vì câu trả lời này nói đúng. –

+0

Tôi xin lỗi, nhưng không rõ làm thế nào tôi có thể sử dụng tập tin gỡ lỗi này w/valgrind. Sẽ đánh giá cao bất kỳ con trỏ. – cached

+0

Các hướng dẫn được cung cấp trong "câu trả lời ở đây" có vẻ khá rõ ràng. Bạn xây dựng debuginfo riêng biệt, và sau đó Valgrind và GDB sẽ tự động tải chúng. –

12

Đối với những công cụ không hỗ trợ các tệp riêng biệt để gỡ lỗi thông tin, bạn có thể dán các phần gỡ lỗi trở lại nhị phân gốc.

Bạn có thể làm một cái gì đó dọc theo những dòng, ví dụ:

  • đầu tiên xây dựng một chương trình nhỏ mà hiệu quả chiết xuất từ ​​một đoạn tùy ý từ một tập tin

    (lưu ý rằng dd sẽ không làm điều này một cách hiệu quả vì chúng tôi phải sử dụng bs=1 để hỗ trợ bù đắp tùy ýchiều dài và objcopy -O binary không sao chép các phần không phải là 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 
    
  • Cuối cùng, trích xuất các phần .debug và dán chúng vào nhị phân bị tước.

    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 đi kèm với các công cụ eu-unstrip mà có thể được sử dụng để kết nối các file biểu tượng với thực thi. Kết quả sau đó có thể được sử dụng thay cho phiên bản bị tước.