gcc使用-Os生成大小为0的二进制文件

时间:2014-10-15 12:22:44

标签: c gcc arm freertos

我有一个简单的FreeRTOS应用程序,只需切换主循环中的LED。 当我用-Os编译它时,生成的二进制文件的大小为0.没有-Os一切都按预期工作。这里发生了什么?

我的CFLAGS是:

CPUFLAG = -mthumb -mcpu=cortex-m4
FPUFLAG = -mfpu=fpv4-sp-d16 -mfloat-abi=hard
WFLAG   = -Wall -Wextra -Werror -Wstrict-prototypes

CFLAGS  += -std=gnu99 $(WFLAG) $(CPUFLAG) $(FPUFLAG) -mlittle-endian -mthumb -nostartfiles
CFLAGS  += -ffunction-sections -fdata-sections -fno-builtin
LDFLAGS += -nostdlib --gc-sections -static

主要是TI的眨眼演示:

int main(void)
{
    volatile uint32_t ui32Loop;

    //
    // Enable the GPIO port that is used for the on-board LED.
    //
    SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOF;

    //
    // Do a dummy read to insert a few cycles after enabling the peripheral.
    //
    ui32Loop = SYSCTL_RCGC2_R;

    //
    // Enable the GPIO pin for the LED (PF3).  Set the direction as output, and
    // enable the GPIO pin for digital function.
    //
    GPIO_PORTF_DIR_R = 0x08;
    GPIO_PORTF_DEN_R = 0x08;

    //
    // Loop forever.
    //
    while(1)
    {
        //
        // Turn on the LED.
        //
        GPIO_PORTF_DATA_R |= 0x08;

        //
        // Delay for a bit.
        //
        for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++)
        {
        }

        //
        // Turn off the LED.
        //
        GPIO_PORTF_DATA_R &= ~(0x08);

        //
        // Delay for a bit.
        //
        for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++)
        {
        }
    }

    return 0;
}

使用-Os生成

   text    data     bss     dec     hex filename
      0       0       0       0       0 image.elf

,否则

   text    data     bss     dec     hex filename
   2012       4     728    2744     ab8 image.elf

修改differences in .map files

1 个答案:

答案 0 :(得分:4)

由于您指定了-nostartfiles,因此未使用标准启动及其入口点,因此没有对main函数的引用,--gc-sections会将整个部分丢弃为未使用。< / p>

要修复此问题,请尝试为您的函数start命名,或将-e _main添加到ld标记。