Подтвердить что ты не робот

Как отменить полосу - т.е. Добавить символы обратно в разделенные двоичные файлы

У меня есть разделенный двоичный и символьный файл. Можно ли добавить символы обратно в двоичный файл и создать несвязанный двоичный файл.

Мой прецедент использует этот двоичный файл w/valgrind.

4b9b3361

Ответ 2

Для тех инструментов, которые не поддерживают отдельные файлы для отладочной информации, вы можете приклеить разделы отладки обратно к исходному двоичному.

Вы можете сделать что-то в этом направлении, например:

  • Сначала создайте небольшую программу, которая эффективно извлекает произвольный фрагмент из файла

    (обратите внимание, что 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
    

Ответ 3

elfutils поставляется с инструментом eu-unstrip, который может использоваться для объединения файлов символов с исполняемыми файлами. Результат можно использовать вместо разделенной версии.