dosdude1, Homebrew, Node (and lot of other applications) throwing illegal hardware instruction on patched Catalina (installed on incompatible machine)

Yesterday I decided to give a try in making my old 7.1 MacBook Pro second chance by upgrading macOS to Catalina with IS NOT supported by Apple.

There is a reason why they want drop support for older architecture but You can squeeze last breath if You can allow for sacrifice in stability or compatibility. Upfront I can say that iMovie crash and I was unable to resolve that issue, other applications used for basic web-dev (phpstorm, mysql, nginx, npm) looks and feel working good but still I would not recommend it for profesional work when disruption in workflow cause money or data loss – for any non critical applications, reading email, watching YT it’s worth of trying.

First step is to upgrade patched macOS dosdude1

When You got Your system set up, and try to execute applications installed with Homebrew (in my case it was node) I got this error:

illegal hardware instruction

After investigation, I was able to locate problem. Applications distributed in Homebrew as bottle are compiled for specified architecture. Authors of Homebrew have valid reason to assume that this compiled software is going to be executed on compatible hardware in correlation with macOS version. There is no change of having C2D CPU in Catalina, here is why compiled code is targeted for newer CPU.

Lucky Homebrew have ability for self compiling any packages, but that operation have exactly same (error) outcome as when installing compiled bottle.

answer to this problem, is in telling Homebrew to set target architecture for older CPU-s.

You can edit this file:

nano /usr/local/Homebrew/Library/Homebrew/extend/os/mac/hardware.rb

and change it’s content to

frozen_string_literal: true
module Hardware
def self.oldest_cpu(version = MacOS.version)
if version >= :mojave
:core2
else
generic_oldest_cpu
end
end
end

Notice edited architecture, when OS is greater or equal to Mojave

After that change we can recompile from source our not working applications by using following command.

brew reinstall -s python

-s stands from source

When trying recompile node, I still got error. After more investigation i found out that Node depend on another packages, that are already installed but not recompiled with new directive. Dirty solution i found is to see what node depend on:

brew info npm

and from following code, read dependencies section to recompile all dependent packages with -s

brew reinstall -s pkg-config
brew reinstall -s icu4c
brew reinstall -s python

After that, we can reinstall node

brew reinstall -s npm

After this operation, node works perfect. You can follow same schematic for any other applications that can be found in Homebrew.

Leave a Reply

Your email address will not be published. Required fields are marked *