MacOS용 휴대용 바이너리 만들기

바이너리를 가져와서 배포(서명되지 않음)를 위해 준비한다고 가정해 보겠습니다. 다음은 psql의 예를 사용하여 이식 가능하게 만드는 방법입니다.

실행 파일 복사



# cp /Applications/Postgres.app/Contents/Versions/latest/bin/psql .

연결된 라이브러리 확인



# otool -L psql
psql:
/Applications/Postgres.app/Contents/Versions/13/lib/libpq.5.dylib (compatibility version 5.0.0, current version 5.13.0)
/usr/lib/libedit.3.dylib (compatibility version 2.0.0, current version 3.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.0.0)

psql이 libpq.5.dylib에 종속되어 있음을 알 수 있습니다.

필요한 dylib 복사



# cp /Applications/Postgres.app/Contents/Versions/latest/lib/libpq.5.13.dylib .

libpq.5.13.dylib의 종속성 확인



# otool -L libpq.5.13.dylib
libpq.5.13.dylib:
/Applications/Postgres.app/Contents/Versions/13/lib/libpq.5.dylib (compatibility version 5.0.0, current version 5.13.0)
/Applications/Postgres.app/Contents/Versions/13/lib/libssl.1.1.dylib (compatibility version 1.1.0, current version 1.1.0)
/Applications/Postgres.app/Contents/Versions/13/lib/libcrypto.1.1.dylib (compatibility version 1.1.0, current version 1.1.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.0.0)

libssl.1.1.dylib , libcrypto.1.1.dylib 및 해당 종속성(있는 경우) 복사



# ls
libcrypto.1.1.dylib
libssl.1.1.dylib
libpq.5.13.dylib
psql

@loader_path/... 로 종속성 경로를 변경하려면 install_name_tool을 사용하십시오.



@loader_path에 대한 자세한 내용

install_name_tool -change /Applications/Postgres.app/Contents/Versions/13/lib/libssl.1.1.dylib @loader_path/libssl.1.1.dylib ./libpq.5.13.dylib

install_name_tool -change /Applications/Postgres.app/Contents/Versions/13/lib/libcrypto.1.1.dylib @loader_path/libcrypto.1.1.dylib ./libpq.5.13.dylib

install_name_tool -change /Applications/Postgres.app/Contents/Versions/13/lib/libcrypto.1.1.dylib @loader_path/libcrypto.1.1.dylib ./libssl.1.1.dylib

install_name_tool -change /Applications/Postgres.app/Contents/Versions/13/lib/libpq.5.dylib @loader_path/libpq.5.13.dylib ./psql

psql 실행 시도



이것을 Macos Catalina에서 실행하면 시스템에 의해 종료됩니다.

# ./psql
[1]    2490 killed     ./psql

해당 바이너리가 서명되었지만 수정되어 서명 확인이 실패하기 시작했기 때문에 발생합니다.

코드 서명을 제거합시다



codesign --remove-signature *

바이너리가 서명되지 않은 경우 검역 플래그를 제거해야 할 수 있습니다.

xattr -d com.apple.quarantine *

다시 시도하십시오



# ./psql
psql (13.0, server 10.14)
Type "help" for help.
myname=#

작동합니다 👏


Postbird.app에서 이 기술을 사용합니다. - PostgreSQL용 무료 크로스 플랫폼 데스크톱 클라이언트

좋은 웹페이지 즐겨찾기