leak check linux gdb valgrind strip

linux - check - Cómo deshacer la tira-es decir, agregar símbolos de nuevo a binario despojado



valgrind memory leak check (3)

Para aquellas herramientas que no admiten archivos separados para información de depuración, puede pegar las secciones de depuración al binario original .

Puedes hacer algo en este sentido, por ejemplo:

  • Primero construya un pequeño programa que extraiga de manera eficiente una porción arbitraria de un archivo

    (tenga en cuenta que dd no lo hará de manera eficiente, ya que tendríamos que usar bs=1 para admitir un desplazamiento y una longitud arbitrarios , y objcopy -O binary no copia secciones que no sean 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

  • Finalmente, extraiga las secciones .debug y .debug al binario eliminado.

    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

Tengo un archivo binario y símbolo despojado. ¿Es posible volver a agregar los símbolos al binario y crear un binario sin rayas?

Mi caso de uso es usar este binario con valgrind.



elfutils viene con la herramienta eu-unstrip que se puede usar para combinar archivos de símbolos con ejecutables. El resultado se puede utilizar en lugar de la versión eliminada.