Changes between Version 3 and Version 4 of Faq

Aug 14, 2006, 4:20:33 PM (14 years ago)



  • Faq

    v3 v4  
    3131  2. SET EMXOMFLD_TYPE=VAC308
     34Calling conventions
     37What's the story with the underscore?
     40The 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]
     42The 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...
     44The 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.
     46Now, 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.
     49How to declare a function so it won't get an underscore?
     52void _System hello_world(void);
     54If you want to compile this with EMX, add -D_System to you compiler commandline or #define _System to some header.
     57How to declare a variable so it won't get an underscore?
     60Not 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__.)