The C standard does not specify how compilers should generate the name of a C function inside an object file. It seems that GCC compatible front-ends simply prepend the name of the C function by an underscore. Microsoft compilers use a different strategy.
However, a lot of languages are able to call C functions (Rust, Go, etc). I assume that the developers had access to some document explaining how the C symbols are translated by the different compilers on the different operating systems.
Is there some publicly available website/document/RFC documenting this point for the different compilers (GCC, Visual C++, etc) or operating systems?
EDIT: On this page http://www.iecc.com/linker/linker05.html in the Name Mangling section, a brief history is given. On this post: What is the reason function names are prefixed with an underscore by the compiler?, we talk about a simple convention. Has this rule been ever written somwhere in some of the compilers' documentation?