There are various ways to formulate this depending on context. For example, in the general case any program of type $\min \frac{f(x)}{g(x)}$ can be reformulated to:
$\min w\\\text{s.t.}\\w=\frac{f(x)}{g(x)}$
This can then be written as:
$\min w \\\text{s.t.}\\g(x)w=f(x)\\|g(x)|\geq \epsilon$
This can then be relaxed and solved with branch and bound. If we have more fractional terms, we simply add more auxiliary $w_i$ variables and constraints to match. In this example, if the range of $g(x)$ initially includes 0 we have to give something up by adding a finite tolerance, so this can not be an exact reformulation.
This is typically good enough because it's bad modelling to allow a model to acquire meaningful values close to singularities in the first place.
Global optimization solvers will do all of this automatically.
If one is feeling cheeky they might even decide the bilinear syntax is fine and not to add the absolute value constraint, if that happens to work out in hindsight, even though that's not mathematically correct. For instance, we can solve without the $\neq 0$ constraint and check whether the result actually evaluates to $g(x)=0$. If it doesn't, sweet, we're done.