I have written a simple code like this

```c
#include <stdlib.h>
#include <stdio.h>

//#define CONFIG_TARGET_X86_64

#ifdef CONFIG_TARGET_X86_64
static void A( )
{
    printf("A\n");
}
#else
void A( );
#endif

static void B( )
{
    printf("B\n");
}


static int xx( )
{
#ifdef CONFIG_TARGET_X86_64
  return 1;
#else
  return 0;
#endif
}

int main(void)
{
  if (xx( ))   /* define CONFIG_TARGET_X86_64 */
    A( );
  else
    B( );
}
```

If we don't define the CONFIG_TARGET_X86_64, xx( ) will always return FALSE, so functiopn A which is only declared, but not implemented will never be called(dead code).

compile it with gcc -O0

```cpp
/tmp/cctSpgGk.o: In function `main':
1.c:(.text+0x34): undefined reference to `A'
collect2: error: ld returned 1 exit status
```

But it can be compiled by -O1 or higher.

use GCC V6.1.0.

I can declare A as weak:

```cpp
void A (void) __attribute__ ((weak));
```

Then the linker will ignore the undefined symbol reference, but a call to this function will lead to a crash


So my question is :
It seems that one of the optimization options in the -O1 option eliminates the dead code, I have seen the optimize doccument about GCC

https://gcc.gnu.org/onlinedocs/gcc-6.4.0/gcc/Optimize-Options.html

but I can't find it.

So if I just want to compile this code under the -O0 option, Is it possible ? Are there some optimization flags help me to do this?

Thanks.

Reply via email to