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
Any thoughts?
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.
1 Like
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 -Wl,-ld_classic
to 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.
3 Likes
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
./tests
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 hello-world
?
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
1 Like