
나는 참석했다프레젠테이션UCL 교수의 스펙터(Spectre)와 멜트다운(Meltdown)에 대해. 그는 High Sierra로 업그레이드하고 --mretpoline 스위치(LLVM 및 GCC에 이미 배포됨)를 사용하여 소스에서 모든 소프트웨어를 설치하여 Spectre 2(Branch Target Insertion)를 완화하는 여러 가지 방법을 제안했습니다. 이런 식으로 macOS High Sierra에 R과 RStudio를 설치하고 싶습니다. 두 가지 소스를 모두 다운로드했습니다. 설치 절차는 R 및 RStudio와 유사합니다. R에 대한 INSTALL 파일은 내가 실행해야 한다고 말합니다.
./configure
make
나는 "configure" 파일과 makefile(Makeconf.in, Makefile.in, Makefile.in)을 검사했습니다. 스위치를 추가하는 확실한 방법은 없었습니다. 나는 스위치를 추가하는 방법에 대해서는 언급하지 않은 make에 대한 도움말을 호출했습니다.
나는 이것을 온라인에서 검색했고 내가 찾을 수 있는 가장 가까운 것은 리트폴린과 스펙터 2에 대한 설명이었습니다.
make를 사용하여 소스에서 소프트웨어를 컴파일하고 --mretpoline 스위치를 포함하려면 어떻게 해야 합니까?
답변1
짧은 버전llvm
: 많은 조사 끝에 and -mretpoline
플래그 또는 gcc
and 플래그를 사용하여 소스에서 MacOS에 소프트웨어를 설치할 수 없었습니다 -mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register
. 이는 에 비해 더 일반적이고 R
구체적인 것 같아서 MacOS
이에 따라 제목을 변경했습니다. 2018년 4월 27일 현재 Mac에서는 이 작업을 수행할 수 없는 것 같습니다. 저는 macOS High Sierra 버전 10.13.3(17D102)을 실행하고 있습니다.
긴 버전: 다음은 R 이전에 설치하기로 결정한 GnuPG에 적용됩니다. (R에는 gfortran이 필요하고, gcc가 필요하고,MPFR, 확인하고 싶은 GPG 서명과 함께 제공됩니다). 나는 따라 갔다Git에서 GPG를 설치하는 단계.
최신 LLVM(Homebrew 포함)
Apple의 LLVM이 실패하므로(아래 참조) LLVM clang 6을 사용하여 이 문제를 해결하고 homebrew로 설치했습니다(특정 플래그를 사용하여 소스에서 컴파일하려는 목적을 약간 무너뜨렸지만 시간이 부족했습니다). 다음을 사용하여 홈브류를 설치했습니다.
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
그런 다음 두 번 업데이트했습니다.
brew update
Homebrew로 clang을 설치하려면 XCode가 필요하므로 App Store에서 이를 설치했습니다. 그런 다음 다음 단계를 따랐습니다.이 페이지:
brew install --with-toolchain llvm
-mretpoline
그런 다음 둘 다에 플래그를 추가하고 , 및 컴파일러 C
모두에 경로를 추가하고 GPG에서 쉘 스크립트를 호출했습니다.C
C++
export CFLAGS='-mretpoline'
export CC=/usr/local/opt/llvm/bin/clang
export CXX=/usr/local/opt/llvm/bin/clang++
./autogen.sh
./configure --sysconfdir=/etc --enable-maintainer-mode && make
이 오류가 발생했습니다.
checking whether the C compiler works... no
로그 파일에 config.log
자세한 내용이 나와 있습니다.
configure:4049: /usr/local/opt/llvm/bin/clang -mretpoline conftest.c >&5
fatal error: error in backend: MachO doesn't support COMDATs, '__llvm_retpoline_r11' cannot be lowered.
clang-6.0: error: clang frontend command failed with exit code 70 (use -v to see invocation)
이 스레드하단에 Mac이 아직 다음을 지원하지 않는다는 2018년 1월의 의견이 있습니다 -mretpoline
.
samkellett: @chandlerc는 MacOS 지원이 의도적으로 생략된 것인가요(즉, 아직 구현되지 않았나요)? chandlerc: 전혀요. 테스트할 Mac 시스템이 없어요...
그 이후로는 아무런 반응이 없습니다. 따라서 LLVM 설치에 실패했습니다.
GCC(홈브루 포함)
gcc
또 다른 대안은 LLVM 대신 에 컴파일하는 것이었습니다 . 최신 버전의 clang (6.0)을 설치했습니다.
brew install gcc
그리고 나는 gcc
다음에서 플래그를 추가했습니다.이 페이지LLVM과 다릅니다. 이 bash 스크립트는 C
및 둘 다에 플래그를 추가하고 C++
두 컴파일러에 대한 경로를 제공하며 GPG에서 쉘 스크립트를 호출합니다.
export CFLAGS='-mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register'
export CXXFLAGS=$CFLAGS
export CC=/usr/local/opt/gcc/bin/gcc-7
export CXX=/usr/local/opt/gcc/bin/g++-7
./autogen.sh
./configure --sysconfdir=/etc --enable-maintainer-mode && make
그리고 다시 오류가 발생합니다.
checking whether the C compiler works... no
로그 파일에 config.log
자세한 내용이 나와 있습니다.
configure:4027: checking whether the C compiler works
configure:4049: /usr/local/opt/gcc/bin/gcc-7 -mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register conftest.c >&5
Undefined symbols for architecture x86_64:
"__x86_return_thunk", referenced from:
_main in ccZuBhFQ.o
(maybe you meant: ___x86_return_thunk)
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
configure:4053: $? = 1
configure:4091: result: no
컴파일러가 밑줄이 추가된 유사한 이름을 알고 있다는 것이 이상합니다.
그래서 gcc
역시 실패했습니다. 그리고 지금 나는 헤매고 있습니다.
부록: Apple의 LLVM
다음 bash 스크립트는 플래그를 내보내고 make
GnuPG에서 쉘 스크립트를 호출합니다.
export CFLAGS='-mretpoline'
export CXXFLAGS=$CFLAGS
echo $CFLAGS
echo $CXXFLAGS
./autogen.sh
./configure --sysconfdir=/etc --enable-maintainer-mode && make
Apple에서 제공하는 컴파일러에서는 실패하지만 플래그가 컴파일러를 통과하고 있음을 보여줍니다.
configure:4045: gcc -mretpoline -mindirect-branch=thunk -mfunction-return=thunk -mindirect-branch-register conftest.c >&5
clang: error: unknown argument: '-mretpoline'
따라서 @seth의 의견은 플래그를 컴파일러에 보내는 방법에 맞습니다.