Starting Firefox as an app bundle makes it report as an Intel application

0
1
Starting Firefox as an app bundle makes it report as an Intel application


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?

Starting Firefox as an app bundle makes it report as an Intel application

Firefox warning