This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Undefined reference to __main

Hi,

I am trying to port an existing startup code (which compiles fine using arm compiler 6.18) to compile with GNU toolchain for arm (arm-none-eabi).

The startup code includes a jump to __main which doesnt exist in my codebase presumably because its part of some sort of C runtime library.

But when I try and compile it with gcc cross-compiler, it complains about "undefined reference __main".

How do I resolve this pls?

Thanks

Sarah

  • Hi Sarah,

    The Arm C-Library entry point is __main. I believe you need to change this call to _start.

    Ronan

  • Thanks so much Ronan. That fixed the immediate problem. However, I am now getting a different linker error:

    /usr/src/debug/libv7fphard-libgloss/3.3.0-r0/newlib-3.3.0/libgloss/arm/crt0.S:547: undefined reference to `__bss_start__'

    Given that I have my own startup code startup.S which zero-initialises various bss sections in different TCMs, I am wondering where this runtime library startup code fits in??

    FYI My startup code is based on the R52 example code which is supplied with Arm DS dowload.

  • This symbol is defined in the gcc.ld linker script.

    Do you just need to undefine this symbol there, else define a dummy region with __bss_start (and __bss_end) therein?

        .bss :
        {
            . = ALIGN(4);
            __bss_start__ = .;
            *(.bss*)
            *(COMMON)
            . = ALIGN(4);
            __bss_end__ = .;
        }

  • I could create dummy regions like u suggested but I am not clear how it fits in with my own startup code and bss regions. E.g.:

    tcmb :
    {
    *(.data)

    . = ALIGN(4);
    __tcmb_bss_start__ = .;
    *(.bss)
    . = ALIGN(4);
    __tcmb_bss_end__ = .;

    /* Associate ARM_LIB_HEAP symbol */
    __heap = .;
    . = ALIGN(64);
    . = . + 0x1000;
    } >TCMB

    tcmc :
    {
    . = ALIGN(4);
    __tcmc_bss_start__ = .;
    *(.bss)
    . = ALIGN(4);
    __tcmc_bss_end__ = .;

    . = ALIGN(4);
    __stack_start__ = .;
    . = . + 0x8000;
    . = ALIGN(4);
    __stack_end__ = .;
    } >TCMC

    As u can see, I have different bss regions defined in my ld file and my startup code zero-initialises those.

    U suggested "undefining" __bss_start and __bss_end. How do I do that pls?

    I guess the other question is if I should even be using the GCC startup library or just skip it altogether (given that I have my own startup sequence defined)?

  • Ignore my comment on undefining the symbols. Thinking it through I don't think that would help. I just meant to comment them out, but the startup code would still be looking for them.

    Does your ld script define all the .bss regions? This would be the catch-all for anything else remaining. If there is nothing remaining, still defining them as regions in your ld script should allow the init code to proceed.