$ cat foo.c #include <string.h> int main(void) { char foo[4]; strcpy(foo, "foo"); return 0; } $ gcc -O2 -fno-inline foo.c /tmp/ccLwrlUH.o: In function `main': /tmp/ccLwrlUH.o(.text+0x5c): undefined reference to `__strcpy_small' collect2: ld returned 1 exit status $ rpm -q glibc gcc glibc-2.2.1-3 gcc-2.96-71
Pass -O2 -fno-inline -D__NO_STRING_INLINES then. Really, there is nothing glibc can do about this (apart from exporting all those inlines as static functions but that makes no sense) and gcc does not pass any macros which would tell whether -finline or -fno-inline was passed, so it has to use __OPTIMIZE__ (and has done that for ages).