Someone reported that ls in coreutils exported _obstack* symbols. This is because ls uses the obstack module from gnulib (I assume). Due to the way ELF linking works by default, this promotes the symbols to global visibility, so that there is a single definition in the entire process. This is always a bit iffy (glibc supports it explicitly for malloc-related symbols, though), but in case of obstack it's really not great because the gnulib ABI is different from the glibc ABI:
$ gdb /usr/bin/ls […] (gdb) ptype _obstack_begin type = int (struct obstack *, size_t, size_t, void *(*)(size_t), void (*)(void *)) $ gdb /lib64/libc.so.6 […] (gdb) ptype _obstack_begin type = int (struct obstack *, int, int, void *(*)(long), void (*)(void *)) This is on x86-64, so the types aren't equivalent. Would it be possible to give the obstack symbols hidden visibility? Eventually, we need to fix this on the glibc side, either by deprecating the interfaces and turning them into a compat interface eventually, or by switching to size_t in these interfaces. But in the interim, I think we should use hidden visibility for the gnulib variants. (ls loads third-party code via NSS modules, and those modules could reasonably assume that the glibc obstack symbols follow the glibc ABI.) Thanks, Florian