Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why name-mangling has no effect on main function in C++?

C++ compiler often mangle function names to support many features. Programer can suppress default name-mangling using extern "C" way. However, why int main(int, char **) not affected ever?

// test.cpp

int max(int a, int b) {
    return a > b ? a : b;
}

extern "C" {
    int min(int a, int b) {
        return a < b ? a : b;
    }
}

int main (int argc, char *argv[]) {
    return 0;
}    

And

$  xcrun --sdk macosx clang -x c++ -c test.cpp -o test  
$  xcrun nm -nm test  

0000000000000000 (__TEXT,__text) external __Z3maxii  
0000000000000030 (__TEXT,__text) external _min  
0000000000000060 (__TEXT,__text) external _main  

Obviously, int max(int, int) is mangled to __Z3maxii; int min(int int) is free from mangling with extern "C" annotation.

How does main escape from mangling?
Is there any way else to keep name from mangling except the above annotation?

like image 599
Hans Allen Avatar asked Nov 20 '18 13:11

Hans Allen


2 Answers

Per [basic.start.main]/1, [basic.start.main]/2 and [over]/1:

A program shall contain a global function called main. [...] This function shall not be overloaded. [...] When two or more different declarations are specified for a single name in the same scope, that name is said to be overloaded [...].

This is then undefined behavior to have anything in the global namespace with the name main. There is then no reason for an implementation to mangle main or even consider it to be a proper function.

like image 108
YSC Avatar answered Oct 23 '22 06:10

YSC


Name mangling is a process used by C++ compilers to give each function in your program a unique name. In C++, generally programs have at-least a few functions with the same name ie function overloading, however Main is special, its actually a global function of the C language that can never be overloaded, so it is not necessary.

Take a look at https://en.cppreference.com/w/cpp/language/main_function

And questions about name mangling in C++

(Main) special properties

It cannot be predefined and cannot be overloaded: effectively, the name main in the global namespace is reserved for functions (although it can be used to name classes, namespaces, enumerations, and any entity in a non-global namespace, except that a function called "main" cannot be declared with C language linkage in any namespace (since C++17))

like image 23
RyanN1220 Avatar answered Oct 23 '22 07:10

RyanN1220