Hybrid Binaries On Windows For ARM: ARM64EC And ARM64X Explained

With ARM processors increasingly becoming part of the desktop ecosystem, porting code that was written for x86_64 platforms is both necessary and a massive undertaking. For many codebases a simple recompile may be all it takes, but where this is not straightforward Microsoft’s ARM64EC (for ‘Emulator Compatible’) Application Binary Interface (ABI) provides a transition path. Unlike Apple’s ‘Fat Binaries’, this features hybrid PE executables (ARM64 eXtended, or ARM64X) that run mixed ARM64EC and x86_64 binary code on Windows 11 ARM systems. An in-depth explanation is provided by one of the authors, [Darek Mihocka].

ARM64EC was announced by Microsoft on June 28, 2021 as a new feature in Windows 11 for ARM, with more recently Qualcomm putting it forward during the 2024 Game Developers Conference (GDC) as one reason why high-performance gaming on its Snapdragon SoCs should be much easier than often assumed. Naturally, this assumes that Windows 11 is being used, as it contains the x86_64 emulator with ARM64EC support. The major difference between plain ARMv8 and ARM64EC code is that the latter has changes on an ABI level to e.g. calling conventions that ease interoperability between emulated x86_64 and ARM64 code.

Although technologically impressive, Windows 11’s marketshare is still rather small, even before looking at Windows 11 on ARM. It’ll be interesting to see whether Qualcomm’s bravado comes to fruition, and make ARM64EC more relevant for the average software developer.

