Do not trust the result of `dladdr` on FreeBSD
Similar to windows' `SymFromAddr` it only find the closest exported symbol without
checking symbol size and can therefore return incorrect result for local functions.
Also reorganize the code so that the function name and base lookup is always down even when
the LLVM object lookup failed.