문제 상황
aws-crt같은 native nodejs module 설치 시nodejs native module 설치 시 /opt/homebrew/opt/llvm/bin/objcopy: error: unsupported load command (cmd=0x80000034)에러 발생yarn add aws-crt실행 결과
환경
- m1 용 homebrew 사용
$ brew --prefix /opt/homebrew - m1 용 llvm 설치됨
$ which clang /opt/homebrew/opt/llvm/bin/clang $ file /opt/homebrew/opt/llvm/bin/clang /opt/homebrew/opt/llvm/bin/clang: Mach-O 64-bit executable arm64 - arm64 용 nodejs v16.14.0 사용
$ which node /Users/homejh/.nvm_arm/versions/node/v16.14.0/bin/node $ file /Users/homejh/.nvm_arm/versions/node/v16.14.0/bin/node /Users/homejh/.nvm_arm/versions/node/v16.14.0/bin/node: Mach-O 64-bit executable arm64
해결 방법
- 문제 원인이 되는 objcopy 를 없앤다
$ mv "$(brew --prefix)/opt/llvm/bin/objcopy" "$(brew --prefix)/opt/llvm/bin/objcopy.backup"
해결 과정
- 빌드시
node_modules/aws-crt/build/아래에 cmake 를 활용해 빌드 파일이 생성됨 -> 실패 $ cd node_modules/aws-crt/build/ && grep "objcopy" -ir .로 objcopy 명령어 찾기node_modules/aws-crt/build/CMakeFiles/aws-crt-nodejs.dir/build.make파일에서 objcopy 명령어를 사용하는 부분이 두 군데 등장- objcopy 를 사용하는 빌드 명령어에 사용 불가능한 옵션(
--add-gnu-debuglink)이 있는 것을 확인 (mac 용 objcopy 에는 없는 것으로 보임)
- objcopy 를 사용하는 빌드 명령어에 사용 불가능한 옵션(
node_modules디렉터리를 지운 후 x86 nodejs 로 다시 해당 모듈 설치 시 별 문제 없이 빌드되는것을 확인- x86 용 brew 로 설치한 llvm 의 bin 디렉터리(
"$(brew --prefix)/opt/llvm/bin/")엔 objcopy 가 없는 것 확인- arm brew 로 설치한 llvm 과 x86으로 설치한 llvm 의 bin 디렉터리 구성이 다르다!
- cmake 로 빌드 파일 생성시 objcopy 명령어가 시스템에 존재하는지 여부에 상관 없이 빌드가 가능하도록 구현되어 있을 것으로 추정
- objcopy 명령어의 이름을 바꾸고 native module 설치(빌드) 시도해보니 성공!