When I do a release build with gcc (i.e. I do not specify -g
), I still seem to end up with symbols in the binary, and have to use strip
to remove them. In fact, I can still breakpoint functions and get backtraces in gdb (albeit without line numbers).
This surprised me - can anyone explain why this happens?
e.g.
#include <stdio.h>
static void blah(void)
{
printf("hello world\n");
}
int main(int argc, char *argv[])
{
blah();
return 0;
}
gcc -o foo foo.c
nm foo | grep blah
:
08048374 t blah
There's a big difference between debug symbols and linker symbols. Debug symbols map code locations etc to source file names and line numbers and various other useful things to help debuggers, profilers, etc. Linker symbols just define the addresses of various entry points and other important locations in your code. If you want to make an executable completely anonymous then you need to use strip
, as you have seen.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With