I have an ARM Mac and whilst trying to run
hello-world locally, I get an error:
ld: warning: no platform load command found in '/Users/erik/solutions/x86-64-assembly/hello-world/hello_world.o', assuming: macOS
ld: fatal warning(s) induced error (-fatal_warnings)
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [tests] Error 1
I’ve followed the steps listed in the docs: Installing x86-64 Assembly locally | Exercism's Docs
I could easily be wrong but I didnt imagine an ARM64 mac could run x86-64??
I’m thinking I’ll try working with a docker container when it’s November rolls around instead?
Yeah I was double-checking. It might be nicer to fail explicitly from within the Makefile with a nice error message.
M1/2 support compiling and running x86_64 code natively, and the exercism Makefile addresses it (see the
arm64 check at line 8). The problem you’re facing is related to the linker changes in Ventura+. The simplest workaround is to switch to the old linker for the time being, by adding
ALL_LDFLAGS (on line 11 as of now).
Some explanation: the linker now requires the load command
LC_BUILD_VERSION to be present in the object file, which specifies target (macOS, iOS, etc) and version. NASM currently doesn’t support it, there was a patch for it, but it’s not in the upstream.
this is what I get with added suggested flags when trying to compile leap exercise
make clean && make
rm -f *.o vendor/*.o tests
cc -target x86_64-apple-darwin -std=c99 -fPIE -m64 -g -Wall -Wextra -pedantic -Werror -c -o leap_test.o leap_test.c
nasm -f macho64 --prefix _ -g -F dwarf -Werror -o leap.o leap.asm
cc -target x86_64-apple-darwin -std=c99 -fPIE -m64 -g -Wall -Wextra -pedantic -Werror -c -o vendor/unity.o vendor/unity.c
cc -target x86_64-apple-darwin -std=c99 -fPIE -m64 -g -Wall -Wextra -pedantic -Werror -Wl,-pie -Wl,-fatal_warnings -Wl,-ld_classic -o tests leap_test.o leap.o vendor/unity.o
make: ./tests: Bad CPU type in executable
make: *** [all] Error 1
Compilation exited abnormally with code 2 at Sun Nov 5 21:36:19
I have M2 with Sonoma 14.0
I was able to execute tests by right clicking the terminal in Application/Utilities, clicking get info then on general section checking the option
open using Rosetta.
The first time using rosetta will pop up a window to install it.
Apparently this rosetta will run the app in compatibility mode, if you open the terminal and type arch the command should return i386.
at the end of execution it is happening a segfault, but tests are finished by that point.
@RedJocker yes, you need to have Rosetta 2 installed in order to run x86_64 binaries. After you install it, it should work seamlessly (maybe login/logout or reboot just to be sure).
It’s strange that you have a segfault, maybe there is an issue with your implementation? Does it happen with
Also, it might be worth trying replacing the line above (with
-target) too. On my machine I apply the following patch after pulling in an exercise:
diff -uU0 old/Makefile new/Makefile
--- old/Makefile 2023-11-12 12:31:12
+++ new/Makefile 2023-11-12 12:31:04
@@ -9 +9 @@
- ALL_CFLAGS = -target x86_64-apple-darwin
+ ALL_CFLAGS = -arch x86_64
@@ -11 +11 @@
- ALL_LDFLAGS = -Wl,-pie -Wl,-fatal_warnings
+ ALL_LDFLAGS = -Wl,-pie -Wl,-fatal_warnings -Wl,-ld_classic