`binutils` causes undefined symbol link errors when installing erlang on Mac

I have been annoyed by the following error in installing Erlang with asdf on Mac.

LD  /Users/xxxx/.asdf/plugins/erlang/kerl-home/builds/asdf_26.0/otp_src_26.0/lib/erl_interface/bin/x86_64-apple-darwin22.4.0/erl_call
 ld: warning: ignoring file /Users/xxxxxx/.asdf/plugins/erlang/kerl-home/builds/asdf_26.0/otp_src_26.0/lib/erl_interface/obj/x86_64-apple-darwin22.4.0/libei.a, building for macOS-x86_64 but attempting to link with file built for macOS-x86_64
 Undefined symbols for architecture x86_64:
   "___erl_errno_place", referenced from:
         _main in erl_call-456a49.o
   "_ei_connect", referenced from:
         _main in erl_call-456a49.o

Then I resolved this issue, and would like you to know about it.

The issue says that Linker(LD) can’t read libei.a archive file which is made by ar and ranlib. At last symbols in libei.a can’t be found to make an error of “undefined symbols.”
When I checked ar and ranlib, there are two sets on my Mac.

$ which -a ar

So I found binutils/bin/ar, ranlib causes this issue because archives by binutils is different from one by /usr/bin/ar, ranlib.

On uninstalling binutils, it worked without any errors.

I don’t know if we need the binutils of Gnu. But I think it shouldn’t be installed on Mac.
As binutils is used to build cross-compilers themself, it is necessary to note this.

Additionally, I am using asdf to install Erlang instead of brew. the asdf builds Erlang by Makefile, but the brew seems only to get the object for Mac. So Installing with the brew works fine.

1 Like