Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does gcc add symbols to non-debug build?

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

like image 873
Matt Holgate Avatar asked Mar 22 '10 09:03

Matt Holgate


1 Answers

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.

like image 75
Paul R Avatar answered Sep 19 '22 12:09

Paul R