Thoroughly Understanding C++ ABI

(ykiko.me)

19 points | by rramadass 5 days ago

5 comments

  • Dwedit 44 minutes ago
    C++ ABIs are why Win32 settled on things like COM to do cross-module passing of objects. Because nobody could agree on a standard, the COM standard enforced a very specific calling convention, and a very specific vtable layout for COM objects.
    • pjmlp 24 minutes ago
      Not only, there is also XPC and IO/DriverKit on Apple, Android IPC, D-BUS, FIDL on Fucshia,....

      Also C ABI also does not exist, people keep mistaking the ABI of their favourite C compiler with the OS ABI, which only overlap if the OS was written in C to start with.

      For example on mainframes and micros, naturally not written in C, it is either a bytecode based ABI like TIMI on IBM i, or language environments like on z/OS, ClearPath MCP, OS 2200 and so forth.

      And as a reminder, from a famous WG14 and WG21 member, and former Rust contributor,

      "To Save C, We Must Save ABI"

      https://thephd.dev/to-save-c-we-must-save-abi-fixing-c-funct...

    • mohamedkoubaa 1 minute ago
      Given OOP, the only ABI for an object is a vtable and that is left unspecified (for good reason) by the C++ standard.
  • rramadass 4 days ago
    • jdw64 30 minutes ago
      I understand that Move Semantics led to better implementations and that this is why things changed. I know that in this case, problems arose when transitioning from C++98 to what's commonly called Modern C++ (C++11). However, I'm not very familiar with what the specific issues were with COW. If you happen to know of any documents that describe this problem in more detail, I'd appreciate it if you could let me know. I'm sorry for always asking questions. I've looked up a few documents, but since you clearly know much more about this than I do, I'm asking to study it myself as well. If it's too much trouble, feel free not to reply.
  • mohamedkoubaa 5 minutes ago
    C++ famously has no ABI, it is the implementations of C++ that have ABIs. The reason the situation is so bad is that it's considered explicitly out of scope of the language (it targets an abstract machine).
  • rramadass 5 days ago
    As always, read wikipedia and follow links as needed - https://en.wikipedia.org/wiki/Application_binary_interface
  • jdw64 38 minutes ago
    Does the C++ standard guarantee binary ABI? Isn't that something that compiler and library contributors handle separately? So I think the arguments you see online are more accurate—vendors are the ones maintaining it.

    In other words, the ABI we rely on today isn't really part of the C+ standard—it's more like the Itnaium C++ ABI or the MSVC C++ ABI.

    In the end, I think the ABI stays stable because of community conventions established by compiler vendors.

    • jcranmer 21 minutes ago
      No, ABI is not part of the C++ standard, although there are parts of C++ that do go "this is an ABI thing" (e.g., [[no_unique_address]]).

      ABI is more of OS-level thing. Most systems these days follow the SysV ABI, which is largely defined by the hardware manufacturers via the processor-specific supplements (the x86-64 one is here: https://gitlab.com/x86-psABIs/x86-64-ABI). These largely delegate C++-specific conventions to the Itanium C++ ABI (which they likely directly reference), although the ARM ecosystem uses a somewhat different layout for the exception handling tables. Microsoft uses a different ABI for both the underlying C ABI and for the C++ compatibility layer built on top of the C ABI.

      One of the issues that crops up is that vendors end up needing to add extensions to the ABI for various reasons, and these extensions tend to end up being incompatible, since they're added before they've had a time to be standardized. 16-bit floats is a particular historical bugbear, as is the C23 _BitInt stuff.

      • jdw64 2 minutes ago
        Thank you for the kind comment. I'll make a note of it and look into it.
    • pjmlp 20 minutes ago
      No, neither does the C standard.

      With exception of Swift, D, and bytecode based languages, the ABI is left to the vendors.

      For those that think ISO/IEC 9899:2024 PDF has anything related to ABI, the actual ABI used by C compilers, is the OS ABI, if the OS was written in C to start with, and naturally this overlaps quite nicely with UNIX like OSes, and Windows.

      It isn't like that on other platforms that decided to either use other systems languages, or expose their OS APIs in a different way, e.g. mainframes, micros, Android, ChromeOS, WebOS,...

      • mohamedkoubaa 4 minutes ago
        Isn't this one reason why C is the de facto FFI? OSes happen to use it in their OS ABI and so everything is forced to speak it
    • andyg_blog 23 minutes ago
      It doesn't, and FWIW the article says that. A meta note: ABI stability is a holy war inside the C++ community. Those against it argue that it's holding back real language evolution. Herb Sutter is even working on his own C++ offshoot that shows what could be.
      • Mond_ 16 minutes ago
        Afaik Herb Sutter largely stopped working on Cppfront a few months ago, and was never quite supposed to be a real thing, just a personal playground (or so Sutter claims at this point, anyway).

        Afaik Carbon is at this point the only attempt at a successor language that's still going?