У меня есть разделенный двоичный и символьный файл. Можно ли добавить символы обратно в двоичный файл и создать несвязанный двоичный файл.
Мой прецедент использует этот двоичный файл w/valgrind.
У меня есть разделенный двоичный и символьный файл. Можно ли добавить символы обратно в двоичный файл и создать несвязанный двоичный файл.
Мой прецедент использует этот двоичный файл w/valgrind.
Valgrind поддерживает отдельные файлы отладки, поэтому вы должны использовать ответ здесь, и valgrind должен корректно работать с внешним файлом отладки.
Для тех инструментов, которые не поддерживают отдельные файлы для отладочной информации, вы можете приклеить разделы отладки обратно к исходному двоичному.
Вы можете сделать что-то в этом направлении, например:
Сначала создайте небольшую программу, которая эффективно извлекает произвольный фрагмент из файла
(обратите внимание, что 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
elfutils поставляется с инструментом eu-unstrip
, который может использоваться для объединения файлов символов с исполняемыми файлами. Результат можно использовать вместо разделенной версии.