如何撤消strip - 即将符号添加回剥离的二进制文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何撤消strip - 即将符号添加回剥离的二进制文件相关的知识,希望对你有一定的参考价值。

我有一个剥离的二进制和符号文件。是否可以将符号添加回二进制文件并创建未提取的二进制文件。

我的用例是使用这个带w / valgrind的二进制文件。

答案

Valgrind支持separate debug files,所以你应该使用answer here,而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 ", 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,可用于将符号文件与可执行文件合并。然后可以使用结果代替剥离版本。

以上是关于如何撤消strip - 即将符号添加回剥离的二进制文件的主要内容,如果未能解决你的问题,请参考以下文章

如何以比使用 strip_tags 函数更安全的方式剥离标签?

将“复制期间剥离调试符号”设置为 NO 后经常出现内存警告

剥离二进制文件后的调试部分

应该使用啥命令来创建一个只包含所有目标文件符号的文件?

android 保留符号,不strip

如何确定是不是在 Mac OS X 上剥离了二进制文件?