| 33 | |
| 34 | Calling conventions |
| 35 | ==================== |
| 36 | |
| 37 | What's the story with the underscore? |
| 38 | ------------------------------------- |
| 39 | |
| 40 | The extra underscore can be said to be inherited from the microsoft compilers, which makes it go back to the early DOS days. [If somebody has a complete history, please update/let me know. bird] |
| 41 | |
| 42 | The OS/2 (and Windows) C ABI (application binary interface) dicates that the __cdecl calling convention shall decorate functions with one leading underscore. To my knowledge most of the windows and OS/2 compilers with the exception of EMX does this. The OS/2 specific _System calling convention is basically the same as __cdecl except that there is no decoration of the function name (there is also the bit about AL containing the parameter count, but nobody really implements this). There are a number of other calling convetions on OS/2, _Optlink (the IBM compilers), watcom register call (todo: name), __stdcall (microsoft windows api), borland probably has one, etc... |
| 43 | |
| 44 | The EMX ports of gcc didn't implement __cdecl according to the OS/2 ABI, they simply omitted the leading underscore. This made _System and __cdecl identical for all practical purposes. With gcc using __cdecl as default, this meant that _System could be completely ignored. |
| 45 | |
| 46 | Now, starting with GCC 3.2.2 it became important that GCC could work together with other compilers (for building certain Odin32 dlls and other stuff). So, the OS/2 port was changed to decorate the all names according to the __cdecl ABI just like the microsoft compilers. Unfortunatly, breaks compatibility with EMX, but then GCC 3.2.2 comes with it's own, EMX derived, libc. |
| 47 | |
| 48 | |
| 49 | How to declare a function so it won't get an underscore? |
| 50 | -------------------------------------------------------- |
| 51 | |
| 52 | void _System hello_world(void); |
| 53 | |
| 54 | If you want to compile this with EMX, add -D_System to you compiler commandline or #define _System to some header. |
| 55 | |
| 56 | |
| 57 | How to declare a variable so it won't get an underscore? |
| 58 | -------------------------------------------------------- |
| 59 | |
| 60 | Not really possible. You might use something like int my_variable asm("my_variable"); but that's hardly generic or portable. (todo: check if it's really 'asm' and not some __attribute__.) |
| 61 | |