Đố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 ý và 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
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