We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
When trying to compile the following file using arm-none-eabi-gcc-7.3.1 I get a linker error.
inline int test() { return 0; } int main(int argc, char* argv[]) { test(); return 0; }
Command line: arm-none-eabi-gcc.exe test.c --specs=nosys.specs
Output:
ccc547p6.o: In function `main':test.c:(.text+0x14): undefined reference to `test'
Analysis of intermediate assembly output reveals that compiler treats test() function as inline and does not generate a body for it, but then, when it generates a code for main function, it generates a regular, non-inline call to test() function instead of inlining it, which, of course, upsets the linker later.
Probing the compiler for __STDC_VERSION__ reveals that it is set to 201112L, pointing to C11 compliance. Support for inline functions in C mode was introduced in C99, so it should be handled correctly by C11-compliant compiler.
Of course, inline function specifier is merely a hint (according to the standard), so implementations may elect to not inline functions at all, but they can't do it half-way by first not generating a function body, but then calling functions using regular calls - this will lead to inability to link.
By the way, none of this happens in C++ mode, arm-none-eabi-g++ compiles and links the same file without an error.
Am I doing something wrong?