43 thoughts on “Hybrid Binaries On Windows For ARM: ARM64EC And ARM64X Explained

  1. >Windows 11’s marketshare is still rather small

    Don’t worry that will soon change. M$ deprecating Win10 will force many companies to switch to Windows 11. And with intel 12gen or later CPUs Win10 is not a good option due to the lack of heterogeneous CPU support, or support for any new technologies (wifi 6e / 7 for example).

    Also market share is two words, not one.

    1. They will just force more people to linux. The whole “this application requires windows 10” has forced both my 80 year old dad and technolocically illiterate little sister to dual booting linux, which can now be installed as easily as windows at zero cost.

      The 13% of windows users using win 7, a number still in the 100s of millions, aren’t going to use win 10 or win 12. They will use win 7 until they are forced to switch to linux.

        1. Why? I have had steam on linux for years with no issues.

          Steam will go where the market goes as well and people are unhappy with the application-subscription model. It will just take time for a generation of kids to be raised by people who realize you don’t need to pay 100s of dollars each year for a text editor.

      1. Oh a wild linux fan appears. Who would have guessed this will happen when somebody talks about windows.

        I daily drove linux for many many years on desktop up to 2 years ago.
        Its nowhere near on the level of windows. Not even close to even windows NT 3.1 level mature for enterprises. Good luck using linux in an enterprise environment on end user devices. I’m not talking about servers. Desktop linux.

        1. Microsoft Windows is the most used at 72.99%, followed by Apple’s macOS at 16.13%, and Google’s ChromeOS at 1.76%, and desktop Linux at 3.77%.

          I am writing this post on a Fedora box that I have been using as Linux desktop machine (That has Steam installed) for about 8 years!

      2. Linux is fine for two types of people. First is those who don’t understand anything about computers and don’t want to – they just want certain simple things like a web browser or a word processor to be there, and never change. You set them up once, and they’re happy. When things stop working, they come back to you to fix it. If you’re not there anymore, they go buy a Mac.

        The second type is those who enjoy configuring everything for themselves and aren’t bothered to spend hours to weeks on figuring why things don’t work, armed with little more than a command line and a text editor. They don’t mind if features are lacking, or there’s no one-click GUI tool, because they’re programmers and hackers who will write their own in a pinch.

        That’s the two tails of the bell curve. Windows is for everyone else in the middle. That middle won’t budge, because they’re not happy with what Linux has to offer “out of the box”, and they don’t have the expertise or the patience, or the helpful relatives to keep configuring Linux to work for them.

        1. You might have been right 10 years ago but so many people use web apps now (eg photoshop, office), they really just need a web browser.

          If the middle won’t budge why do you think those hundred million win 7 users wont upgrade to win 10, 11 or 12? Are they happy with the offerings or not.

          The reason people use windows is because there are one or two windows apps they use and they don’t want to figure out how to make it work on linux and they don’t want to learn an alternative app. Windows is forcing them to make a choice and they will lose market share because of it.

          1. “You might have been right 10 years ago but so many people use web apps now (eg photoshop, office), they really just need a web browser.”

            Sounds like you were out of town when people were complaining about the cloud and subscription software.

          2. im still of the opinion that linux still isnt quite there yet, with the minor exception of hardware built specifically with linux in mind and with a custom distro tailored to it. i have had nothing but good experience with linux on the steam deck and on the raspberry pi. but it is a long way from being a viable windows replacement.

          3. >(eg photoshop, office), they really just need a web browser.

            Both of those are prime examples of why SaaS is a bad idea. Photoshop is gutted and overpriced, and Office on the browser is terrible to use and terribly slow. The DE integration is clunky and half the features don’t work right. 8 GB of memory becomes tiny very fast.

            What web apps are good for are replacing those tiny applications we used to have, like making a quick flow chart, or graphing a function, which doesn’t warrant a big software suite.

          4. >there are one or two windows apps they use

            The reason I use it is because for every task I have, I don’t have to dive in configuring the OPERATING SYSTEM itself, updating libraries and figuring out version incompatibilities and copy/pasting shell scripts. I just click setup.exe, or the function already exists somewhere in the GUI.

          5. > why do you think those hundred million win 7 users wont upgrade to win 10

            I use Win 7 on some machines, because the system is already set up and doing its job, and doesn’t need to change. For example, there’s an old laptop collecting data from some legacy hardware that would be difficult to set up for windows 10 because of the lack of driver support. A lot of stuff like printers simply became obsolete with Win10, because OEMs took the opportunity to obsolete them.

          6. And to the question “Why not just use the printer under Linux then?” – answer: because the Linux driver sucks and lacks functions like setting up borderless printing, different paper options, color profiles… There’s the common argument that linux supports more legacy hardware, but in reality the support is bad and doesn’t serve the point, and nobody’s going to update drivers and supporting software for hardware that is no longer sold.

          7. “You might have been right 10 years ago but so many people use web apps now (eg photoshop, office), they really just need a web browser.”

            That’s such a cliché.
            Please excuse my directness, but you obviously never had to play admin for family and friends.
            People aren’t simple, they’re pure stress. They want things to work” their way”, not yours. No matter how well-minded your intentions are. 😔

        2. You slightly off base there. The last few years you just load Linux and ‘forget’. It just runs. No ‘hours to weeks’ configuring — that era is ‘gone’ (unless you go with say Linux from Scratch).
          The first part of your statement is right on. I loaded Linux over Windoze on my dad’s new laptop and he is perfectly satisfied (non computer person)…. And I never have to touch it again. Just runs on an LTS until upgrade time. I really don’t get why Linux is not more popular. You have choices for DEs, choices for the software you run, and very stable. Just runs.

          1. that really depends highly on what you are running on and what you are doing with it. sometimes it works out of the box and sometimes it doesn’t.

          2. “You slightly off base there. The last few years you just load Linux and ‘forget’. It just runs. ”

            I know that you meant someone else, but I have to make a comment here.

            While it may true that Linux runs, once it runs, there’s a catch:

            Upgrading your distribution to a recent, higher version.

            It still does not work properly on Linux.
            It often involves a complete re-installation of Linux. Not cool.

            That’s why my family and me sometimes call Linux sarcastically “Kaputtus”, a play on kaputt (broken) and OS.

            Another one is “Gehtnix” (geht=walks, works and nix=nothing, *nix). 😁

          3. “Upgrading your distribution to a recent, higher version.

            It still does not work properly on Linux.
            It often involves a complete re-installation of Linux. Not cool. ”

            I personally have had very good luck with upgrading (last 4 years?). Pleasantly surprised. At least Fedora and (K)Ubuntu. I use KUbuntu LTS on all my desktops/servers/Laptops. Again just works.

        3. You forgot type three. Real men who grew up with assembler and CP/M!
          Those who had operated an IMSAI 8080 or Altair 8800.

          A spin-off of these guys later did x86 magic on DOS for years to come.
          They knew all the software interrupts and hardware i/o ports inside out.

          These were real men. Hah!
          Not script kiddies or these *nix gurus with their pseudo intellectual babbling about permissions and case-sensitiveness. 😝

          1. You forgot the REALLY REALLY REAL men (and women) who grew up, had kids raised them with a passion to create that which does not yet exist, and then watched as their adult children wrote the first generation of assemblers and operating systems.

        4. @Dude: I absolutely HATE to have to tinker with my computers and want them to run for as long as they can. I can truly say that I have had way less problems setting up, using and upgrading my Linux systems than the Windows systems I have been forced to use for work.

          I have run a Linux-only home now for the better part of ten years now, if not more. I have been doing a bit of distro-hopping for some years as the different distros began to disappoint me. I started off with Slackware (on the side, still using mostly Windows) in 1993, I believe, dropped that because it was difficult to keep up to date.

          Then I tried RedHat until I had to do a complete reinstall because they chose to change the RPM format and an upgrade just did not work.

          After that I changed to Ubuntu, then Debian, which I was quite happy with for a long while until Lennart Poettering suddenly hijacked the whole init-thing (and much, much more) with systemd. It gave me trouble no end, so I tried a number of systemd-free alternatives (including Devuan) until I at last found PCLinuxOS, which is a niche distro with an almost cult-like following. It has stood me well and has worked flawlessly on four generations of laptops, with a few setup problems on my current Acer Nitro 5.

          @Jushua: The PCLinuxOS distro has changed tack from releases to running updates, but I have not once had an update or upgrade fail in all the years I have used this distro, so it’s definitely not Kaputtus or Gehtnix!

          I still have a Windows machine for work and it is a rare week where I don’t have to reboot it (or a reboot is forced upon me) whereas the Linux machine I write on hasn’t been rebooted out of necessity for months, only because I have been abroad and turned it off.

      3. > They will just force more people to linux.

        A few but not many. I’ve used Linux exclusively for decades and I recognize most of the barriers that exist are mostly convenience based meaning not being Windows is literally the problem.

        Selling PCs with Linux pre-installed is really the only way you’re going to get most people with switch.

        1. Just pre-loading Linux doesn’t solve most of the problems though, because the main issue is not having sane defaults, too much variety and differences between system to system, and lack of convenient tools to access functionality, forcing people to poke at the low-level stuff to get things done.

        2. “A few but not many. I’ve used Linux exclusively for decades and [..]”

          Me, too. Linux platform is far from being bug free or rational.
          To name a nasty example, Raspbian’s PCManFM is highly unstable and loves to crash or hang if more than operation is being performed. :D

    2. Is windows on arm not dead yet ? It should be.. its a total waste of money… there are already low power x64 cpus and they will improve.. Microsoft should divert the money into designing:
      1. A handheld gaming unit
      2. A surface phone.. both using amd or intel x64 processors.
      These are what people have been waiting for !

    1. “For code-bases that still have source.”

      For code-bases that still have source in ubiquitous C++.

      Anything else has to bite the dust, as usual.

      Projects using source for VB Classic, Fortran, Delphi, Real Basic and other relevant, but non-mainstream languages can’t simply press a compile button and be done.

      That’s just unrealistic, just like most assumptions that Microsoft has made in past years.

      The whole Metro UI story is a prime example for Microsoft being delusional. IMHO.

      Also, no one wanted .NET Framework. That bloated mess. It was slow, unflexible and mostly was built upon old Win32, anyway.

      Same goes for current Visual Studio. It’s a resource hog, bloated and ugly.
      Visual Studio 6 on Windows 2000 used to somewhat clean and well structured, by comparison. *sigh*

      1. I am as I type running a win2000 vm with vb6 app I am converting to .NET. VB6 as much as is easy to work in is a dangerous app in today’s environment. I actually removed the default gateway so it could get any ware off my local network.

        From time to time it is necessary to move on.

        1. “From time to time it is necessary to move on.”

          But not necessarily to .Net platform.

          VB .Net took away all those things that Basic fans and professionals loved.

          It’s about the syntax, not just the VB6 IDE as such and any kind of nostalgia.

          VB .NET syntax really is C++ being shoehorned into a pseudo-Basic dialect.

          It has the same cumbersome way of handling things.

          The concepts are also different.
          VB Classic used object-oriented programming, but also allowed procedural programming.

          VB .Net totally depends on object-based programming, which was a failure, a false decision.

          Object-oriented programming is fine, if it’s an option.
          Making things object-based, though, is foolish.

          Let’s think about it for a moment, and be grateful for the old days of Turbo Pascal and Quick Basic. 🙇

  2. The problem is that Windows burdens itself with backwards compatibility. Apple recognize how limiting this is and consequently sunset backwards compatibility after a much smaller time.

    1. Depends. Windows 95 RTM was 40MB in size and contained all major Win32 APIs still in use. It also had supported Win16 APIs, too, which are now gone.

      Blaming the Win32 legacy for being a burden or hindranceoof profress is the same nonsense as blaming current CPUs for having 8086 compatibility.

      DLLs are dynamic link libraries. They’re being loaded if needed, otherwise they just sit there doing nothing.
      So it doesn’t matter much if Windows keeps backwards compatibility or not.

      Backwards compatibility in a future Windows release could be implemented WINE style, too, making it completely optional.

      In fact, it’s possible since the 2000s to use WINE on Windows NT line.
      CoLinux and AndLinux ran a small Linux kernal on Windows 2000/XP.
      Installing WINE on that was trivial, it worked just fine.

      Another workaround would be to use a wrapper/emulator like WineVDM/OTVDM.
      It uses WINE libs and can run Win16 applications on Windows x64.
      It has a CPU emulator built-in, I believe. Or was Win3mu?

    2. Apple is interesting insofar, because Mac OS/System for Power PC architecture included an Motorola 680×0 emulator.

      That was not only necessary to keep backwards compatibility for Mac applications, but also to make the OS itself function.

      The core of Mac OS, the Toolbox etc, still contained large parts of Motorola 68000 code.
      So the OS had the emulator deeply being integrated.

      It was towards the end of classic Mac OS that PPC code took over mostly.

      Nevertheless, there were things like FPU emulators being provided by third-parties.

      Generally speaking, Apple sometimes had bought external software in the 90s which it had later integrated into the OS.

      Like that 32-Bit address range compatibility fix (“mode32”) by Connectix.

      https://lowendmac.com/2015/32-bit-addressing-on-older-macs/

      Last but not least, there also was Carbon API.
      Unlike Cocoa, it was available to both Mac OS 8/9 and Mac OS X 10 (or in practice 10.1+).
      PPC Programs using Carbon could be run up to OS X 10.6 Snow Leopard (had optional Rosetta emulator).

    3. I see the problem is Windows is proprietary, only one style of DE, requires a M$ account (yes, you can work around that I heard, but), it auto updates, it forces reboots, costs money to upgrade,even force new hardware if you want to upgrade…. When I was running it, it was bleeding my pocket book too, whether upgrade or virus checkers, or software, or whatever…. All those things that made me to walk, no run from the Windows OS. I found I could easily live with out it… And yes, I started with CPM, DOS, and all the iterations of Windows up until Win 7 (last good Windows OS). Now I just deal with it at work :rolleyes: .

      Backwards compatibility is actually a good thing. If an application ran then, it will run now. I like that concept… And is one good reason people are stuck on M$ for desktops. Keeps a captive user base which M$ is good at. Oh and disk space is cheap, so fill that baby up with compatibility dlls! A little bloat never hurts — much…

      Bottom line, Linux is perfect fit for SBCs rather than trying to shoe-horn Windows into the embedded side of the world. And for me works well on servers and desktops too. Just down load your favorite Linux ISO and run. What’s not to like?

    4. Ironically, people have been complaining about Microsoft raising the bar for Windows 11, obsoleting old hardware in the process. Damned if they do, damned if they don’t. They can’t exactly go like Apple and say “right, no more x86_64 anymore” though. I can only see windows moving on from older compatibility if AMD and Intel essentially introduce new hardware instructions in future processors and MS explicitly pegging future Windows to need those to run.

  3. I truly wish linux was as great a desktop system as many say it is, I do, and if it works for you great,
    but it (the ones I’ve tried so far) not only doesn’t do what I want it to do, it also doesn’t “just run on anything”. I need a functional GUI because I don’t type well, never have and not for the lack of trying.
    I have periodically installed (or attempted) linux for over 25 years. It went from people on line saying “well if you need instructions to install it you are too x@@@!! stupid to run it” signed, god of all computing, to “why would anyone want a GUI” to “look at the pretty (barely functional) desktop”. Even though the community has mellowed a bit, and the installation can be performed far easier than ever, you can install it and run it on a lot of equipment but invariably on the stuff i have available it doesn’t have a driver for networking (the worst) or something else. Could I go buy an adapter yes, but windows figured that out by win 98 at least. Oh I can download a driver, fine, I’ll do it on another computer on a usb. Oh I have to compile that driver, rather than double click, fine, I guess… wait, gcc wasn’t installed? fine. What make not installed, Son of a… OK compiled! It works. Updates coming in yay. reboot….. no network? what the… I need DKMS if I want to keep a freaking driver after update (upgrade i guess that would be)? Ugh. But I selected US, why does my laptop have 500 foreign language fonts installed?

    Don’t get me wrong, I WAS a huge fan of MS (partner, techtalks, technet, etc.) but not after win 10 got shoved down my throat on my win 7 computers without even asking and certainly not after they changed their business model from selling licenses to selling users data, but I don’t think many linux users realize windows gui can replicate the action of almost every cli command, on desktop and servernot just a small subset. set up exchange server no prob, active directory no prob, split brained dns no prob, type in some addresses, masks and MX records done. Set up Hyper-V no prob, Set up a backup domain controller, a voip system, a sharepoint server and an axis camera server on a single beefy server in 2008, no problem, all through the GUI with only a few settings (not a recommended setup though but the guy I set it up for as a demo/test actually used it in production for about 7 years). Desktop same thing, no problem. Linux file managers especially are (so far) archaic, maybe a little better than 3.1 maybe more, I found one that said i could just install and it seemed promising, but on reboot the whole system crashed and I didnt know enough to save it if possible (and don’t really want to learn that right now)
    Are ther bad win updates, oh hell yes there were and will be, just don’t be the lab rat, wait for a few unless urgent. And MS SQL server will never be pleasant…

    Is Windows bloated? absolutely. Dependency hell, flatpack, snap, all = BLOAT, and the worst kind. Isn’t that like having to add a copy of every windows driver to every program installed on a desktop and maybe the programs can’t find the right one? Sure sounds similar.

    I have tried out Debian and Ubuntu (deb deriv I know), many ubuntu derivatives, red hat long ago, and still have several others like the BSD, ARCH, zorin, etc to try (suggestions welcome)

  4. You can do like wine for Linux

    Use a hypervisor that emulates the windows kernel and see api

    And dynamic recompiling of x86_64 to arm

    Problem is there are different ways on arm to do the complex cisc based instructions on x86 because you typically need multiple risc instructions to complete a typical cisc one

    Now if you can do that and in less clock cycles than it can be feasible

    Because cisc instructions usually can take several 10s of clocks cycles to finish

    If you can implement that same instruction in risc but use half the CPU cycles because risc instructions typically are pipelined and simple compared to cisc, risc CPU are usually the ones in a conventional sense that can load, execute, and output in a single clock, because loads operand and data, executes, then either modify again or write somewhere else, such risc instructions take little time, subroutines and conditionals take the most time, same with algebra and trigonometry since you have to make software routines if you don’t have a floating point and math co processor like a gpu

Leave a Reply

Please be kind and respectful to help make the comments section excellent. (Comment Policy)

This site uses Akismet to reduce spam. Learn how your comment data is processed.