For a long time, inode numbers from readdir() had certain semantics. Supporting overlay filesystems required changing those semantics. Piles of software were written against the old semantics; and even some of the most common have not been upgraded.
For a long time, inode numbers from readdir() had certain semantics. Supporting overlay filesystems required changing those semantics. Piles of software were written against the old semantics; and even some of the most common have not been upgraded.
What there are piles of, are softwares that reinvent the C library, all too often in little bits of conditionally-compiled code that have either been reinvented or nicked from some old C library and sit unused in every platform that that application is nowadays ported to. Every time that I see a build log dutifully informing me that it has checked for <string.h> or some other thing that has been standard for 35 years I wonder (a) why that is thought to be necessary in 2025, and (b) what sort of shims would get used if the check ever failed.
Most programs will probably just fail to compile: "#undef HAVE_STRING_H" gets added to config.h, but it's never checked. Or something along those lines. It's little more than "failed to find <string.h>" with extra steps.
The exceptions are older projects which support tons of systems: bash, Vim, probably Emacs, that type of thing. A major difficulty is that it can be very hard to know what is safe to remove. So to use your strings.h example, bash currently does:
#if defined (HAVE_STRING_H)
# include <string.h>
#endif /* !HAVE_STRING_H */
#if defined (HAVE_STRINGS_H)
# include <strings.h>
#endif /* !HAVE_STRINGS_H */
And Vim has an even more complex check: // Note: Some systems need both string.h and strings.h (Savage). However,
// some systems can't handle both, only use string.h in that case.
#ifdef HAVE_STRING_H
# include <string.h>
#endif
#if defined(HAVE_STRINGS_H) && !defined(NO_STRINGS_WITH_STRING_H)
# include <strings.h>
#endif
Looks like that NO_STRINGS_WITH_STRING_H gets defined on "OS/X". Is that still applicable? Probably not?Is any of this still needed? Who knows. Is it safe to remove? Who knows. No one is really tracking any of this. There is no "caniuse" for this, and even the autoconf people aren't sure on what systems autoconf does and doesn't work. There is no way to know who is running what on what, and people do run some of these programs on pretty old systems.
So ... people don't touch any of this because no one knows what is or isn't broken and what does and doesn't break if you touch it.
Aside: people love to complain about telemetry, sometimes claiming it's never useful, but this is where telemetry would absolutely be very useful.
But a lot of the time this isn't because people are afraid to take the checks out. It's because they were put in by cargo cult programming in the first place. Autotools et al. are so complex that people will copy existing setups to start new projects rather than begin with a blank slate and add things as and when they come up.
Which means that projects don't start out massively portable because of this stuff being used; but rather they start out inherently massively portable, with useless checks, parroted from somewhere else, on standard library stuff that was always there, sometimes decades before the project was even begun.
It's not really "Who knows". We actually do know. Well, those of us who lived through the process know. Checks for <stdlib.h> or <string.h> aren't needed. There was a period of about half a decade when they were, but by the early to middle 1990s it was perfectly adequate to just assume this pretty basic level of standard conformance.
The "old systems" argument is a specious one. I've worked on the old systems when they weren't nearly so old, including things like porting from Unix to MS-DOS and Big Iron, and experience teaches that the existence of standard headers like <string.h> et al., quickly adopted as soon as they were invented and solved by the likes of Henry Spencer for the rare non-adoption cases, was never a long-term problem; certainly not one long-term enough that it has lasted until 2025.
I'm not so sure about that to be honest. A few years ago (around 2020 or 2021 IIRC) autotools switched from the old deprecated backquotes to $(..) to run programs in shell, and people complained that it no longer worked with their SunOS shell or some such. I've also seen some Vim bug reports about stuff breaking on obscure old systems. In short, I think you may be underestimating the "long tail" of weird/old systems.
Personally, I'd say it's perfectly reasonable to just say "sorry, we're not supporting that any more, you can keep using the existing version" because the number of people doing this seems quite small. But they do seem to exist.