https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68272
--- Comment #1 from joseph at codesourcery dot com <joseph at codesourcery dot com> --- This is not a standards conformance bug, on multiple grounds: * The C standard does not permit you to define your own copies of standard library functions (that is, functions in the standard you specified with -std=, e.g. -std=c99; -std= controls which built-in functions are present). All library function names are always reserved as identifiers with external linkage, whether or not you include the corresponding header. * You're using 4.9, which defaults to -std=gnu89. gnu89 inline semantics mean that plain "inline" functions *should* get out-of-line copies generated in each translation unit. For C99 inline semantics you need an appropriate -std option for versions before GCC 5 (which defaults to -std=gnu11). That said, it may be best anyway not to export such copies in C99 inlining mode, if the only extern declaration is the implicit built-in one. But you're well outside the standard if you try to do this.