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

Linux 如何撤消剥离-即将符号添加回剥离二进制文件,linux,gdb,valgrind,strip,Linux,Gdb,Valgrind,Strip,我有一个剥离的二进制和符号文件。是否可以将符号添加回二进制文件并创建非压缩二进制文件 我的用例是使用此二进制文件w/valgrind。valgrind支持,因此您应该使用,并且valgrind应该能够与外部化的调试文件正常工作。对于那些不支持单独文件作为调试信息的工具,您可以将调试部分粘合回原始二进制文件 您可以按照以下方式进行操作,例如: 首先构建一个小程序,有效地从文件中提取任意块 (请注意,dd无法有效地执行此操作,因为我们必须使用bs=1来支持任意偏移量和长度,objcopy-O bi

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


我的用例是使用此二进制文件w/valgrind。

valgrind支持,因此您应该使用,并且valgrind应该能够与外部化的调试文件正常工作。

对于那些不支持单独文件作为调试信息的工具,您可以将调试部分粘合回原始二进制文件

您可以按照以下方式进行操作,例如:

  • 首先构建一个小程序,有效地从文件中提取任意块

    (请注意,
    dd
    无法有效地执行此操作,因为我们必须使用
    bs=1
    来支持任意偏移量和长度,
    objcopy-O binary
    不会复制非
    ALLOC,LOAD
    的节)


随附工具
eu unstrip
,可用于将符号文件与可执行文件合并。结果可以用来代替剥离版本。

我要说的是重新编译,想不出其他任何东西:)和否:不能从剥离的二进制文件创建非剥离的二进制文件(至少不容易)。但是您不需要这样做,因为这个答案正确地说明了这一点。很抱歉,我不清楚如何使用这个调试文件w/valgrind。如果您能给我指点,我将不胜感激。在“这里的答案”中提供的说明似乎很清楚。您构建单独的debuginfo,然后Valgrind和GDB将自动加载它们。谢谢-将给它一个stry.dd可以搜索到任意地址,而不会将块大小缩小到1。请参阅dd的man中的标志“跳过字节”。请注意,这不会复制与节关联的重新定位
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
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