一般Release給客戶的檔案都是移掉Debug資訊的檔案,不過,在編譯Release檔案時,通常會額外編譯一份具有Debug Symbol的檔案,而在Debug時,雖然可以在GDB動態載入Debug Symbol,不過,還是不方便,其實elfutils提供一個好用的工具eu-unstrip,它可以把Debug Symbol塞回原本ELF檔案
main.c
#include <stdio.h>
int main(int argc, char** argv)
{
printf("testing\n");
return 0;
}
編譯
$ gcc main.c -o main $ gcc main.c -ggdb -o main.debug
模擬Release Build
$ strip main
$ file main
main: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=44edbb6ef58938fde04de6b6943a640edeb37b77, stripped
Unstrip
$ eu-unstrip -f main main.debug -o test
$ mv test main
$ file main
main: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=44edbb6ef58938fde04de6b6943a640edeb37b77, with debug_info, not stripped
Debug
$ gdb main
(gdb) b main
Breakpoint 1 at 0x1114: file main.c, line 5.
(gdb) r
Starting program: /home/steward/Downloads/main
Program received signal SIGSEGV, Segmentation fault.
0x0000000000000001 in ?? ()
(gdb) list
1 #include <stdio.h>
2
3 int main(int argc, char** argv)
4 {
5 printf("testing\n");
6 return 0;
7 }