On this M3 Pro with macOS 26 I have firefox@beta installed from Homebrew. Firefox supports different browser profiles and when starting it from the command line of Terminal.app it goes like this:
$ /Applications/Firefox.app/Contents/MacOS/firefox -P work
This works well but I want this to be an application that I can put into the dock, with a nice icon maybe too. I did that the following way:
$ cd
$ find Applications/Firefox_WORK.app/ -type f
Applications/Firefox_WORK.app/Contents/MacOS/Firefox_WORK
Applications/Firefox_WORK.app/Icon
$ cat Applications/Firefox_WORK.app/Contents/MacOS/Firefox_WORK
#!/bin/sh
FIREFOX="/Applications/Firefox Nightly.app/Contents/MacOS/firefox"
FIREFOX="/Applications/Firefox.app/Contents/MacOS/firefox"
"${FIREFOX}" -P work
And this works. The application bundle has a nice icon and I can start it from my dock. But recently that dreaded Support ending for Intel-based Apps warning started showing up and I’m scratching my head why macOS thinks Firefox is running under Rosetta, as a x86 application. See below for a screenshot.
But I don’t understand why it thinks that. When started, the processes show as follows in the process list:
$ pstree -s firefox | cut -c-120
-+= 00001 root /sbin/launchd
\-+= 44329 christian /bin/sh /Users/christian/Applications/Firefox_WORK.app/Contents/MacOS/Firefox_WORK
\-+- 44330 christian /Applications/Firefox.app/Contents/MacOS/firefox -P work
|--- 44333 christian /Applications/Firefox.app/Contents/MacOS/gpu-helper.app/Contents/MacOS/Firefox GPU Helper
|--- 44335 christian /Applications/Firefox.app/Contents/MacOS/plugin-container.app/Contents/MacOS/plugin-container
[...]
But Firefox really is a Mach-O universal binary for x86_64 and arm64, as are so many applications:
$ file -Ls /Applications/Firefox.app/Contents/MacOS/firefox
/Applications/Firefox.app/Contents/MacOS/firefox: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64:Mach-O 64-bit executable arm64]
/Applications/Firefox.app/Contents/MacOS/firefox (for architecture x86_64): Mach-O 64-bit executable x86_64
/Applications/Firefox.app/Contents/MacOS/firefox (for architecture arm64): Mach-O 64-bit executable arm64
And, listing open libraries of the main Firefox process, these libraries also serve two architectures:
$ for f in $(sudo lsof -lnP -p 44330 | awk '/lib$/ {print $NF}' | sort -u); do file -Ls "${f}"; echo; done
/Applications/Firefox.app/Contents/MacOS/libfreebl3.dylib: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit dynamically linked shared library x86_64] [arm64]
/Applications/Firefox.app/Contents/MacOS/libfreebl3.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64
/Applications/Firefox.app/Contents/MacOS/libfreebl3.dylib (for architecture arm64): Mach-O 64-bit dynamically linked shared library arm64
/Applications/Firefox.app/Contents/MacOS/libgkcodecs.dylib: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit dynamically linked shared library x86_64] [arm64]
/Applications/Firefox.app/Contents/MacOS/libgkcodecs.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64
/Applications/Firefox.app/Contents/MacOS/libgkcodecs.dylib (for architecture arm64): Mach-O 64-bit dynamically linked shared library arm64
[...]
So why does Activity Monitor think that Firefox is an Intel process? And why does Firefox itself thinks the same? IOW, what changed when running Firefox as an application bundle?


