https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69271
--- Comment #5 from nsz at gcc dot gnu.org --- copy pasting from http://www.openwall.com/lists/musl/2016/01/13/2 (this is musl libc, but glibc has the same issue) lto breaks symbol binding for environ, _environ, ___environ. (they should be weak, without that environ in a main binary has different address than in libc.so) libc.so built with -flto: $ readelf --dyn-syms -W libc.so |grep envi 22: 000000000028eb90 8 OBJECT GLOBAL DEFAULT 15 __environ 398: 000000000028eb90 8 OBJECT GLOBAL PROTECTED 15 ___environ 1034: 000000000028eb90 8 OBJECT GLOBAL PROTECTED 15 _environ 1107: 000000000028eb90 8 OBJECT GLOBAL DEFAULT 15 environ libc.so without -flto: $ readelf --dyn-syms -W libc.so |grep envi 22: 000000000028d2d8 8 OBJECT GLOBAL DEFAULT 15 __environ 398: 000000000028d2d8 8 OBJECT WEAK PROTECTED 15 ___environ 1034: 000000000028d2d8 8 OBJECT WEAK PROTECTED 15 _environ 1107: 000000000028d2d8 8 OBJECT WEAK DEFAULT 15 environ