COFF on Linux or ELF on Windows

17,603

Solution 1

To actually run executables and have them do useful stuff, you need to worry about the API, not just the executable file format. On a Linux machine with WINE installed, you can run Windows .EXE files from the command line and they do the same thing that they do on Windows.

The other way around is not really possible, however if you install CYGWIN on a Windows machine, and then rebuild the application from source with CYGWIN compilers, you will get an executable that runs on Windows and does the same thing that the Linux executable does on Linux. Lots of standard Linux tools are already ported and in the CYGWIN repository including stuff like X-Windows and GIMP.

Solution 2

To answer your question properly, it is relevant to review what ELF, COFF, and PE are. These binary formats are essentially just containers that give directions to the operating system about how to execute the raw CPU instructions contained in the file. They are very much like audio/video containers like MKV, WMV, and OGG. Support for the executable format is either in the operating system or not. Microsoft Windows has consistently not given any support for COFF or ELF, until recently. With Windows 10, Microsoft has provided indirect support for ELF by building into the Windows kernel UserMode-Linux compatible system routines. A UserMode Linux kernel runs on top of the Windows kernel and runs all ELF binary formats almost as if it were running independent of MS Windows.

The alternative to using the UserMode-Linux (sub-kernel) being for Microsoft to rewrite the majority of the Linux API in a completely compatible format, their choice solves one other compatibility issue: The API. "A" stands for Application and "I" for Interface, however the API as an interface is mainly just a set of executable routines and environment assumptions. Access to the filesystem and most basic system routines is provided by the Windows kernel, while everything else is provided in the UserMode Linux kernel. This way not only can Windows run ELF formatted executables, but in can run the most popular ELF executables that are already made to run on the Linux API.

The reverse, the other half of the question, running PE (most Microsoft Windows executables) on Linux is possible as well. There are two runtime wrapping libraries that can run MSIL (virtual machine application) and Win32 (normal CPU application). Because the Linux kernel is extendable to recognize a certain byte format, then run an appropriate wrapper program, in effect the kernel supports PE and potentially more executable container formats. Therefore, Linux can run some PE programs either in the mono runtime (.NET/C# applications) or in the WINE runtime (Win32 C/C++).

To install the UserMode-Linux environment you can follow instructions provided on Microsoft's Development Network. To summarize:

  1. Turn on Developer Mode: Settings | Update & Security | For Developers | Check the Developer Mode radio button
  2. From the start menu, open “Turn Windows Features on or off”
  3. Scroll down and check the “Windows Subsystem for Linux (Beta)” feature
  4. Hit okay and reboot (required step)
  5. Once rebooted, open a PowerShell/command prompt and run “Bash” and follow the simple prompts to accept Canonical’s license and kick-off the download of the Ubuntu image
  6. After download has completed, you’ll be able to start “Bash on Ubuntu on Windows” from the Start menu

Be aware this method only works on Windows 10 and is still limited to text-mode console and a Win32 port of Xorg like vcXsrv for anything graphical. Cygwin or MSYS2 systems are not able to run ELF binaries, but make it possible to port and run the same applications that are normally ELF binaries on a Linux system.

Solution 3

http://lbw.sourceforge.net/ works better than line. low was another project for doing the same thing, but that was the less working.

EDIT: http://atratus.org/ seems to do the same as well, without the need to have Interix/SFU.

Solution 4

COFF was originally introduced by UNIX (around System V or thereabouts) so yes, some UNIX probably still supports COFF format. It's been deprecated by Linux at least for a while, and presumably most other Unices have also deprecated or outright dropped support.

Windows ELF support is a bit more iffy - almost certainly not there without some deep trickery. You should be more specific about what you're trying to do here...

Share:
17,603
PJT
Author by

PJT

The good life is the middle way between ambition and compassion between action and reflection between company and solitude between hedonism and abstinence between passion and judgement between the cup of coffee and the glass of wine. [Jay McInerney]

Updated on July 26, 2022

Comments

  • PJT
    PJT almost 2 years

    Is it possible to run the COFF executable files on UNIX or the ELF executable files on Windows? And what would be the steps to be able to run either file type on Windows and UNIX. I'm just curious.

  • ephemient
    ephemient over 14 years
    sf.net/projects/line did manage to load ELF executables on Windows -- that may be a good starting point for somebody motivated.
  • ephemient
    ephemient over 14 years
    As I commented on in another answer, sf.net/projects/line attempted to be the inverse of WINE, running unmodified Linux binaries on Windows. The project has been abandoned for years now, but it definitely shows that the concept is possible. If I recall correctly, it could run a few statically-linked console programs, and IPC was in the works.
  • Micah W
    Micah W over 6 years
    I should have answered the other half of the question. There are various means to run PE (windows executable) on Linux, because the Linux kernel is extendable to recognize a certain byte format, then run an appropriate wrapper program. Therefore, Linux can run some PE programs either in the mono runtime (.NET/C# applications) or in the WINE runtime (Win32 C/C++).