我有一个剥离的二进制文件和符号文件。是否可以将符号添加回二进制文件并创建未提取的二进制文件。
我的用例是使用这个二进制文件w / valgrind。
答案 0 :(得分:13)
对于那些不支持调试信息的单独文件的工具,您可以将调试部分粘合回原始二进制文件。
你可以沿着这些方向做点什么,例如:
首先构建一个有效从文件中提取任意块的小程序
(请注意,dd
不会有效地执行此操作,因为我们必须使用bs=1
来支持任意偏移量和长度,并{{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
答案 1 :(得分:4)
Valgrind支持separate debug files,所以你应该使用answer here,而valgrind应该可以正常使用外化的调试文件。
答案 2 :(得分:3)
elfutils附带工具eu-unstrip
,可用于将符号文件与可执行文件合并。然后可以使用结果代替剥离版本。