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 usarbs=1
para admitir un desplazamiento y una longitud arbitrarios , yobjcopy -O binary
no copia secciones que no seanALLOC, 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.
Valgrind admite archivos de depuración separados , por lo que debería usar la respuesta aquí , y valgrind debería funcionar correctamente con el archivo de depuración externalizado.
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.