There can be plenty of reasons some code may end up looking like:
In such cases, it would be interesting for the linker to just declare foo as an alias of bar.
Of course one can only do this if there are no comparisons of function pointers. And that means that it can only be done if the symbols are not visible outside the executable/shared library, or if linking statically.
It requires analyzing the section contents at each eligible symbol, which is a relatively slow operation.
Do you have any statistics suggesting that it will be worth it? I.e., how many such functions are there in a typical executable?