This subverts the notion of what "static" means here. "Static" means "private to this translation unit".
Usage of the linker in modern C has been moving in the opposite direction, IMO, towards keeping the interface between the compiler and linker simple. For example, it looks like the trend is towards eliminating the use of "common" variables--GCC now defaults to -fno-common.
You can still get all sorts of fancy stuff with LTO turned on. But if you want no duplicates, you can express that intent by choosing a specific translation unit to contain the duplicates.
Yes, that's true... but often, visible symbols don't have enough information to get deduplicated anyway. Often, the symbol is just an address within a section in the object file. The section contains other code, and you can't remove things from it... by default, on most systems.
E.g. if you have file.o, the linker will see something like this:
section .text: [...16kb of data follows...]
section .data: [...2kb of data follows...]
my_function = .text + 0x1f3a
This is simplified, but it just illustrates the core of what an object file looks like during linking.
It's just not enough information to go on, if you want to deduplicate a function. C runs on weird embedded systems. You might think, "Just use LTO" and well, those weird systems don't always have LTO. You might think, "If you care about code size, don't use inline functions!" and well, sometimes, inlining a function results in smaller code!